Android 6.0 Guimauve BLE : les Paramètres de Connexion
Le Bluetooth Low Energy paramètres de connexion de gestion semble avoir changé dans Android 6.
J'ai un BLE périphérique qui a besoin d'utiliser certains paramètres de connexion (notamment, l'intervalle de connexion), et je veux utiliser le minimum de l'intervalle de connexion autorisé par le BLE spécification (c'est à dire 7,5 ms).
Le SDK Android ne permet pas de choisir à partir de la MESURE de l'ÉCART du centre (le smartphone) de côté, de sorte que la bonne façon de le faire est de faire de mon FOSSÉ périphérique envoyer un L2CAP Connection Parameter Update Request
après l'ÉCART de la connexion est faite.
Les paramètres que je demande sont:
- conn intervalle min : 7,5 ms
- conn intervalle max : 7,5 ms
- esclave de latence : 0
- surveillance timeout : 2000ms
Cela a fonctionné comme prévu avec tous les appareils Android que j'ai testé, de 4,3 à 5.x : après l'envoi de la L2CAP Connection Parameter Update Request
, mon appareil reçoit un L2CAP Connection Parameter Update Response
avec 0x0000 (accepté), suivie par une LE Connection Update Complete event
où je peux voir que la connexion demandée paramètres ont bien été pris en compte.
Maintenant, avec une Nexus 9 tablette ou avec 2 Nexus 5 appareils, 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é)). Puis-je recevoir un LE Connection Update Complete event
où je peux voir que les paramètres de connexion n'ont PAS été prises en compte.
J'ai essayé avec 2 différentes implémentations sur le Périphérique de côté (une avec ST Microelectronics' BlueNRG, l'un avec Nordic Semiconductor nRF52), avec exactement le même résultat.
Puis, après plus de tests : j'ai essayé différents jeux de paramètres, la modification de la conn intervalle de max (j'ai gardé les autres paramètres). Voici ce que j'ai trouvé :
- avec conn intervalle max = 18.75 ms, demande de mise à jour a été acceptée avec l'intervalle réglé à 18,75 ms
- avec conn intervalle max = 17.50 ms, demande de mise à jour a été acceptée avec l'intervalle réglé à 15.00 ms
- avec conn intervalle max = 15.00 ms, demande de mise à jour a été acceptée avec l'intervalle réglé à 15.00 ms
- avec conn intervalle max = 13.75 ms, demande de mise à jour a été acceptée avec l'intervalle réglé à 11,25 ms
- avec conn intervalle max = 11.25 ms, demande de mise à jour a été acceptée avec l'intervalle réglé à 11,25 ms
- avec toute autre conn intervalle de valeur max au-dessous de 11,25 ms, je me rejeter.
Ainsi, l'observation, c'est que quelque chose a clairement changé avec la façon dont Android 6 BLE pile gère les paramètres de connexion. Mais il ne semble pas être n'importe quel type d'information ou de documentation pour confirmer que.
Mes observations conduisent à une conclusion que le minimum de l'intervalle de connexion autorisée est maintenant 11.25 ms (ce qui correspond à mes besoins) au lieu de 7,5 ms dans les précédentes versions d'Android. Mais ayant trouvé empiriquement, je veux être sûr que je ne suis pas en manque quelques autres contraintes et les règles ou si ce minimum ne serait pas dynamique, en fonction par exemple sur le niveau de la batterie...
Ce qui serait bien serait d'avoir l'équivalent de Apple Bluetooth lignes Directrices de Conception (cf. §3.6) pour mettre les choses au clair sur la manière dont LE Périphérique devrait traiter ce sujet.
Est ce que quelqu'un ayant le même problème ou est au courant de certaines informations plus utiles de Google ?
Vous devez vous connecter pour publier un commentaire.
La méthode de comparaison connectionParameterUpdate() à partir de GattService.java dans PSBA 6.0.1_r17 vs PSBA 5.1.1_r14. Dans les deux cas, l'appel va tout le chemin à Buedroid dans BTA_DmBleUpdateConnectionParams() dans bta_dm_api.c avec les mêmes paramètres.
6.0:
5.1:
Cela pourrait être une partie de la réponse à votre question. Bien que BLE permet de descendre à 7,5 ms CI, je ne peux pas spéculer sur les motifs de la couche de liaison ne serait pas d'interrupteur pour abaisser CI, sur demande, par le périphérique. Je ne sais pas si toute partie de code android contrôles de l'issue des négociations avec les autres périphériques.
Google n'a pas fourni toute la documentation sur le Bluetooth LE de la pile à des modifications concernant la connexion des changements de paramètres, même si il y a clairement eu quelques Android 6.
Mon expérience avec elle a été la même que la votre, qui est que le 11.25 ms est maintenant la connexion la plus rapide de l'intervalle autorisé dans Android 6+.
Ma supposition éclairée quant à pourquoi ils n'ont pas les documents de mainlevée est que de nombreux fabricants mettent leurs propres BLE piles dans leur téléphone (le BLE sur les Samsung et HTC se comporter différemment de vanille Android).
Une autre observation que j'ai faite qui a provoqué beaucoup de problèmes, c'est que Android 6+ va changer les paramètres de connexion de 2 à 6 fois avant de s'installer sur les paramètres requis.
J'ai observé qu'après la demande d'un paramètre de connexion intervalle de mise à jour de 800ms pour 1100ms, j'ai vu l'intervalle initial de revenir à 7,5 ms, ce qui a alors sauté à 48.75 ms, puis a sauté à la 1098.75 ms je lui ai demandé. Puis je me suis abonné aux notifications sur l'un de mes services et de l'intervalle de connexion de nouveau un bond en arrière à 7,5 ms, puis retour à 1098.75 mme. 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
Évidemment, des choses très étranges se passent sur l'Android 6 BLE de la pile.
11.25 ms est le nouveau minimum intervalle de connexion. La raison pour laquelle ils ne permettent pas de 7,5 ms, c'est parce que si vous le streaming audio via bluetooth en même temps, l'audio peut devint saccadée.
Google gars fait une erreur dans l'une de ces dernières s'engage dans Bluedroid par définition
BTM_BLE_CONN_INT_MIN_LIMIT
comme0x0009
qui vous donne 1,25 ms x 9 = 11.25 mme. Pour se conformer à la norme, il doit être défini comme0x0006
.