0
votes

Comment extraire la valeur décimale de la température d'une valeur hexagonale Bluetooth LE (SIG)

Je développe une application Xamarin Android pour vous connecter à un thermomètre Bluetooth basse consommation. Je peux déjà connecter et lire sa valeur. Mon problème est que c'est en format hexadécimal et je n'ai pas trouvé de moyen d'extraire sa valeur dans un format décimal (Celsius).

Voici quelques échantillons de lectures:

  • pour 36.0 Celsius, j'ai eu le 06-68-01-00-FF-E2-07-03-0A-15-34-00-02
  • pour 36,2 Celsius, j'ai eu 06-6A-01-00-FF-E2-07-03-0A-14-14-00-02
  • pour 36.8 Celsius, j'ai eu le 06-70-01-00-FF-E2-07-03-0A-14-1B-00-02
  • pour 34.6 Celsius, j'ai eu le 06-5A-01-00-FF-E2-07-03-0A-14-1F-00-02

    De ce que je comprends, il doit s'agir de la "colonne" 2º ci-dessus (valeurs hexadécimales 68, 6a, 70, 5a). Les valeurs dans les coutures de 10º et 11º "" Colonnes "sont liées au temps de mesure (HH-mm).

    Comment puis-je extraire la valeur? Y a-t-il une formule générique que je peux utiliser? Y a-t-il un moyen de savoir que c'est une unité de mesure afin que je puisse convertir en Celsius (si ce n'est pas déjà)?


0 commentaires

4 Réponses :


0
votes

La spécification de la caractéristique de température peut être trouvée ici: https://www.blueooth.com/ Spécifications / GATT / VISITEUR? ATTRATEXMLFILE = ORG.BLUETOOTH.CHARACTERISTIQUE.TEMPERATURE_MEASURY.XML

Donc, fondamentalement, la valeur de la température est un flotteur couvrant 4 octets.


2 commentaires

Ils ont enlevé le spectateur :( le XML est confus


Le lien est cassé pourriez-vous s'il vous plaît mettre à jour



2
votes

"Mon problème est que c'est en format hexadécimal". Je suis sûr que vous recevez un tableau d'octets, vous venez de lire ou d'imprimer en format hexadécimal.

Pour obtenir quelque chose d'utile, vous devez obtenir les données pertinentes du tableau d'octets d'origine.

06-68-01-00-FF-E2-07-03-0A-15-34-00-02 est [6, 104,1 0,255,226,7,3,10,21,52,0,2]

Le premier octet (octet [0] = 6 est un drapeau bit: 00000110.

bit 0 est le plus droit = ​​0, ce qui signifie la valeur de mesure de la température dans les unités de Celsius. (Si 1 Fahrenheit). Bit 1 = 1, ce qui signifie que le champ horodatage présent, si 0 champ d'horodatage n'est pas présent. BIT 2 = 1, ce qui signifie champ de type de température présente, si le champ de type de température n'est pas présent.

Tous les autres bits ne sont pas pertinents, ils sont réservés à une utilisation future.

morsures [1] (104) et [2] (1) est la température comme flottant dans Celsius * 10. Pour obtenir la température multiplie de l'octet [2] par 256 et ajoutez un octet [1], divisez le total de 10. Résultat: 1 * 256 + 104 = 360. La température est de 36,0

BITES3 et 4 n'ont aucun sens ici. Normalement, ils font partie du flotteur de température de 4 octets.

morsures [5] (226) et [6] (7) est l'année comme INT16: 7 * 256 + 226 = 2018.

octet [7] (3) est le mois. 0 signifiant inconnu, 1 = janvier, ici 3 = mars.

octet [8] (10) est le jour du mois, ici 10.

octet [10] (21) est l'heure (nombre d'heures après minuit), ici 21.

octet [11] (52) est la minute, ici 52.

octet [12] (0) est le second, ici 0.

octet [13] (2) est le type de température, ici corps (général).

1 aisselle
2 corps (général)

3 oreille (généralement lobe d'oreille)

4 doigts

5 tractus gastro-intestinal

6 bouche

7 rectum

8 TOE

9 tympan (tambour d'oreille)

10 - 255 réservé à une utilisation future

0 réservé à une utilisation future


1 commentaires

Où obtenez-vous les informations? Caractéristique de température XML ne fournit que la définition du bit pour le premier octet. Est-ce que ceci est 13 octets une définition standard ou exclusive? Certains fournit différent Définition



0
votes

Ces données proviennent des spécifications Bluetooth, en fonction du service que vous devez utiliser, dans ce cas, le service est la température. Les informations sont écrites dans le fichier XML de la spécification de service. Voir le lien suivant pour la température, il provient de Bluetooth.com

Voir le service de température ici

Une autre explication existe dans ce lien. Voir la solution dans ce lien pour plus de détails

Le lien suivant contient une liste de nombreux fichiers XML des services utilisés dans Bluetooth. Je l'ajoute pour référence. De nombreux services XML ici


0 commentaires

0
votes

(Je ne peux pas commenter sur la réponse de Grooverfromholland en raison de la réputation pas suffisante, c'est donc ma réponse ici où au moins certaines des informations peuvent être trouvées)

Il pourrait être intéressant d'ajouter que ce flotteur est Non Un flotteur de précision unique de 32 bits ( https://fr.wikipedia.org / wiki / simple precision_floating-point_format ) Mais un flotteur 32 bits pour les dispositifs médicaux définis par IEEE 11073-20601 . Voir Chapitre 2.2.1 pour la définition de flotteur ici:

https://www.blueooth.com/wp-content/uploads/2019/03/PHD_TRANSCODING_WP_V16.PDF

Donc, vous devez Faites ceci: xxx

prenons donc vos octets 1 ... 4 qui contiennent les valeurs de température (de 0x06- 68-01-00-FF -E2-07-03-0a-15-34-00-02): xxx

Certains autres détails peuvent être trouvés ici https://www.blueooth.com/specifications/specs / Santé-Thermomètre-Service-1-0 / Par exemple, l'octet de flag (0x06 = 00000110) qui était bien décrit par Grooverfromholland est expliqué dans les chapitres 3.1.1.1 ... 3.1.1.4.


0 commentaires