Je développe actuellement une application qui utilisera Bluetooth Low Energy (test sur le Nexus 4). Après avoir commencé avec les API BLE officielles sous Android 4.3, j'ai remarqué qu'après avoir connecté un appareil pour la première fois, je suis rarement capable de me connecter / communiquer avec cet appareil ou tout autre appareil.
En suivant le guide ici , je peux me connecter avec succès à un appareil, analyser les services et les caractéristiques et lire / écrire / recevoir des notifications sans aucun problème. Cependant, après la déconnexion et la reconnexion, je suis souvent incapable d'analyser les services / caractéristiques ou de terminer une lecture / écriture. Je ne trouve rien dans les journaux pour indiquer pourquoi cela se produit.
Une fois que cela se produit, je dois désinstaller l'application, désactiver Bluetooth et redémarrer le téléphone avant qu'il ne recommence à fonctionner.
Chaque fois qu'un appareil est déconnecté, je m'assure d'appeler close () sur l'objet BluetoothGatt et de le définir sur null. Des idées?
EDIT:
Log dumps: Pour ces journaux, j'ai rooté mon téléphone et augmenté les niveaux de trace des éléments associés dans /etc/bluetooth/bt_stack.conf
Connexion réussie - Première tentative après le redémarrage du téléphone et l'installation de l'application. Je suis capable de me connecter, de découvrir tous les services / caractéristiques et de lire / écrire.
Tentative ratée 1 - Il s'agit de la prochaine tentative après la déconnexion de la connexion réussie ci-dessus. Il semble que j'ai pu découvrir des caractéristiques, mais la première tentative de lecture a renvoyé une valeur nulle et s'est déconnectée peu de temps après.
Tentative ratée 2 - Un exemple où je ne suis même pas en mesure de découvrir les services / caractéristiques.
EDIT 2:
Le périphérique auquel j'essaie de me connecter est basé sur la puce CC2541 de TI. J'ai obtenu un TI SensorTag (également basé sur le CC2541) pour jouer et j'ai découvert que TI avait publié une application Android pour le SensorTag hier. Cependant, cette application a le même problème. J'ai testé cela sur deux autres Nexus 4 avec le même résultat: la connexion au SensorTag est réussie la première ou la deuxième fois, mais (selon les journaux) ne parvient pas à découvrir les services par la suite, provoquant toutes sortes de plantages. Je commence à me demander si c'est un problème avec cette puce spécifique?
Réponses:
Conseils de mise en œuvre importants
(Peut-être que certains de ces conseils ne sont plus nécessaires en raison des mises à jour du système d'exploitation Android.)
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
, puis connectez-vous. Raison:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
échoue toujours, s'il est appelé à l'intérieurLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
dans le même thread sur Samsung Galaxy S3 avec Android 4.3 (au moins pour la build JSS15J.I9300XXUGMK6)android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
avec le paramètre pour filtrer certains UUID de service, car cela est complètement cassé dans Samsung Galaxy S3 avec Android 4.3 et ne fonctionne pas pour les UUID 128 bits en général.Tutoriel pour les débutants
Un bon point d'entrée pour les nouveaux arrivants pourrait être ce tutoriel vidéo: Développement d'applications Bluetooth Smart pour Android http://youtu.be/x1y4tEHDwk0
Le problème et le contournement décrits ci-dessous sont probablement résolus maintenant par les mises à jour du système d'exploitation
Solution: je pourrais "stabiliser" mon application en faisant cela ...
Ce travail est basé sur les expériences suivantes ...
la source
Désactiver le WIFI:
Je peux également confirmer que la désactivation du WIFI rend Bluetooth 4.0 plus stable, en particulier sur Google Nexus (j'ai un Nexus 7).
Le problème
est que l'application que je développe nécessite à la fois une analyse WIFI et Bluetooth LE en continu . Donc, désactiver le WIFI n'était pas une option pour moi.
De plus, j'ai réalisé que la numérisation Bluetooth LE continue peut en fait tuer la connexion WIFI et rendre l' adaptateur WIFI incapable de se reconnecter à un réseau WIFI tant que l'analyse BLE n'est pas activée. (Je ne suis pas sûr des réseaux mobiles et de l'Internet mobile).
Cela s'est certainement produit sur les appareils suivants:
Cependant, la numérisation BLE avec WIFI activé semblait assez stable sur:
Ma solution de contournement
Je scanne le BLE pendant une courte période de 3-4 secondes, puis je désactive le scan pendant 3-4 secondes . Puis à nouveau sur ON.
services
oucharacteristics
échoue.la source
Assurez-vous que votre Nexus est couplé à l'appareil. Je ne peux pas vérifier si la communication fonctionne correctement ou non, mais vous pourrez vous connecter plus d'une fois sans redémarrer. Il semble que la première connexion ne nécessite pas d'appairage, mais toutes les tentatives ultérieures le font.Je mettrai à jour cette réponse dans quelques jours lorsque je testerai la découverte de services et gatt lire et écrire des requêtes sans redémarrage.
EDIT: Il s'avère que je testais une version de firmware de développement (notre capteur) qui causait des problèmes si elle n'était pas couplée. Notre dernière version de micrologiciel de production fonctionne bien sur les 2540 et 2541.
EDIT: J'ai remarqué que sur le Nexus 7 2013, les connexions sont plus stables lorsque le WiFi est désactivé. J'aimerais savoir si cela aide quelqu'un d'autre.
EDIT: Je semble l'avoir eu à l'envers avec l'appariement. Tout fonctionne bien lorsqu'il n'est pas jumelé. Après l'appairage, je ressens exactement les mêmes symptômes que l'OP. On ne sait tout simplement pas encore si cela est lié à notre firmware ou à l'API Android BLE. Soyez prudent si vous testez ceci car une fois couplé, vous ne pourrez peut-être pas vous déconnecter en raison d'un bogue expliqué dans 3b de cet article .
la source
Dans certains modèles, il y a un défaut: https://code.google.com/p/android/issues/detail?id=180440
D'un autre côté, dans mon cas, le problème était que ma connexion n'était pas correctement fermée dans la méthode onDestroy. Après la fermeture correcte, le problème pour moi n'existe pas, peu importe que le wifi soit activé ou désactivé.
la source
close
nécessaire?J'étais confronté à un problème similaire. Ma solution était
& appeler fermer après la déconnexion.
la source