Autore Topic: Bluetooth  (Letto 600 volte)

Offline wlf

  • Utente normale
  • ***
  • Post: 367
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Bluetooth
« il: 29 Settembre 2014, 14:37:49 CEST »
0
Ho realizzato un app che effettua una connessione bluetooth con un dispositivo BT settato come "just work", quindi viene fatta l'associazione senza nessuna richiesta, ne il PIN ne se associarlo o meno. La prima volta viene eseguita l'associazione del dispositivo BT, le volte successive viene effettuato solamente il collegamento.

Praticamente la prima volta se non appare tra i dispositivi associati faccio il paring del dispositivo:
Codice: [Seleziona]
                Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
                if (pairedDevices.size() > 0) {
                        for (BluetoothDevice device : pairedDevices) {                               
                                if(device.getAddress().equals(btAddress)) {                                       
                                        mmDevice = device;
                                        Log.d("Tag", "Bluetooth Device Found " + device.getAddress());
                                        break;
                                }
                        }
                }


Codice: [Seleziona]
                    Method m = mmDevice.getClass().getMethod("createBond", (Class[]) null);
                    m.invoke(mmDevice, (Object[]) null);

Il collegamento avviene con una connect:
Codice: [Seleziona]
                mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);               
                mmSocket.connect();

Funziona tranquillamente su molti smartphone con diverse marche/modelli.

Con dei modelli prodotti da LG, Nexus, Samsung Galaxy S5, etc, la prima connessione con l'associazione funziona tranquillamente, mentre le volte successive pur essendo il dispositivo già associato e presente tra i pairedDevices quando lancio la connect() mi parte una richiesta di pairing con una *dialog* (file allegato). Considerate che la schermata "Richiesta registrazione Bluetooth" pur sembrando una dialog in realtà mi fa partire la onPause e la onResume dell'activity sottostante, magari fosse una dialog, ed altra cosa che ritengo strana è che non passa per la onActivityResult. :(

Nel LogCat ho individuato le seguenti "anomalie" (non mi li da quando il tentativo funziona correttamente):
Codice: [Seleziona]
W/BluetoothAdapter(26117): getBluetoothService() called with no BluetoothManagerCallback
D/BluetoothSocket(26117): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[67]}

Sapreste indicarmi come posso fare per evitare che compaia la nuova richiesta di pairing?
Grazie. ;)

--- edit ---
Nella documentazione dice esplicitamente che se i dispositivi non sono accoppiati (client + relativo server) il framework Android automaticamente fa partire una dialog di richiesta:

Citazione
Note: If the two devices have not been previously paired, then the Android framework will automatically show a pairing request notification or dialog to the user during the connection procedure, as shown in Figure 3. So when attempting to connect devices, your application does not need to be concerned about whether or not the devices are paired. Your RFCOMM connection attempt will block until the user has successfully paired, or will fail if the user rejects pairing, or if pairing fails or times out.

Peccato che con alcuni modelli di smartphone lo faccia anche se il dispositivo è già accoppiato! Accade inoltre in modo MOLTO BIZZARRO; praticamente su 4 smartphone stessa marca/modello accade su 2 si e 2 no, la stessa versione di Android su uno funziona senza dare errore e su un altro no. I due modelli che funzionano sono quelli più vecchi, sembrerebbe quasi che abbiano modificato l'hw del bluetooth.
Cambiando il dispositivo server con uno identico, cambia solo il mac-address del bluetooth, con stesso hw, tutti e quattro gli smartphone funzionano senza alcun problema. :(
Per questo non posso imputare la colpa ne alla parte server (dispositivo bluetooth) ne a quella client (smartphone) ... :(
« Ultima modifica: 06 Ottobre 2014, 23:29:22 CEST da wlf »

Offline wlf

  • Utente normale
  • ***
  • Post: 367
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Bluetooth
« Risposta #1 il: 31 Ottobre 2014, 16:47:28 CET »
0
Ho una parte della risposta ma questa mi fa sorgere nuovi dubbi! :(

A quanto pare il problema è dovuto al fatto che due dispositivi associati si scambiano una "link key" che memorizzano entrambe i dispositivi, sia lo smartphone che il dispositivo associato (cuffie, interfaccia auto, casse, antenna GPS, etc). Peccato che quest'ultimi dispositivi abbiano un numero limitato di memorizzazioni, normalmente 4 ma c'è chi arriva anche anche a 16, perciò se per caso il dispositivo cancella la link key anche se lo smartphone ritiene di essere ancora associato al tentativo di connessione scatta la richiesta di effettuare nuovamente il paring! :(

Quindi, nessuno dei due dispositivi ha la sicurezza di essere ancora realmente associato; la "link key" può essere eleminata sia dallo smartphone che dal dispositivo, basta che uno dei due la perda per obbligare ad effettuare un nuovo pairing tra i dispositivi.

Veniamo quindi ai nuovi dubbi:
Da codice l'App si accorge che non c'è più una "link key" valida quando viene fatta la connect(); sarebbe possibile secondo voi, sempre da codice, fare in modo che non appaia la richiesta di accoppiamento ma venga effettuata in modo silente in automatico?

Intervenendo sul chip bluetooth sono a chiedervi se qualcuno ha notizia di qualche integrato che possa memorizzare oltre 16 "link key". Magari ce ne fosse uno che possa memorizzare perlomeno una cinquantina od oltre di "link key" non mi obbligherebbe tutte le volte gli utenti ad effettuare nuovamente un noioso/lento pairing.