2011-11-07 18 views
6

Ho un dispositivo bluetooth con profilo SPP e bluetooth versione 2.1.
Ho un'app che si connette a quel dispositivo e comunica con esso. Il dispositivo utilizza la tecnica di abbinamento "Just Works".Bluetooth blu: lista dei dispositivi accoppiati

Sono di fronte a un problema su alcuni telefoni come il Samsung Galaxy tablet, Galaxy S.

il problema è dopo l'utente esce dalla app, sto chiudendo le prese e la disconnessione dal dispositivo. Dopo aver scollegato correttamente, si osserva che la voce del dispositivo viene rimossa dall'elenco dei dispositivi associati.

risposta

13

Non ho lavorato con i tablet, ma ho scritto un'app che utilizzava SPP per i telefoni Android. Quello che ho scoperto è che per ottenere la stabilità del Bluetooth, devo legarmi manualmente con il dispositivo con cui voglio comunicare. Abbiamo usato il codice qui sotto per iniziare il legame dall'interno dell'app e dovrebbe preservare il legame come se fosse stato abbinato manualmente al menu delle impostazioni.

Ecco il flusso generale: 1) Registra un BroadcastReceiver per ascoltare BluetoothDevice.ACTION_BOND_STATE_CHANGED
2) Dopo la scoperta dispositivo che si dovrebbe avere un oggetto BluetoothDevice.
3) Uso riflessione di chiamare il metodo 'createBond' su un BluetoothDeviceObject
3a) Attendere eventi di modifica dello stato legame prima prese apertura

BluetoothDevice device = {obtained from device discovery}; 
Method m = device.getClass().getMethod("createBond", (Class[])null); 
m.invoke(device, (Object[])null); 

int bondState = device.getBondState(); 
if (bondState == BluetoothDevice.BOND_NONE || bondState == BluetoothDevice.BOND_BONDING) 
{ 
    waitingForBonding = true; // Class variable used later in the broadcast receiver 

    // Also...I have the whole bluetooth session running on a thread. This was a key point for me. If the bond state is not BOND_BONDED, I wait here. Then see the snippets below 
    synchronized(this) 
    { 
     wait(); 
    } 
} 

4) Attendere lo stato legame per passare da BOND_BONDING a BOND_BONDED

All'interno di un BroadcastReciever:

public void onReceive(Context context, Intent intent) 
{ 
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) 
    { 
     int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1); 
     int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1); 

     if (waitingForBonding) 
     { 
      if (prevBondState == BluetoothDevice.BOND_BONDING) 
      { 
       // check for both BONDED and NONE here because in some error cases the bonding fails and we need to fail gracefully. 
       if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE) 
       { 
        // safely notify your thread to continue 
       } 
      } 
     } 
    } 
} 

5) socket aperti e comunicare

È anche possibile il metodo 'removeBond' tramite riflessione per rimuovere il dispositivo dall'elenco di pairing.

Spero che questo aiuti!

0

Se l'associazione si verifica in seguito alla connessione dell'app, suppongo che alcuni dispositivi considerino un accoppiamento temporaneo e non manterranno il dispositivo nell'elenco accoppiato dopo che la connessione è stata disconnessa. Per mantenere il dispositivo nell'elenco accoppiato, è necessario associare manualmente il menu delle impostazioni Bluetooth. Una volta abbinato, il tuo programma può connettersi/disconnettersi e il dispositivo si manterrà nella lista abbinata.

+0

Dove devo esaminare i dettagli per questo comportamento di accoppiamento temporaneo; Documentazione Android o bluetooth 2.1 documenti di specifica? Se si tratta di un problema Android, deve essere riproducibile su tutti i telefoni. O è legato all'implementazione del produttore sullo stack bluetooth? – Ashwini

+0

È il produttore che dipende dall'opzione che fornisce per accoppiare/legare vs solo autenticare per la connessione temporanea. Azione tipicamente esplicita per l'accoppiamento (che implica anche il salvataggio del dispositivo accoppiato tramite il sistema bluetooth - menu impostazioni) –

0

Ho anche riscontrato lo stesso problema con un Sony Xperia X10. Sono riuscito a fare in modo che "ricordasse" l'abbinamento cambiando le impostazioni del livello di sicurezza sul lato del dispositivo bluetooth (visto che sto sviluppando anche il dispositivo).

Non sono sicuro della spiegazione del "accoppiamento temporaneo", che dipenderebbe dal produttore, non ha senso che i telefoni diversi reagiscano in modo diverso a una connessione con lo stesso dispositivo.

Tuttavia è la parte illimitata che è un problema per me. In genere lo stack Bluetooth sembra bloccarsi quando l'utente annulla la connessione di un dispositivo mentre l'applicazione è connessa in background. Non riesco ancora a capire come gestire correttamente l'evento ACTION_BOND_STATE_CHANGED.

+0

Puoi dirmi quali impostazioni del livello di sicurezza sono necessarie per ricordare il dispositivo nell'elenco dei dispositivi associati? Posso riprodurlo facilmente su tablet con Android 3.0+, quindi ho pensato che fosse correlato alla versione di Android. – Ashwini

+0

Ho cambiato il firmware del dispositivo per rispondere che era un tipo di "solo visualizzazione" quando riceve una richiesta di dichiarare le sue capacità di I/O dal telefono (prima era impostato su "nessun input e nessuna uscita"). Questa negoziazione è parte del protocollo di accoppiamento Bluetooth ed è documentata nelle specifiche Bluetooth, ma non ho idea del perché abbia influenzato il comportamento del telefono. –

Problemi correlati