Je développe une application BLE sur Nexus 4 en utilisant Android API BLE. J'ai quelques questions/doutes:
1) Existe-t-il un moyen de définir/remplacer l'intervalle de connexion ou de notification de l'appareil central BLE. J'ai constaté que pour Android, l'intervalle de connexion par défaut est fixé à 7,5 ms. Existe-t-il un moyen de modifier ces paramètres d'intervalle de délai de connexion/notification.
2) Lors de la connexion à l'appareil distant, je suis confronté à un problème de déconnexion après une période aléatoire. De nombreuses personnes sont confrontées au problème de perte de connexion indiquant que Android est instable lorsqu'ils utilisent Android 4.3 API pour la connexion BLE. Existe-t-il une solution à cela?
[~ # ~] modifier [~ # ~]
ce que j'observe d'autre ici, c'est quand il faut du temps pour se reconnecter, puis il arrive avec un journal L2CAP ... suivant le journal
Trying to create a new connection laststate_ BOND_NONE
D/BluetoothGatt( 9620): connect() - device: 1C:BA:81:11:CA:36, auto: true
D/BluetoothGatt( 9620): registerApp()
D/BluetoothGatt( 9620): registerApp() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510
D/BtGatt.GattService( 3208): registerClient() - UUID=1adsds0911-4sdsc-41dc-8ac0-0sdsdf550510
D/BtGatt.btif( 3208): btif_gattc_register_app
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1000
D/BtGatt.btif( 3208): btif_gattc_upstreams_evt: Event 0
D/BtGatt.GattService( 3208): onClientRegistered() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510, clientIf=5
D/BluetoothGatt( 9620): onClientRegistered() - status=0 clientIf=5
D/BtGatt.GattService( 3208): clientConnect() - address=1C:BA:8C:1E:CA:36, isDirect=true
D/BtGatt.btif( 3208): btif_gattc_open
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1004
D/BtGatt.btif( 3208): btif_get_device_type: Device [1c:ba:8c:1e:ca:36] type 2, addr. type 0
W/bt-l2cap( 3208): L2CAP - LE - cannot start new connection at conn st: 3
Une idée comment peut effacer le mantain cahce par L2CAP?
Quand j'ai étudié le Android BLE API, je n'ai pas pu trouver d'API pour changer l'intervalle de connexion et le délai de supervision (peut-être aussi la latence des esclaves, je ne me souviens pas du haut de ma tête). Si vous devez les modifier, vous devez le faire à partir du périphérique esclave.
La réponse d'Ashwini que vous pouvez simplement ignorer, ce qu'il dit n'est tout simplement pas correct. Un appareil maître compatible Bluetooth 4.0 doit prendre en charge des intervalles de connexion de 7,5 ms à 4,0 s. Le dispositif esclave peut demander une modification des paramètres de connexion et envoie une demande de mise à jour des paramètres de connexion, et le maître mettra à jour le paramètre de connexion en conséquence.
D'un autre côté, le maître (dans votre cas, le Android) pourrait avoir un intérêt à changer seul l'intervalle de connexion, afin d'économiser de l'énergie, et vous souhaitez changer le intervalle de connexion à un intervalle plus détendu.
À mon avis, l'API Android et même l'implémentation matérielle sur plusieurs appareils sont immatures et l'utilisation de BLE, dans le sens où BLE était destiné, consomme beaucoup d'énergie sur un Android appareil. À l'avenir, je pense que vous verrez une bien meilleure prise en charge au niveau de l'API et une division de l'hôte et du contrôleur afin que le contrôleur puisse maintenir la connectivité même lorsque le processeur principal de l'appareil mobile est en veille. Cela permettra d'économiser beaucoup de puissance et vous pouvez maintenir la connectivité avec vos appareils BLE 24/7 sans aucune contrainte majeure sur l'autonomie de votre batterie.
@Ashwini: Comme mentionné dans le dernier commentaire avec l'intervalle de connexion 7.5, cela fonctionne mieux pendant un certain temps. Après un certain temps, le problème L2CAP apparaît et la connectivité ne fonctionne que si l'adaptateur Bluetooth est réinitialisé. En outre, un comportement étrange a été remarqué lorsque l'adaptateur Bluetooth est désactivé et réactivé par programme. Nous obtenons l'erreur GKI suivante ci-dessous:
> /GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception(): Task State Table
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [0] task name [BTU] state [0]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest#####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception:
> 02-05 15:49:24.466 E/GKI_LINUX( 2232):
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: ***************
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
De plus, cette API createBond aide-t-elle à améliorer la connexion avec le périphérique BLE (qui n'a en fait pas besoin d'être couplé pour la connexion)?
Quant à la modification de l'intervalle de connexion:
Depuis Android Lollipop API level 21 vous pouvez utiliser: requestConnectionPriority () Avec 3 niveaux: CONNECTION_PRIORITY_BALANCED, CONNECTION_PRIORITY_HIGH ou CONNECTION_PRIORITY_LOW_POWER.
Il n'est toujours pas aussi polyvalent que nous le souhaiterions, mais au moins quelque chose ...
Pour votre première question, comme l'a dit OneWorld, il est conseillé de laisser le smartphone gérer les paramètres d'intervalle de délai de connexion. Ces paramètres dépendent étroitement du matériel et de la pile Bluetooth utilisés pour un smartphone particulier.
À propos du problème de déconnexion, j'ai également rencontré des problèmes similaires. Je pense que cela est dû à un problème connecté dans un lien donné. Lorsque le système d'exploitation gère la connexion et le couplage, vous ne pouvez pas dissocier l'appareil et toutes les tentatives de reconnexion échouent après cela. Cela ne se produit pas si le périphérique est couplé (et non apparié) par programme à l'aide d'API privées sur 4.3, en supposant que vous avez correctement géré les connexions GATT. Dans Android 4.4.2, il y a une API createBond ajoutée pour l'appairage. Donc avec 4.4.2, la communication fonctionne plutôt bien.
Concernant la stabilité du Bluetooth low energy sur Android, je peux confirmer qu'il est assez instable. J'ai testé une application installée sur Nexus 4 et Nexus 5 avec un capteur basse énergie. Malgré la même version du système d'exploitation 4.4.2, les deux appareils ont donné des résultats différents pour la connexion. J'ai observé que l'appareil s'est déconnecté après un certain temps sur le Nexus 4 alors que pour le Nexus 5, les choses fonctionnaient bien.
J'espère que cela vous aidera à aller de l'avant avec votre problème.
J'ai rencontré un problème de déconnexion automatique identique à votre deuxième question. Deux façons de le résoudre:
1) Associez manuellement votre Android avec le périphérique distant via le paramètre Bluetooth avant d'exécuter votre application.
2) Ou vous pouvez les coupler par programme dans votre code. Voici le code d'appairage que j'ai trouvé en ligne, qui fonctionne pour moi
private void pairDevice(BluetoothDevice device) {
try {
Log.d("pairDevice()", "Start Pairing...");
Method m = device.getClass()
.getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
Log.d("pairDevice()", "Pairing finished.");
} catch (Exception e) {
Log.e("pairDevice()", e.getMessage());
}
}