La gestione dei parametri di connessione Bluetooth Low Energy sembra essere cambiato in Android 6.Android 6.0 Marsmallow BLE: Parametri di connessione
Ho un dispositivo periferico BLE che ha bisogno di usare alcuni parametri di connessione specifici (in particolare, l'intervallo di connessione) e voglio usare l'intervallo di connessione minimo consentito dalla specifica BLE (cioè 7,5ms).
L'SDK Android non consente di sceglierlo dal lato BLE GAP Central (lo smartphone), quindi il modo corretto per farlo è far sì che il mio dispositivo GAP Periferiche invii un L2CAP Connection Parameter Update Request
dopo aver effettuato la connessione GAP.
I parametri richiedo sono:
- conn intervallo min: 7,5ms
- conn intervallo max: 7,5ms latenza
- slave: 0
- supervisione timeout: 2000 ms
Questo ha funzionato come previsto con tutti i dispositivi Android che ho testato, da 4.3 a 5.x: dopo aver inviato il L2CAP Connection Parameter Update Request
, il mio dispositivo riceve uno L2CAP Connection Parameter Update Response
con 0x0000 (accettato), seguito da uno LE Connection Update Complete event
dove posso vedere che i parametri di connessione richiesti sono stati ben presi in considerazione.
Ora, con una tavoletta Nexus 9 o con 2 differenti dispositivi Nexus 5, tutti con Android 6.0.1, posso vedere che la la L2CAP Connection Parameter Update Request
è sempre respinto (ricevo una L2CAP Connection Parameter Update Response
con 0x0001 (respinto)). Quindi ricevo un LE Connection Update Complete event
dove posso vedere che i parametri di connessione richiesti NON sono stati presi in considerazione.
Ho provato questo con 2 diverse implementazioni sul lato Periferico (uno con BlueNRG della ST Microelectronics, uno con nRF52 di Nordic Semiconductor), entrambi con lo stesso identico risultato.
Quindi, dopo ulteriori test: ho provato diversi set di parametri, cambiando l'intervallo di connessione max (ho mantenuto gli altri parametri lo stesso). Ecco cosa ho trovato:
- con conn intervallo max = 18.75ms, richiesta di aggiornamento è stato accettato con intervallo impostato su 18.75ms
- con conn intervallo max = 17.50ms, richiesta di aggiornamento è stata accettata con il set intervallo 15.00 ms
- con conn intervallo max = 15.00ms, richiesta di aggiornamento è stato accettato con set intervallo 15.00ms
- con conn intervallo max = 13.75ms, richiesta di aggiornamento è stata accettata con intervallo impostato su 11.25ms
- con conn intervallo max = 11.25 ms, la richiesta di aggiornamento è stata accettata con intervallo impostato su 11.25 ms
- con un altro valore massimo dell'intervallo di connessione inferiore a 11,25 ms, viene rifiutato.
Così l'osservazione è che qualcosa è chiaramente cambiato con il modo in cui stack di BLE di Android 6 gestisce i parametri di connessione. Ma non sembra esserci alcun tipo di informazione o documentazione per confermarlo.
Le mie osservazioni portano alla conclusione che l'intervallo di connessione minimo consentito è ora 11.25 ms (che corrisponde effettivamente alle mie esigenze) invece di 7,5 ms nelle precedenti versioni di Android. Ma avendo trovato empiricamente, vorrei essere sicuro che non mi mancassero altri vincoli/regole o se quel minimo non sarebbe dinamico, dipendendo ad esempio dal livello attuale della batteria ...
Cosa sarebbe Sarebbe bello avere l'equivalente di Apple's Bluetooth Design Guidelines (vedi §3.6) per chiarire come una Peripheral LE dovrebbe affrontare questo argomento.
Qualcuno ha lo stesso problema o è a conoscenza di alcune informazioni utili da Google?
Vorrei aggiungere che in btm_ble_api.h, i valori di BTM_BLE_CONN_INT_MIN [0x0006] e BTM_BLE_CONN_INT_MAX [0x0C80] non sono stati modificati.Quindi, questo rifiuto non sta probabilmente accadendo in l2c_ble.c. – GPS