6.0 Android Marsmallow BLE: paramètres de connexion

la gestion des paramètres de connexion basse énergie de Bluetooth semble avoir changé sur Android 6.

j'ai un périphérique blable qui a besoin d'utiliser certains paramètres de connexion spécifiques (notamment, l'intervalle de connexion), et je veux utiliser l'intervalle de connexion minimum permis par la spécification BLE (c.-à-d. 7,5 ms).

le SDK Android ne permet pas de le choisir du côté de Blee GAP Central (le smartphone), donc la bonne façon de le faire est de faire mon GAP Périphérique envoyer un L2CAP Connection Parameter Update Request après la connexion GAP.

Les paramètres que je demande sont les suivantes:

  • intervalle de conn min: 7,5 ms
  • intervalle de conn max: 7,5 ms
  • latence de l'esclave: 0
  • délai de supervision: 2000ms

cela a fonctionné comme prévu avec tous les appareils Android que j'ai testé, de 4,3 à 5.x: après avoir envoyé le L2CAP Connection Parameter Update Request, mon appareil reçoit un <!-0x0000 (accepté), suivi par 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 différents Nexus 5, 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ée)). Puis-je recevoir 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é avec 2 différents implémentations du côté périphérique (une avec BlueNRG de ST Microelectronics, une avec nRF52 de Nordic Semiconductor), les deux avec exactement le même résultat.

puis, après plus de tests: j'ai essayé différents jeux de paramètres, en changeant l'intervalle de conn max (j'ai gardé les autres paramètres les mêmes). Voici ce que j'ai trouvé :

  • avec un intervalle de conn max = 18,75 ms, la demande de mise à jour a été acceptée avec un intervalle de 18,75 ms
  • avec un intervalle de conn max = 17,50 ms, la demande de mise à jour a été acceptée avec un intervalle de 15.00 ms
  • avec un intervalle de conn max = 15.00 ms, la demande de mise à jour a été acceptée avec un intervalle de 15.00 ms
  • avec un intervalle de conn max = 13.75 ms, la demande de mise à jour a été acceptée avec un intervalle de 11.25 ms
  • avec un intervalle de conn max = 11,25 ms, la demande de mise à jour a été acceptée avec un intervalle de 11,25 ms
  • avec tout autre intervalle de conn max valeur inférieure à 11,25 ms, je reçois rejetée.

donc l'observation est que quelque chose a clairement changé avec la façon dont la pile D'Android 6 gère les paramètres de connexion. Mais il ne semble pas y avoir d'information ou de documentation pour le confirmer.

mes observations conduisent à la conclusion que l'intervalle de connexion minimum autorisé est maintenant de 11,25 ms (ce qui correspond en fait à mes besoins) au lieu de 7,5 ms dans les versions précédentes D'Android. Mais ayant trouvé empiriquement, 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 serait génial d'avoir l'équivalent de Apple Bluetooth Design Guidelines(cf. § 3.6) clarifier les choses sur la façon dont un 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 ?

32
demandé sur veranith 2016-01-05 19:54:25

4 réponses

comparer la méthode connectionParameterUpdate () de GattService.java in AOSP 6.0.1_r17 vs AOSP 5.1.1_r14. Dans les deux cas, l'appel va jusqu'à Buedroid dans Bta_dmbleupleupdateconnectionparams() 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;
    }
9
répondu GPS 2016-04-18 12:01:04

Google n'a fourni aucune documentation sur les modifications de la pile Bluetooth concernant les paramètres de connexion, bien qu'il y en ait eu clairement dans Android 6.

mon expérience avec elle a été la même que la vôtre, cela étant que 11,25 ms est maintenant l'intervalle de connexion le plus rapide autorisé dans Android 6+.

ma conjecture instruite quant à la raison pour laquelle ils ne libèrent pas la documentation est que beaucoup de fabricants mettent leurs propres piles dans leurs téléphones (la pile 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+ va changer les paramètres de connexion 2 à 6 fois avant de régler sur les paramètres demandés.

j'ai observé qu'après avoir demandé un intervalle de mise à jour des paramètres de connexion de 800ms à 1100ms, j'ai vu l'intervalle initial revenir à 7,5 ms, qui a ensuite bondi à 48,75 ms puis a bondi à 1098,75 ms que j'ai demandé. Puis J'Ai abonné à des notifications sur l'un de mes services et l'intervalle de connexion a de nouveau bondi à 7,5 ms, puis à 1098,75 ms. Après cela, il s'est stabilisé à 1098.75 ms pendant la durée de la connexion.

ces tests ont été effectués sur un Nexus 6 avec Android 6.0.1

de toute évidence, il se passe des choses très étranges sur la pile Android 6.

4
répondu Andrew 2016-02-05 19:30:50

Google les gars ont fait une erreur dans l'une des récentes commits dans Bluedroid en définissant BTM_BLE_CONN_INT_MIN_LIMIT0x0009 ce qui donne 1,25 ms x 9 = 11,25 ms. Pour être conforme à la norme, elle doit être définie comme 0x0006.

1
répondu Andrew Gostev 2016-06-21 21:22:19

11,25 ms est le nouvel intervalle minimal de connexion. La raison pour laquelle ils ne permettent plus 7,5 ms est parce que si vous stream audio sur bluetooth en même temps l'audio pourrait devenir agité.

0
répondu Emil 2016-06-21 20:43:33