192 votes

Android 4.3 Bluetooth Low Energy instable

Je développe actuellement une application qui utilisera le Bluetooth Low Energy (testé sur le Nexus 4). Après avoir commencé à utiliser les API BLE officielles dans 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 aquí 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 m'être déconnecté et reconnecté, je suis souvent incapable d'analyser les services/caractéristiques ou d'effectuer une lecture/écriture. Je ne trouve rien dans les journaux qui indique pourquoi cela se produit.

Lorsque cela se produit, je dois désinstaller l'application, désactiver le Bluetooth et redémarrer le téléphone avant qu'elle ne fonctionne à nouveau.

Chaque fois qu'un périphérique est déconnecté, je m'assure d'appeler close() sur l'objet BluetoothGatt et de lui donner la valeur null. Des idées ?


EDIT :
Décharges de journaux : Pour ces journaux, j'ai enraciné mon téléphone et augmenté le niveau de traçage des éléments connexes dans /etc/bluetooth/bt_stack.conf.

Connexion réussie - Première tentative après avoir redémarré le téléphone et installé l'application. Je suis capable de me connecter, de découvrir tous les services/caractéristiques, et de lire/écrire.

Échec de la première tentative - Il s'agit de la tentative suivante 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 après.

Échec de la deuxième tentative - Un exemple où je ne suis même pas capable de découvrir les services/caractéristiques.


EDIT 2 :
Le dispositif 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 avec et a découvert que TI a sorti une application Android pour le SensorTag hier. Cependant, cette application a le même problème. J'ai testé ceci sur deux autres Nexus 4s 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, ce qui provoque toutes sortes de plantages. Je commence à me demander si c'est un problème avec cette puce spécifique ?

0 votes

Veuillez poster les journaux complets de votre téléphone depuis le démarrage jusqu'à ce que vous rencontriez le problème.

0 votes

@AAnkit Je viens d'ajouter les vidages de journaux correspondants.

0 votes

Pouvez-vous ajouter un extrait de code ou un pseudo-code de ce que vous faites afin que nous puissions faire de notre mieux pour reproduire sur d'autres appareils fonctionnant en 4.3 ? Merci

189voto

OneWorld Points 6140

Conseils importants pour la mise en œuvre

(Peut-être que certaines de ces indications ne sont plus nécessaires en raison des mises à jour du système d'exploitation Android).

  1. Certains appareils comme le Nexus 4 avec Android 4.3 il faut plus de 45 secondes pour se connecter en utilisant une instance gatt existante . Contournement : Fermez toujours les instances de gatt à la déconnexion et créez une nouvelle instance de gatt à chaque connexion.
  2. N'oubliez pas d'appeler android.bluetooth.BluetoothGatt#close()
  3. Commencez un nouveau fil de discussion à l'intérieur onLeScan(..) et ensuite se connecter. Raison : BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) échoue toujours, si elle est appelée à l'intérieur de LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) dans le même fil de discussion sur Samsung Galaxy S3 avec Android 4.3 (au moins pour la version JSS15J.I9300XXUGMK6)
  4. La plupart des appareils filtrent la publicité
  5. Mieux vaut ne pas utiliser android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) avec le paramètre pour filtrer certains UUID de service parce que c'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.
  6. Gatt peut toujours traiter une commande à la fois. . Si plusieurs commandes sont appelées l'une après l'autre, la première est annulée. en raison de la nature synchrone de l'implémentation de gatt.
  7. Je constate souvent, même sur les appareils modernes sous Android 5, que le Wifi interfère avec le Bluetooth et vice versa. En dernier recours, éteignez le wifi pour stabiliser le bluetooth.

Tutoriel pour les débutants

Un bon point de départ pour les nouveaux venus pourrait être ce tutoriel vidéo : Développer des applications Bluetooth Smart pour Android http://youtu.be/x1y4tEHDwk0

Le problème et la solution décrite ci-dessous sont probablement corrigés par les mises à jour du système d'exploitation.

Travailler autour : Je pourrais "stabiliser" mon application en faisant ça...

  1. Je propose à l'utilisateur un paramètre "Redémarrer Bluetooth". Si ce paramètre est activé, je redémarre Bluetooth à certains moments qui indiquent que la pile BLE commence à devenir instable. Par exemple, si startScan renvoie false. Un bon point peut également être si serviceDiscovery échoue. J'éteins et rallume simplement Bluetooth.
  2. Je propose un autre paramètre "Turn off WiFi". Si ce paramètre est activé, mon application désactive le Wifi lorsqu'elle fonctionne (et le réactive ensuite).

Ce contournement est basé sur les expériences suivantes...

  • Le redémarrage de Bluetooth permet de résoudre les problèmes de BLE dans la plupart des cas.
  • Si vous désactivez le Wifi, la pile BLE devient beaucoup plus stable. Cependant, elle fonctionne aussi très bien sur la plupart des appareils avec le wifi activé.
  • Si vous désactivez le Wifi, le redémarrage de Bluetooth récupère entièrement la pile BLE sans qu'il soit nécessaire de redémarrer l'appareil dans la plupart des cas.

35 votes

