Android 4.3: Comment se connecter à plusieurs périphériques Bluetooth Low Energy
Ma Question est: Peut-Android 4.3 (client) ont des connexions actives avec plusieurs BLE périphériques (serveurs)? Si oui, comment puis-je l'atteindre?
Ce que j'ai fait jusqu'à présent
J'essaie d'évaluer ce que le débit que vous pouvez réaliser à l'aide de BLE et Android 4.3 BLE de l'API. En plus j'ai aussi essayer de savoir combien d'appareils peuvent être connectés et actifs en même temps. J'utilise un Nexus 7 (2013), Android 4.4 comme maître et TI CC2540 Télécommande comme des esclaves.
J'ai écrit un simple logiciel de serveur pour les esclaves, qui transmet 10000 20Byte paquets à travers BLE des notifications. J'ai basé mon Application Android sur le Application Accelerator de Bluetooth SIG.
Il fonctionne bien pour un périphérique et que je peux atteindre autour de 56 kBits charge utile du débit à un Intervalle de Connexion de 7,5 ms. Pour vous connecter à plusieurs esclaves j'ai suivi les conseils d'un Nordique Employé qui a écrit dans le Nordique De La Zone Des Développeurs:
Oui, il est possible de gérer plusieurs esclaves avec une seule application. Vous devez gérer chaque esclave avec un BluetoothGatt instance. Vous aussi, vous avez besoin de BluetoothGattCallback pour chaque esclave vous connecter.
Donc j'ai essayé et cela en partie les travaux. Je peux me connecter à plusieurs esclaves. Je peux également vous inscrire pour les notifications sur plusieurs esclaves. Le problème commence quand j'ai commencer le test. Je reçois au premier notifications de tous les esclaves, mais après une couple de Connexion Intervalles juste les notifications à partir d'un périphérique venir auge. Après environ 10 secondes, les autres esclaves déconnecter, parce qu'ils semblent atteindre le délai de connexion. Parfois, je reçois depuis le début de l'essai que des notifications à partir d'un esclave.
J'ai également essayé d'accéder à l'attribut au cours d'une opération de lecture avec le même résultat. Après une couple de lit seulement les réponses à partir d'un appareil est creux.
Je suis conscient qu'il y a quelques questions similaires sur ce forum: Ne Android 4.3 soutien de plusieurs BLE connexions de l'appareil?, A native Android BLE GATT de mise en œuvre synchrone de la nature? ou C? Ble de raccordement multiples. Mais aucune de ces réponses, il est clair pour moi, si c'est possible et comment le faire.
Je serais très reconnaissant pour les conseils.
- Avez-vous besoin nécessairement de se connecter? Si vous êtes soucieux de dissimuler les données et fiable-ou-total de l'échec, peut-être vous pouvez simplement le mettre dans les paquets de diffusion et d'analyse de ceux-ci.
- Merci pour votre relecture. J'ai pour utiliser le mode connecté pour des raisons de fiabilité
- J'ai recherche sur le net pour trouver des exemples de la façon de faire ce que vous avez en vous un programme de test @Andreas Mueller. Pourriez-vous avoir la gentillesse de m'aider, et me montrer comment envoyer des notifications à partir de Android à l'CC2540 puce avec la nouvelle Application "accélérateur"-code? (lien vers le projet peut-être?)
- Je suis désolé, mais je ne peux pas vous donner accès au projet. Les droits sont à l'université, je travaille pour. J'ai obtenu la permission de partager la testlogic et bluetooth-stuff. Le logiciel a été pour les essais à l'interne seulement. De sorte que la qualité du Code n'est pas tout que de grands. J'espère que ça va aider: drive.google.com/...
Vous devez vous connecter pour publier un commentaire.
Je soupçonne tout le monde l'ajout de retards est seulement de permettre à la BLE système pour effectuer l'action que vous avez demandé avant de vous en soumettre un autre. Android BLE système n'a pas de forme de la queue. Si vous ne
puis la première opération d'écriture seront immédiatement remplacées avec le second. Oui c'est vraiment stupide et la documentation devrait probablement fait mention de cette.
Si vous insérez une attente, il permet à la première opération à réaliser avant de faire le deuxième. C'est un énorme moche hack si. Une meilleure solution consiste à mettre en œuvre votre propre file d'attente (comme Google devrait avoir). Heureusement Nordiques ont publié une pour nous.
https://github.com/NordicSemiconductor/puck-central-android/tree/master/PuckCentral/app/src/main/java/no/nordicsemi/puckcentral/bluetooth/gatt
Edit: au fait, c'est le comportement universel pour BLE Api. WebBluetooth se comporte de la même manière (mais le Javascript n'rendre plus facile à utiliser), et je crois iOS BLE API se comporte de la même.
Re visitent la bluetooth-lowenergy problème android: je suis toujours à l'aide de retards.
Le concept: après chaque action qui provoque la BluetoothGattCallback (par exemple conenction, la découverte de services, écrire, lire) un dealy est nécessaire. P. S. avez un oeil à Google exemple sur BLE API de niveau 19 de l'échantillon pour la connectivité à comprendre comment des Émissions doit être envoyée à obtenir une certaine compréhension générale etc...
Tout d'abord, scan (ou scan) pour BluetoothDevices, remplir le connectionQueue avec les périphériques souhaités et de les appeler initConnection().
Un coup d'oeil sur l'exemple suivant.
Maintenant, si tout est bon, vous avez fait les connexions et BluetoothGattCallback.onConnectionStateChange(BluetoothGatt gatt, int status, int newState) a été appelé.
P. S. sendBroadcast(intention) peut-être besoin d'être fait comme ceci:
Puis l'émission est reçue par BroadcastReceiver.onReceive(...)
Après avoir fait ce que vous voulez dans le récepteur de radiodiffusion, voici comment je continue:
De nouveau, après avoir réussi à la découverte de service, BluetoothGattCallback.onServicesDiscovered(...) est appelé. Encore une fois, j'ai envoyer une intention de le BroadcastReceiver (cette fois avec différents Chaîne d'action) et c'est maintenant que vous pouvez commencer la lecture, l'écriture et l'activation des notifications/indications...
P. S. Si vous travaillez avec plusieurs appareils, assurez-vous que vous démarrez la lecture, l'écriture, etc... des trucs après tous les appareils ont déclaré que leurs services ont été découverts.
BluetoothGattCallback aurez toutes vos données en provenance du BLE capteur. Une bonne pratique consiste à envoyer une diffusion avec les données de votre BroadcastReceiver et de les traiter de là-bas.
Je développe une application avec BLE caractéristiques de moi-même. La façon dont j'ai réussi à vous connecter à plusieurs appareils et activer les notifications était de mettre en place les retards.
Je fais donc un nouveau thread (afin de ne pas bloquer le thread d'INTERFACE utilisateur) et dans le nouveau thread connecter et activer les notifications.
Par exemple, après BluetoothDevice.connectGatt(); call Fil.sleep();
Et ajouter le même retard pour la lecture/écriture et d'activer/de dissable notifications.
MODIFIER
Utilisation d'attendre comme cela pour que Android dindn pas reaise ANR
Pluie est droit dans sa réponse, vous avez besoin de retards pour à peu près tout quand vous travaillez avec BLE dans Android. J'ai développé plusieurs applications avec elle et elle est vraiment nécessaire. En les utilisant vous éviter beaucoup d'accidents.
Dans mon cas, j'utilise les retards après chaque lecture/écriture de la commande. Ce faisant, vous vous assurer de recevoir la réponse du BLE appareil presque toujours. - Je faire quelque chose comme ceci: (bien sûr, tout est fait dans un thread séparé pour éviter à beaucoup de travail sur le thread principal)
ou:
C'est vraiment utile lorsque vous écrivez ou lisez sur plusieurs caractères dans une ligne... Comme Android est assez rapide à exécuter les commandes presque instantanément, si vous n'utilisez pas un décalage entre eux, vous pouvez obtenir des erreurs d'incohérence ou de valeurs...
J'espère que ça aide, même si elle n'est pas exactement la réponse à votre question.
Malheureusement les notifications dans le courant Android BLE de la pile sont un peu buggé. Il y a quelques codé en dur limites et j'ai trouvé quelques problèmes de stabilité, même avec un seul appareil. (Je l'ai lu à un moment que vous ne pourriez avoir 4 notifications... ne sais pas si c'est sur tous les appareils ou par périphérique. En essayant de trouver la source de cette info maintenant.)
Je voudrais essayer de passer à une boucle d'interrogation (par exemple, sondage, les éléments de la question 1/sec) et de voir si vous trouvez votre stabilité augmente. Je voudrais également envisager de passer à un autre périphérique esclave (disons une GRH ou de la TI SensorTag) pour voir si il n'y a peut-être un problème avec l'esclave code côté (à moins que vous pouvez tester que contre iOS ou d'une autre plate-forme et de confirmer qu'il ne fait pas partie de la question).
Modifier: De référence pour la notification limitation