7

Ho problemi a collegare due dispositivi Android tramite Bluetooth, che si verificano solo quando sono stati abbinati in precedenza. Ne sto eseguendo uno come server e l'altro come client.Android Bluetooth accept()/connect() con dispositivi già accoppiati

Ecco la sequenza di cose sul lato server:

  1. controllare vari stati Bluetooth (adattatore disponibile, è abilitata, ecc).
  2. call listenUsingRfcommWithServiceRecord() con un UUID predefinito che ho scelto.
  3. richiesta di rendere rilevabile il dispositivo
  4. da quando è rilevabile avviene in modo asincrono, chiamo accept() e attendo una connessione in ingresso.

Sul lato client:

  1. Controlla i vari stati Bluetooth (adattatore disponibile, è abilitata, ecc).
  2. per ogni dispositivo in getBondedDevices(), confronto getName() con il nome del server. Se c'è una corrispondenza, passare al punto 6. scoperta
  3. Inizio BT
  4. Per ogni dispositivo rilevato (nota che abbinato dispositivi da 2 bis non si presentano qui), confrontare il nome del dispositivo con il nome del server. Se c'è una corrispondenza, passare al punto 6.
  5. Annulla scoperta
  6. Sul dispositivo che è stato trovato dal punto 2, chiamare createRfcommSocketToServiceRecord() con lo stesso UUID predefinito che è stato utilizzato sul lato server.
  7. Chiama connect() e attendi che ritorni un socket collegato.

Il processo sopra riportato funziona perfettamente per me quando il client e il server non sono mai stati abbinati in precedenza. Tuttavia, dopo che Android li ha registrati nell'elenco dei dispositivi, scadranno inevitabilmente nella fase connect()/accept().

Sono stato alla ricerca di una soluzione per un paio di giorni e ho provato un paio di cose abbastanza compreso questo: Connecting to a already paired Bluetooth device

metodo La riflessione non funziona per me. Sembra che connect() restituisca immediatamente ma quando ho provato a getOutputStream() ottengo un'eccezione. Sul lato accept() non registra nemmeno che qualcuno ha provato a connettersi. Ho seriamente bisogno di aiuto o puntatore per far sì che i dispositivi stabiliscano una connessione una volta che sono stati abbinati in precedenza.

Ecco alcune informazioni sui dispositivi:

  • sto testando il server e client su due telefoni LG G2X.
  • Entrambi funzionano su Android 2.3.3, che corrisponde al livello API 10.
  • Anche in questo caso, quanto sopra funziona dopo aver disaccoppiato manualmente i dispositivi nelle impostazioni.

Grazie in anticipo. Ho circa 2 settimane di vita in Android e Bluetooth, quindi se vedi passaggi mancanti o best practice, ti preghiamo di indicarli.

risposta

6

Nel client quando tento di stabilire una connessione con un dispositivo collegato, l'ho semplicemente chiamato sul dispositivo Bluetooth che ho trovato in BluetoothAdapter.getBondedDevices(). Questo non funziona.

Per stabilire correttamente la connessione Bluetooth, ho dovuto fare qualcosa di simile al pseudocodice di seguito:

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); 
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); 

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); 
socket.connect(); 

Sono arrivato questa risposta seguendo esattamente il Bluetooth Chat esempio: Bluetooth Chat Service. Perché non funziona sul dispositivo da getBondedDevices() è oltre me. Forse qualcuno con una conoscenza più intima di Android può rispondere a questo.

+0

getRemoteDevice non è un metodo statico, come si sta chiamando è – raja

+1

È sempre (quasi?) Vuole utilizzare BluetoothAdapter.getDefaultAdapter() come BluetoothAdapter. Quanto sopra è solo pseudocodice, quindi non puoi semplicemente copiare e incollare. –

+0

Ottimo post, questo in realtà ha senso perché il dispositivo è un riferimento e sarà obsoleto. L'adattatore sarà sempre aggiornato. – Cookster

0
private static BluetoothSocket mSocket; 
BluetoothDevice selectDevice = null; 

void connectDevice(){ 
    if(mSocket == null) { 
     //Log.d(TAG, "Socket is null"); 
     UUID SPP_UUID = UUID 
       .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 
     Set<BluetoothDevice> bondedDevices = BluetoothAdapter 
       .getDefaultAdapter().getBondedDevices(); 
     //Log.d(TAG, "Size: " + bondedDevices.size()); 
     /** 
     * Select your divice form paired devices 
     */ 
     for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      selectDevice = bluetoothDevice; 
      //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()); 
     } 

     if(selectDevice.getBondState() == selectDevice.BOND_BONDED) { 
      //Log.d(TAG, selectDevice.getName()); 
      try { 
       mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       //Log.d(TAG, "socket not created"); 
       e1.printStackTrace(); 
      } 
      try { 
       mSocket.connect(); 
      } catch (IOException e) { 
       try { 
        mSocket.close(); 
        //Log.d(TAG, "Cannot connect"); 
       } catch (IOException e1) { 
        //Log.d(TAG, "Socket not closed"); 
        e1.printStackTrace(); 
       } 
      } 
    }