Google, tu dois réparer ça maintenant. Ce contournement (je l'ai ajouté car il fonctionne) est ridicule.

5 votes

Parfois, la découverte du service va réussir avec un statut 0 (en supposant qu'il n'y a pas de problèmes), mais la lecture des caractéristiques va donner des valeurs NULL parce qu'il n'est pas vraiment connecté ou que les caractéristiques n'ont pas été découvertes (je vois cela dans le journal : 11-01 18:37:32.131 : WARN/BluetoothGatt(20119) : Unhandled exception : java.lang.NullPointerException)

3 votes

@Lo-Tan Je vérifie toujours après la découverte du service, si le service que j'attends est inclus. Vous ne pouvez jamais être sûr, si la découverte du service donne un résultat. Parfois, je ne reçois aucun rappel. J'ai donc appliqué un délai d'attente pour la découverte de services.

19voto

benka Points 2236

Désactiver le WIFI :

Je peux aussi confirmer que désactiver le WIFI rend Bluetooth 4.0 plus stable, notamment sur les Google Nexus (j'ai un Nexus 7).

Le problème

c'est que l'application que je développe besoins les deux WIFI et continuellement Balayage Bluetooth LE . Donc, désactiver le WIFI n'était pas une option pour moi.

De plus, je me suis rendu compte que balayage continu de Bluetooth LE peut en fait tuer la connexion WIFI et faire le L'adaptateur WIFI ne peut pas se reconnecter à tout réseau WIFI jusqu'à ce que le balayage BLE soit activé. (Je ne suis pas sûr des réseaux mobiles et de l'Internet mobile).
Cela s'est produit sur les appareils suivants :

  • Nexus 7
  • Motorola Moto G

Cependant, le balayage BLE avec WIFI activé semble assez stable :

  • Samsung S4
  • HTC One

Ma solution de rechange

I balayage BLE pour une courte période de temps 3-4 secondes alors je éteindre le scan pendant 3-4 secondes . Puis à nouveau ON.

  • Évidemment, je désactive toujours le balayage BLE lorsque je me connecte à un appareil BLE.
  • Lorsque je me déconnecte d'un appareil, je redémarre BLE (en éteignant puis en rallumant l'adaptateur) pour réinitialiser la pile avant de relancer le balayage.
  • J'ai également réinitialisé le BLE lors de la découverte services o characteristics échoue.
  • Lorsque je reçois des données de publicité d'un appareil auquel l'application devrait se connecter (disons 500 fois sans pouvoir se connecter - ce qui représente environ 5-10 secondes de publicité), je réinitialise BLE à nouveau.

0 votes

Vous avez dit que je redémarre BLE après la déconnexion d'un appareil. Supposons que l'utilisateur transfère le fichier via une connexion Bluetooth. Alors, vous ferez échouer ce transfert bluetooth à tout moment.

1 votes

Que voulez-vous dire par "éteindre puis rallumer l'adaptateur" ?

0 votes

Je suis d'accord, le Wifi et le Bluetooth ensemble tuent les performances des applications dans le Moto G.

10voto

Mikt25 Points 162

Assurez-vous que votre Nexus est apparié à 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émarrage. Il semble que la première connexion ne nécessite pas d'appairage mais que toutes les tentatives suivantes le font.

Je mettrai à jour cette réponse dans quelques jours lorsque je testerai la découverte de services et les demandes de lecture et d'écriture de gatt sans redémarrage.

EDIT : Il s'avère que je testais sur une version de micrologiciel de développement (notre capteur) qui causait des problèmes si elle n'était pas appariée. Notre dernière version du firmware de production fonctionne parfaitement sur les 2540 et 2541.

EDIT : J'ai remarqué que sur la Nexus 7 2013, les connexions sont plus stables lorsque le WiFi est désactivé. J'aimerais savoir si cela peut aider quelqu'un d'autre.

EDIT : Il semble que j'ai fait l'inverse avec l'appariement. Tout fonctionne bien quand il n'est pas appairé. Après l'appairage, je ressens exactement les mêmes symptômes que le PO. On ne sait pas encore si cela est lié à notre firmware ou à l'API Android BLE. Soyez prudent si vous testez ceci parce qu'une fois apparié, vous ne pourrez peut-être pas vous désapparier à cause d'un bug expliqué dans le paragraphe 3b de ce document. poste .

0 votes

Je me connecte et me reconnecte constamment à un dispositif CC2541 sans aucune sorte de couplage manuel ou de redémarrage.

0 votes

À mon avis, il n'y a pas besoin d'appariement. Les documents officiels ne commentent pas non plus l'appariement. J'ai également pu effectuer des notifications d'écriture, de lecture et de modification de caractéristiques sans aucun couplage. Cependant, juste pour une courte période. Maintenant c'est à nouveau instable... Le SAMSUNG BLE SKD v2.0 ne nécessite pas non plus de couplage et fonctionne très bien.

3 votes

Je peux le confirmer, il est plus stable après avoir désactivé le Wifi. Tout le monde devrait essayer ça.

8voto

Krystian Points 90

Dans certains modèles, il y a un défaut : https://code.google.com/p/Android/issues/detail?id=180440

Par contre, 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 n'existe plus pour moi, peu importe que le wifi soit activé ou désactivé.

btGatt.disconnect();
btGatt.close();

0 votes

¿Por qué close nécessaire ?

3 votes

La procédure de fermeture correcte est essentielle lorsque vous souhaitez connecter Bluetooth plusieurs fois. D'après mon expérience, il est préférable d'exécuter la connexion Bluetooth dans un service UNBOUND distinct afin de pouvoir la démarrer et l'arrêter à la main. Et que vous appeliez mConnectedGatt.disconnect() ; ble_device=null ; dans votre inDestroy(). Dans mon cas, ce modèle fonctionne de manière stable et sans problème.

5voto

Sam Reyes Points 299

J'étais confronté à un problème similaire. Ma solution était

if (Build.VERSION.SDK_INT >= 23) {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}

& appel proche après déconnexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X