Mise en route avec la spécification Bluetooth Low Energy (BLE) et Generic Attribute Profile (GATT) pour l’IoT
Selon Wikipedia, le Bluetooth est une norme de technologie sans fil utilisée pour échanger des données entre des appareils fixes et mobiles sur de courtes distances. Bluetooth Low Energy (Bluetooth LE ou BLE) est une technologie de réseau personnel sans fil (WPAN) conçue et commercialisée par le Groupe d’intérêt spécial Bluetooth (Bluetooth SIG). Selon le SIG Bluetooth, BLE est conçu pour un fonctionnement à très faible consommation. BLE prend en charge des débits de données de 125 Kb / s à 2 Mo / s, avec plusieurs niveaux de puissance de 1 milliwatt (mW) à 100 mW. Plusieurs facteurs clés influencent la portée effective d’une connexion Bluetooth fiable, qui peut varier d’un kilomètre à moins d’un mètre. La nouvelle génération Bluetooth 5 offre une amélioration théorique de la portée 4x par rapport à Bluetooth 4.2, d’environ 200 pieds (60 mètres) à 800 pieds (240 mètres).
Wikipedia répertorie actuellement 36 définitions de profils Bluetooth définis et adoptés par le SIG Bluetooth, y compris la spécification GATT (Generic Attribute Profile). Selon le SIG Bluetooth, le GATT est construit sur le protocole d’attribut (ATT) et établit des opérations communes et un cadre pour les données transportées et stockées par l’ATT. Le GATT fournit des services de découverte et de description de profil pour le protocole BLE. Il définit comment les attributs ATT sont regroupés en ensembles pour former des services.
Compte tenu de sa faible consommation d’énergie et de ses profils bien développés, tels que le GATT, le BLE est un protocole sans fil à courte portée idéal pour les appareils de l’Internet des objets (IoT), par rapport aux protocoles concurrents, tels que ZigBee, Bluetooth classic et Wi-Fi. Dans cet article, nous explorerons l’utilisation de la BLE et de la spécification du GATT pour transmettre des données de capteurs environnementaux d’un capteur IoT à une passerelle IoT.
Capteur IoT
Dans cet article, nous utiliserons un microcontrôleur mono-carte Arduino pour servir de capteur IoT, en fait un ensemble de capteurs. La carte de détection Arduino Nano 33 BLE compatible AI 3,3 V, sortie en août 2019, est livrée avec le puissant processeur nRF52840 de Nordic Semiconductors, un processeur ARM Cortex-M4 32 bits fonctionnant à 64 MHz, 1 Mo de mémoire Flash CPU, 256 Ko de SRAM et un module basse énergie Bluetooth 5 autonome NINA-B306.
Le Sense contient également une gamme impressionnante de capteurs embarqués:
- 9- capteur inertiel axis (LSM9DS1): Capteur d’accélération linéaire numérique 3D, capteur de vitesse angulaire numérique 3D
et Capteur magnétique numérique 3D - Capteur d’humidité et de température (HTS221): Capteur numérique capacitif pour l’humidité relative et la température
- Capteur barométrique (LPS22HB): Capteur de pression MEMS nano: 260-1260 hectopascal (hPa) baromètre de sortie numérique absolue
- Microphone (MP34DT05): Capteur audio MEMS microphone numérique omnidirectionnel
- Capteur Gestuel, de Proximité, de Couleur de la Lumière et d’Intensité lumineuse (APDS9960): Détection avancée des Gestes, Détection de proximité, Détection Numérique de la Lumière ambiante (ALS) et Sens des Couleurs (RGBC).
Le Sense est un excellent microcontrôleur monocarte à faible coût pour apprendre à collecter et à transmettre des données de capteurs IoT.
Passerelle IoT
Selon TechTarget, une passerelle IoT est un périphérique physique ou un logiciel qui sert de point de connexion entre le Cloud et les contrôleurs, capteurs et appareils intelligents. Toutes les données se déplaçant vers le Cloud, ou vice versa, passent par la passerelle, qui peut être une appliance matérielle dédiée ou un programme logiciel.
Dans cet article, nous utiliserons un ordinateur monocarte (SBC) Raspberry Pi 3 modèle B + de génération récente, pour servir de passerelle IoT. Ce modèle Raspberry Pi est doté d’un système de processeur quadricœur Cortex-A53 (ARMv8) 64 bits de 1,4 GHz sur puce (SoC), d’un SDRAM LPDDR2 de 1 Go, d’un réseau local sans fil double bande, d’un Bluetooth 4.2 BLE et d’un Gigabit Ethernet.
Pour suivre le post, vous pouvez remplacer le Raspberry Pi par n’importe quelle machine basée sur Linux pour exécuter l’exemple de script Python inclus.
L’Arduino transmettra la télémétrie du capteur IoT, via BLE, au Raspberry Pi. Le Raspberry Pi, en utilisant le Wi-Fi ou Ethernet, est alors capable de transmettre en toute sécurité les données de télémétrie du capteur au Cloud. Dans la terminologie Bluetooth, le périphérique Bluetooth (alias Serveur GATT), qui est l’Arduino, transmettra des données au périphérique central Bluetooth (alias Client GATT), qui est le Raspberry Pi.
Croquis Arduino
Pour ceux qui ne sont pas familiers avec Arduino, un croquis est le nom qu’Arduino utilise pour un programme. C’est l’unité de code qui est téléchargée dans une mémoire flash non volatile et s’exécute sur une carte Arduino. Le langage Arduino est un ensemble de fonctions C/C++. Toutes les constructions C et C++ standard prises en charge par le compilateur avr-g++ devraient fonctionner dans Arduino.
Pour ce post, l’esquisse, combo_sensor_ble.ino, contient tout le code nécessaire pour collecter la télémétrie du capteur environnemental, y compris la température, l’humidité relative, la pression barométrique, la lumière ambiante et la couleur RVB. Tout le code de ce post, y compris l’esquisse, peut être trouvé sur GitHub.
La télémétrie des capteurs sera annoncée par le Sense, sur BLE, comme un Service de Détection de l’Environnement du GATT (Numéro attribué au GATT 0x181A) avec plusieurs caractéristiques du GATT. Chaque caractéristique représente une lecture du capteur et contient la ou les valeurs les plus courantes du capteur, par exemple la température (0x2A6E) ou l’humidité (0x2A6F).
Chaque caractéristique du GATT définit comment les données doivent être représentées. Pour représenter les données avec précision, les lectures du capteur doivent être modifiées. Par exemple, en utilisant la bibliothèque ArduinoHTS221, la température est capturée avec deux décimales de précision (par exemple, 22,21 ° C). Cependant, la caractéristique GATT de température (0x2A6E) nécessite une valeur signée de 16 bits (-32 768 – 32 767). Pour maintenir la précision, la valeur capturée (par exemple, 22,21 ° C) est multipliée par 100 pour la convertir en un entier (par exemple, 2221). Le Raspberry Pi se chargera ensuite de convertir la valeur à la valeur d’origine avec la précision correcte.
La spécification du GATT n’a pas de caractéristique prédéfinie actuelle représentant la lumière ambiante et la couleur RVB. Par conséquent, j’ai créé une caractéristique personnalisée pour les valeurs de couleur et je lui ai attribué un identifiant universellement unique (UUID).
Selon la documentation, la lumière ambiante et la couleur RVB sont capturées sous forme de valeurs de 16 bits (une plage de 0 à 65 535). Cependant, en utilisant la bibliothèque ArduinoAPDS9960, j’ai trouvé que l’échelle des lectures se situait dans une plage de 0 à 4097. Sans plonger dans les mauvaises herbes, la valeur maximale de comptage (ou de saturation) est variable. Il peut être calculé en fonction du temps d’intégration et de la taille du registre de comptage (par exemple, 16 bits). Le temps d’intégration ADC semble être défini sur 10 ms dans le fichier de la bibliothèque, Arduino_APDS9960.cpp.
Les valeurs RVB sont généralement représentées sous forme de couleur 8 bits. Nous pourrions convertir les valeurs en 8 bits avant de les envoyer ou les gérer plus tard sur la passerelle IoT Raspberry Pi. Pour des raisons de démonstration par rapport à l’efficacité du transfert de données, l’esquisse concatène les valeurs de 12 bits ensemble sous forme de chaîne (par exemple, 4097,2811,1500,4097
). La chaîne sera convertie de 12 bits à 8 bits sur le Raspberry Pi (par exemple, 255,175,93,255
).
Prévisualisation et débogage des services de périphériques BLE
Avant d’examiner le code en cours d’exécution sur le Raspberry Pi, nous pouvons utiliser n’importe quel nombre d’applications mobiles pour prévisualiser et déboguer le service de détection environnementale en cours d’exécution sur l’Arduino et annoncé sur BLE. Une application couramment recommandée est nRF Connect de Nordic Semiconductor pour Mobile, disponible sur Google Play. J’ai trouvé que la version Android fonctionne mieux pour interpréter et afficher correctement les valeurs caractéristiques du GATT que la version iOS de l’application.
Ci-dessous, nous voyons une analyse de mon voisinage local pour les appareils BLE annoncés, en utilisant la version Android de l’application mobile nRF Connect. Notez l’appareil BLE, ArduinoNano33BLESense (indiqué en rouge). Notez également l’adresse de contrôle d’accès au support (adresse MAC) de ce périphérique BLE, dans mon cas, d1:aa:89:0c:ee:82
. L’adresse MAC sera requise ultérieurement sur la passerelle IoT.
En se connectant à l’appareil, nous voyons trois services. Le Service de détection de l’environnement (indiqué en rouge) contient les lectures du capteur.
En fouillant dans le Service de détection de l’Environnement (0x181A), nous voyons les quatre Caractéristiques attendues: Température (0x2A6E), Humidité (0x2A6F), Pression (0x2A6D) et Caractéristique inconnue (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Étant donné que nRF Connect ne peut pas reconnaître la lecture du capteur de couleur comme une caractéristique enregistrée du GATT (aucun numéro attribué au GATT), elle est affichée comme une Caractéristique inconnue. Alors que les valeurs de température, d’humidité et de pression (indiquées en rouge) sont interprétées et affichées correctement, la lecture du capteur de couleur est laissée sous forme de texte hexadécimal brut (par exemple, 30-2c-30-2c-30-2c-30-00
ou 0,0,0,0
).
Ces résultats indiquent que tout fonctionne comme prévu.
Code Python du client BLE
Pour agir en tant que client BLE (périphérique central), le Raspberry Pi exécute un script Python. Le script, rasppi_ble_receiver.py, utilise le module Python bluepy pour l’interfaçage avec les périphériques BLE via Bluez, sous Linux.
Pour exécuter le script Python, exécutez la commande suivante, en remplaçant l’argument d’adresse MAC par l’adresse MAC annoncée de votre propre périphérique BLE.
python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82
Contrairement à l’application nRF Connect, le module bluepy Python n’est pas capable d’interpréter et d’afficher correctement les valeurs caractéristiques du GATT. Par conséquent, le script prend le texte hexadécimal brut entrant de l’Arduino et le contraint aux valeurs correctes. Par exemple, une lecture de température doit être transformée d’octets, b'\xb8\x08\x00\x00'
, en un tableau d’octets, bytearray(b'\xb8\x08\x00\x00')
, puis en un entier, 2232
, puis en une décimale, 22.32
, et enfin à l’échelle Fahrenheit, 72.18°F
.
Les lectures du capteur sont récupérées du dispositif BLE toutes les deux secondes. En plus d’afficher les lectures numériques du capteur, le script Python affiche également un échantillon de couleur de la couleur RVB 8 bits, ainsi qu’un échantillon en niveaux de gris représentant l’intensité lumineuse à l’aide du module colr Python.
L’enregistrement d’écran suivant montre une vue parallèle du moniteur série Arduino et de la sortie du terminal du Raspberry Pi. Le Raspberry Pi (périphérique central) se connecte à l’Arduino (périphérique périphérique) lorsque le script Python est démarré. Le Raspberry Pi lit et interprète avec succès les données de télémétrie du Service de détection de l’environnement.
Conclusion
Dans cet article, nous avons exploré l’utilisation de la BLE et de la spécification du GATT pour transmettre des données de capteurs environnementaux d’un périphérique à un périphérique central. Compte tenu de sa faible consommation d’énergie et de profils bien développés, tels que le GATT, Bluetooth Low Energy (BLE) est un protocole sans fil à courte portée idéal pour les appareils IoT.