Sto sviluppando un'applicazione che deve connettersi automaticamente ad una periferica.gatt.writeDescriptor errore di richiamata di stato quando si utilizza il dispositivo collegato
Ho un servizio appiccicosa che procede come segue:
- cerca il dispositivo desiderato nel periferiche associate
- se non fine la periferica (prima volta), scansioni per esso e legami con esso utilizzando
device.createBond()
, attende che il legame per finire ascoltando l'ACTION_BOND_STATE_CHANGED trasmesso - collega ad esso utilizzando
device.connectGatt(ctx,true,callback)
- attende
onConnectionStateChange
callback con stato di connessione 012.
- inizia il rilevamento dei servizi utilizzando
gatt.discoverServices()
- attende
onServicesDiscoverd
richiamata - permette le notifiche su una caratteristica scrivendo un descrittore utilizzando
gatt.writeDescriptor
- attese per la richiamata onDescriptorWrite con lo status di successo
BluetoothGatt.GATT_SUCCESS (0)
- fa cose con notifiche ricevute
Questo tutto funziona per la prima volta. Quando il dispositivo si disconnette (diventa fuori portata per esempio, o spento) i callback di servizio fastidiosi gatt.disconnect()
e gatt.close()
, si riavvia e ricomincia da capo, questa volta utilizza il dispositivo collegato per connettersi.
Tutto funziona bene fino a quando il punto 7, nel senso ho un callback per onDescriptorWrite
con lo stato 133 volte seguita da un cambiamento di callback stato di connessione con lo stato 0 e lo stato di 22.
non riuscivo a trovare alcuna info on-line per quale status 133 o 22 media.
Qualche idea sul perché questo sta accadendo?
Sto lavorando attorno ad esso reagendo alla cattiva callback onDescriptorWrite
rimuovendo il bond (reflection) e facendo di nuovo tutto con il dispositivo appena scansionato.
Quindi in pratica sto utilizzando il legame solo per attendere la connessione del dispositivo e quindi riavviare il tutto.
Ciò significa che una connessione Gatt per un dispositivo collegato è inutile per scrivere il descrittore di cui ho bisogno.
Sembra che mi manchi qualcosa, mi piacerebbe sapere cosa.
EDIT: alcuni logcat relavant uscita
08-18 16:06:31.363 12765-12835/? W/bt-att﹕ gatt_rsp_timeout disconnecting...
08-18 16:06:31.363 12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0016
08-18 16:06:31.363 12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=4 connected=0 conn_id=4 reason=0x0016
08-18 16:06:31.363 12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=5 connected=0 conn_id=5 reason=0x0016
08-18 16:06:31.366 12765-12807/? D/BtGatt.GattService﹕ onDisconnected() - clientIf=5, connId=5, address=C1:D1:22:BA:F5:13
here im getting onDescriptorWrite with status 133
D/BluetoothGatt﹕ onClientConnectionState() - status=22 clientIf=5 device=C1:D1:22:BA:F5:13
tramite gli sguardi di questo:
https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/idea133/bta/include/bta_gatt_api.h#169
16 mezzi BTA_GATT_CONN_TERMINATE_LOCAL_HOST
22 significa BTA_GATT_CONN_LMP_TIMEOUT
chiesto questo su Nordici GitHub: https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406
.210
un po 'più di dettagli, se solo salvare l'indirizzo del dispositivo ble e connettersi utilizzando bluetoothAdapter.getRemoteDevice (indirizzo) quindi non ho mai avuto questo problema. è solo durante il collegamento, forse l'informazione di vincolo non è più valida dopo il mio dispositivo si riavvia? quali informazioni conserva il legame? – talarari
Trovate la soluzione? Penso anche che il ritardo non sia una buona soluzione per risolverlo – Jame
Nota che 22 non è BTA_GATT_CONN_LMP_TIMEOUT - c'è un'enorme differenza tra 22 e 0x22. 22 = 0x16. –