31

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?

risposta

4

Google non ha fornito alcuna documentazione circa la LE stack Bluetooth modifiche riguardanti le modifiche dei parametri di connessione, anche se ci sono stati chiaramente alcuni in Android 6.

La mia esperienza con esso è stato lo stesso come il tuo, che è che 11.25 ms è ora l'intervallo di connessione più veloce consentito in Android 6+.

La mia supposizione istruita sul motivo per cui non rilasciano documentazione è che molti produttori inseriscono i propri stack BLE nei loro telefoni (il BLE su Samsung e HTC si comportano in modo diverso da Android vaniglia).

Un'altra osservazione che ho fatto che ha causato una grande quantità di problemi è che Android 6+ cambierà i parametri di connessione da 2 a 6 volte prima di sistemare i parametri richiesti.

Ho osservato che dopo aver richiesto un intervallo di aggiornamento dei parametri di connessione da 800 ms a 1100 ms, ho visto l'intervallo iniziale tornare a 7,5 ms, che poi è salito a 48,75 ms e poi è salito ai 1098,75 ms richiesti. Poi mi sono iscritto alle notifiche su uno dei miei servizi e l'intervallo di connessione è tornato di nuovo a 7.5ms e poi a 1098.75ms. Dopo questo, si è stabilizzato a 1098.75ms per la durata della connessione.

Questi test sono stati eseguiti su un Nexus 6 con Android 6.0.1

Ovviamente, alcune cose molto strane stanno accadendo sullo stack BLE Android 6.

9

Metodo di confronto connectionParameterUpdate() da GattService.java in AOSP 6.0.1_r17 vs AOSP 5.1.1_r14. In entrambi i casi, la chiamata arriva fino a Buedroid in BTA_DmBleUpdateConnectionParams() in bta_dm_api.c con gli stessi parametri.

6.0:

switch (connectionPriority) 
    { 
     case BluetoothGatt.CONNECTION_PRIORITY_HIGH: 
      minInterval = 9; // 11.25ms 
      maxInterval = 12; // 15ms 
      break; 

     case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER: 
      minInterval = 80; // 100ms 
      maxInterval = 100; // 125ms 
      latency = 2; 
      break; 
    } 

5,1:

switch (connectionPriority) 
    { 
     case BluetoothGatt.CONNECTION_PRIORITY_HIGH: 
      minInterval = 6; // 7.5ms 
      maxInterval = 8; // 10ms 
      break; 

     case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER: 
      minInterval = 80; // 100ms 
      maxInterval = 100; // 125ms 
      latency = 2; 
      break; 
    } 

Questa potrebbe essere una parte della risposta alla tua domanda. Sebbene BLE consenta di scendere a un intervallo di errore di 7,5 ms, non è possibile ipotizzare il motivo per cui il livello di collegamento non passa a CI inferiore su richiesta da periferica. Non so se una parte del codice di Android controlli l'esito delle trattative con i dispositivi periferici.

+0

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

1

Google ha commesso un errore in uno dei recenti commit in Bluedroid definendo BTM_BLE_CONN_INT_MIN_LIMIT come 0x0009 che offre 1,25 ms x 9 = 11,25 ms. Per essere conforme allo standard deve essere definito come 0x0006.

0

11,25 ms è il nuovo intervallo di connessione minimo. Il motivo per cui non consentono più 7,5 ms è perché se si trasmette l'audio tramite Bluetooth contemporaneamente, l'audio potrebbe diventare instabile.

+0

Ironicamente, con un progetto su cui sto lavorando, Quando proviamo a trasferire l'audio dalla nostra periferica, l'audio diventa instabile se l'intervallo di connessione è maggiore di 10 ms. In gran parte perché (probabilmente) il livello di collegamento può gestire un numero limitato di pacchetti alla volta. – GPS

Problemi correlati