Bluetooth Low Energy - mise à jour d'une valeur de caractéristique à plusieurs reprises
question de Suivi sur l'Ingénierie Électrique Stackexchange
Je veux écrire la valeur d'un Bluetooth Low Energy caractéristique à plusieurs reprises dans un court laps de temps (comme un possible cas d'utilisation, imaginez une souris).
- La caractéristique avec un 128bit UUID est 20 octets de long. Par conséquent, il peut être rédigé en une seule Basse Énergie de la transaction.
- Écritures se produisent à une fréquence de 50 Hz, qui est égale à une écriture une fois toutes les 20ms.
- Par conséquent, 20 * 50 * 8 = 8 kbit/s sont écrits.
- Je suis en utilisant le Commande /Écrire sans réponse mode d'écriture de la caractéristique. Par conséquent, aucun des accusés de réception de se produire sur la couche d'attribut.
- Pas de Bluetooth ou Bluetooth Low Energy périphériques sont connectés. Rien n'est effectuée sur wi-fi. Pas d'autres caractéristiques sont lues ou écrites pendant les tests.
J'ai tester le programme en envoyant des paquets contenant des numéros de séquence à partir d'un iPhone 4S. Le numéro de séquence est incrémenté après chaque paquet envoyé.
Sur le côté réception, un programmables conseil de développement, qui intègre un CSR1000 BLE de la puce, qui reçoit les paquets et imprime le reçu les numéros de séquence de la connexion série.
Mes problèmes sont les suivants:
-
Après un certain temps, les paquets de démarrage supprimées. Le premier ~100 paquets beau travail @ 50 Hz. À partir de là, les paquets de démarrage supprimées.
0x00 - 0x46 received 0x47, 0x48 missing 0x49, 0x4a, 0x4b, 0x4c received 0x4d missing 0x4e, 0x4f, 0x50, 0x51 received 0x52 missing 0x53, 0x54, 0x55, 0x56 received 0x57 missing ...
Le plus souvent, un pack de quatre paquets transmis fine (rarement, et seulement 2 paquets). Ensuite, 1-7 paquets manquants.
Quand j'réduire la valeur caractéristique de la taille, le problème persiste encore.
Quand j'écris à 100 hz au lieu de 50 hz, l'image est la même - seulement que les gouttes commencent survenant après environ 35 paquets et que 5 à 7 paquets sont perdus entre le succès de la transmission des paquets de quatre.
Avec la perte de paquets, le taux de transmission est d'environ 5 kbit/s, quelle que soit la fréquence d'écriture. C'est clairement en dessous de la ~305 kbit/s qui doit être techniquement possible au fil Bluetooth Low Energy.
-
Le problème se produit également dans le sens inverse, quand je suis en l'envoi de paquets à partir de la carte de développement pour l'iPhone 4S. Encore une fois, 5 kbit/s est le maximum que je reçois. Le mécanisme de Notification est utilisé pour ce scénario. Encore une fois, aucun des accusés de réception de se produire sur la couche d'attribut.
-
Lorsque j'essaie d'envoyer simultanément dans les deux directions, les choses commencent à souffler jusqu'au point où je dois remettre les deux le conseil du développement et de l'iPhone 4S.
Questions:
-
Que ce soit un problème de Bluetooth de Basse Énergie de la puce, qui est utilisé sur le conseil de développement?
Si oui, pourquoi le problème est-il également se produire dans la direction opposée, où l'iPhone actes que le récepteur?
Existe-il des conseils de développement sur le marché qui supporte la haute fréquence de l'accès aux caractéristiques?
-
Ce qui pourrait être l'origine du problème?
Veuillez également essayer de référence des pièces de Bluetooth Spec /diapositives de la présentation /articles en plus à des hypothèses.
Il n'existe pas de Bluetooth de Basse Énergie de la souris sur le marché. Les souris ont d'interrogation standard taux de 125 Hz et avoir au moins envoyer deux de 16 octets valeurs plus CACHÉ des frais généraux par les tiques. Par conséquent, une solution pour mon problème devrait être disponible.
Mise à jour
La LE Raccordement Complet des Événements est décrit dans Spécification Bluetooth Version 4.0 Vol 2 Partie E, Section 7.7.65.1. Je reçois les valeurs suivantes pour les différents paramètres de la connexion:
Parameter Value Description
--------------------------------------------------
Conn_Interval 0x0054 Time = 105 ms
Conn_Latency 0x0000 Time = 0 ms
Supervision_Timeout 0x00fc Time = 2520 ms
Master_Clock_Accuracy 0x05 50 ppm
- Ce que LE chip/dev conseil utilisez-vous?
- Les paramètres que vous avez défini pour la connexion - êtes-vous à l'aide de la valeur par défaut?
- Comment voyez-vous le lien timings?
- Le CHIER de Connexion Complet de l'Événement expose les paramètres. Voir Bluetooth De Base Spec Version 4.0 Volume 2, Partie E, Section 7.7.65.1. Je peux regarder ces valeurs sur mon périphérique.
- Regardez-vous le moment où les paramètres ou les paramètres que vous définissez le périphérique pour le demander? I. e, sont le paramètre "live" de données?
- Oui, elles sont données en direct.
- Quel outil fait pour vous?
- Ne pas comprendre la question. Ceux sont des événements standard que je reçois du firmware sur mon périphérique Bluetooth. Alternativement, vous pouvez également utiliser un périphérique Bluetooth Espion pour capturer un Air de Trace et de regarder pour le paramètre de connexion de paquets de là.
- Aha, merci @Etan
- Pouvez-vous fournir le code où avez-vous changer de 50 hz à 100 hz?
- La modification est effectuée sur le périphérique latérale (pas sur l'iPhone). Par conséquent, le code dépend de votre puce utilisée. Vous devez envoyer un Paramètre de Connexion de Demande de mise à Jour, et l'iPhone répond par un accusé de réception positif ou négatif en fonction de vos paramètres.
- Pourquoi avez-vous arrêter à 105 ms? L'Intervalle de Connexion peut aller aussi bas que 7.5 ms.
- De retour au moment de la question, la valeur la plus basse qui a été accepté par iOS a été 18,75 ms (voir la réponse).
Vous devez vous connecter pour publier un commentaire.
La délivrance d'un les Paramètres de la Connexion de mise à Jour résolu le problème et l'augmentation du débit de 5 kbit/s à ~33 kbit/s. Cependant, c'est encore en-deçà de la ~305 kbit/s.
Existe-il des méthodes pour atteindre la pleine ~305 kbit/s?
Question de suivi sur l'Ingénierie Électrique Stackexchange
Le principal problème semble être que c'est un problème de mémoire tampon sur le jeton que vous utilisez. À partir de la spécification de base, Volume 3, Partie F, 3.3.2:
Ce que vous voyez lorsque les paquets sont rejetés, sont en raison de dépassement de la mémoire tampon soit sur le côté de l'iPhone (le plus probable je pense) ou sur le côté hôte. À partir de l'iOS 11.2, apple fournit un mécanisme vous permettant de vérifier si le tampon est prêt avant d'écrire le prochain paquet; canSendWriteWithoutResponse:
Si vous attendez jusqu'à ce que canSendWriteWithoutResponse est vrai avant d'écrire un paquet, la livraison est garanti d'avoir été placé dans le tampon de réception, mais pas garanti qu'il a été traité (sans accusé de réception). L'autre chose qui peut aider est par la négociation d'un MTU de taille supérieure à 20. Apple prend en charge MTU à 185B, et jusqu'à 251 (extended longueur de données aka EDL). Par chunking votre les paquets de données MUT-3 tailles, votre paquet==MTU (- 3) x 1 par intervalle de connexion. @185B MTU, 24 ms intervalle de connexion, j'ai un débit autour de 48kbps sans perte de paquets. Lors de l'envoi de données de l'iPhone à partir de l'appareil, le SDK sur cette fin aura besoin de l'équivalent de "canSendWriteWithoutResponse", qui dans mon cas, à l'aide de SiLabs matériel/SDK n'ont e.g
``
``
Voici une vidéo et .fichier pdf à partir d'apple expliquant les différentes BLE techniques et les vitesses attendues. MTU + Intervalle de Connexion que vous utilisez pour déterminer le débit maximal. 48kps devrait être facilement réalisable, 96kbps et peut-être un peu plus élevés sont possibles.
Quoi de neuf dans la Base Bluetooth