web-dev-qa-db-fra.com

Android 6.0 Marshmallow BLE: Paramètres de connexion

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:

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

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é:

  • avec un intervalle de connexion max = 18,75 ms, la demande de mise à jour a été acceptée avec un intervalle défini sur 18,75 ms
  • avec intervalle de connexion max = 17,50 ms, la demande de mise à jour a été acceptée avec un intervalle défini sur 15,00 ms
  • avec conn interval max = 15.00ms, la demande de mise à jour a été acceptée avec intervalle défini à 15.00ms
  • avec un intervalle de connexion max = 13,75 ms, la demande de mise à jour a été acceptée avec un intervalle défini sur 11,25 ms
  • avec conn interval max = 11,25 ms, la demande de mise à jour a été acceptée avec un intervalle défini sur 11,25 ms
  • avec toute autre valeur max d'intervalle conn inférieure à 11,25 ms, je suis rejeté.

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?

32
veranith

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.

10
GPS

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.

5
Andrew

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.

1
Andrew Gostev

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é.

1
Emil