La gestion des paramètres de connexion Bluetooth Low Energy semble avoir changé dans Android 6.
J'ai un périphérique BLE qui doit utiliser certains paramètres de connexion spécifiques (notamment l'intervalle de connexion), et je veux utiliser l'intervalle de connexion minimum autorisé par la spécification BLE (c'est-à-dire 7,5 ms).
Le SDK Android SDK ne permet pas de le choisir du côté de BLE GAP Central (le smartphone), donc la bonne façon de le faire est de faire en sorte que mon périphérique GAP envoie un L2CAP Connection Parameter Update Request
une fois la connexion GAP établie.
Les paramètres que je demande sont:
Cela a fonctionné comme prévu avec tous les appareils Android Android que j'ai testés, de 4.3 à 5.x: après avoir envoyé le L2CAP Connection Parameter Update Request
, mon appareil reçoit un L2CAP Connection Parameter Update Response
avec 0x0000 (accepté), suivi d'un LE Connection Update Complete event
où je peux voir que les paramètres de connexion demandés ont bien été pris en compte.
Maintenant, avec une tablette Nexus 9 ou avec 2 appareils Nexus 5 différents, tous ayant Android 6.0.1, je peux voir que le L2CAP Connection Parameter Update Request
est toujours rejeté (je reçois un L2CAP Connection Parameter Update Response
avec 0x0001 (rejeté)). Ensuite, je reçois un LE Connection Update Complete event
où je peux voir que les paramètres de connexion demandés n'ont PAS été pris en compte.
J'ai essayé cela avec 2 implémentations différentes du côté périphérique (une avec BlueNRG de ST Microelectronics, une avec nRF52 de Nordic Semiconductor), les deux avec le même résultat exact.
Ensuite, après plus de tests: j'ai essayé différents jeux de paramètres, en changeant l'intervalle de connexion max (j'ai gardé les autres paramètres les mêmes). Voici ce que j'ai trouvé:
L'observation est donc que quelque chose a clairement changé avec la façon dont Android 6 gère les paramètres de connexion. Mais il ne semble y avoir aucune sorte d'information ou de documentation pour le confirmer.
Mes observations conduisent à conclure que l'intervalle de connexion minimum autorisé est désormais de 11,25 ms (ce qui correspond en fait à mes besoins) au lieu de 7,5 ms dans les versions antérieures de Android. Mais l'ayant trouvé empiriquement, je je veux être sûr que je ne manque pas d'autres contraintes/règles ou si ce minimum ne serait pas dynamique, en fonction par exemple du niveau de batterie actuel ...
Ce qui serait formidable serait d'avoir l'équivalent de Apple Bluetooth Design Guidelines (cf. §3.6) pour clarifier la façon dont un périphérique LE devrait traiter ce sujet.
Quelqu'un a-t-il le même problème ou connaît-il des informations plus utiles de Google?
Comparez la méthode connectionParameterUpdate () de GattService.Java dans AOSP 6.0.1_r17 contre AOSP 5.1.1_r14. Dans les deux cas, l'appel va jusqu'à Buedroid dans BTA_DmBleUpdateConnectionParams () dans bta_dm_api.c avec les mêmes paramètres.
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;
}
Cela pourrait faire partie de la réponse à votre question. Bien que le BLE autorise jusqu'à 7,5 ms CI, je ne peux pas spéculer pourquoi la couche liaison ne passerait pas à un CI inférieur sur demande par périphérique. Je ne sais pas si une partie du code Android contrôle le résultat des négociations avec le périphérique.
Google n'a fourni aucune documentation sur les modifications de la pile Bluetooth LE concernant les changements de paramètres de connexion, même s'il y en a clairement eu dans Android 6.
Mon expérience avec elle a été la même que la vôtre, étant donné que 11,25 ms est maintenant l'intervalle de connexion le plus rapide autorisé dans Android 6+.
Ma supposition éclairée quant à la raison pour laquelle ils ne publient pas de documentation est que de nombreux fabricants mettent leurs propres piles BLE dans leurs téléphones (les BLE sur Samsung et HTC se comportent différemment de Vanilla Android).
Une autre observation que j'ai faite qui a causé beaucoup de problèmes est que Android 6+ changera les paramètres de connexion 2 à 6 fois avant de régler les paramètres demandés.
J'ai observé qu'après avoir demandé un intervalle de mise à jour des paramètres de connexion de 800 ms à 1 100 ms, j'ai vu l'intervalle initial revenir à 7,5 ms, qui est ensuite passé à 48,75 ms, puis à 1098,75 ms que j'ai demandé. Ensuite, je me suis abonné aux notifications sur l'un de mes services et l'intervalle de connexion a de nouveau sauté à 7,5 ms, puis à 1098,75 ms. Après cela, il s'est stabilisé à 1098,75 ms pour la durée de la connexion.
Ces tests ont été exécutés sur un Nexus 6 avec Android 6.0.1
De toute évidence, des choses très étranges se produisent sur la pile Android 6 BLE.
Les gars de Google ont fait une erreur dans l'un des commits récents dans Bluedroid en définissant BTM_BLE_CONN_INT_MIN_LIMIT
comme 0x0009
ce qui vous donne 1,25 ms x 9 = 11,25 ms. Pour être conforme à la norme, elle doit être définie comme 0x0006
.
11,25 ms est le nouvel intervalle de connexion minimum. La raison pour laquelle ils n'autorisent plus 7,5 ms est que si vous diffusez de l'audio via Bluetooth en même temps, l'audio peut devenir saccadé.