Erste Schritte mit Bluetooth Low Energy (BLE) und Generic Attribute Profile (GATT) Spezifikation für IoT
Laut Wikipedia ist Bluetooth ein drahtloser Technologiestandard, der für den Datenaustausch zwischen festen und mobilen Geräten über kurze Entfernungen verwendet wird. Bluetooth Low Energy (Bluetooth LE oder BLE) ist eine WPAN-Technologie (Wireless Personal Area Network), die von der Bluetooth Special Interest Group (Bluetooth SIG) entwickelt und vermarktet wird. Laut Bluetooth SIG ist BLE für den Betrieb mit sehr geringem Stromverbrauch ausgelegt. BLE unterstützt Datenraten von 125 Kb / s bis 2 Mb / s mit mehreren Leistungsstufen von 1 Milliwatt (mW) bis 100 mW. Mehrere Schlüsselfaktoren beeinflussen die effektive Reichweite einer zuverlässigen Bluetooth-Verbindung, die von einem Kilometer bis zu weniger als einem Meter variieren kann. Die neuere generation Bluetooth 5 bietet eine theoretische 4x bereich verbesserung über Bluetooth 4,2, von etwa 200 fuß (60 meter) zu 800 fuß (240 meter).
Wikipedia listet derzeit 36 Definitionen von Bluetooth-Profilen auf, die von der Bluetooth SIG definiert und übernommen wurden, einschließlich der GATT-Spezifikation (Generic Attribute Profile). Laut der Bluetooth SIG basiert GATT auf dem Attribute Protocol (ATT) und legt gemeinsame Operationen und einen Rahmen für die vom ATT transportierten und gespeicherten Daten fest. GATT bietet Profilermittlungs- und Beschreibungsdienste für das BLE-Protokoll. Es definiert, wie ATT-Attribute zu Sätzen zusammengefasst werden, um Dienste zu bilden.
Aufgrund seines geringen Energieverbrauchs und seiner gut entwickelten Profile wie GATT ist BLE im Vergleich zu konkurrierenden Protokollen wie ZigBee, Bluetooth Classic und Wi-Fi ein ideales drahtloses Kurzstreckenprotokoll für IoT-Geräte (Internet of Things). In diesem Beitrag werden wir die Verwendung von BLE und der GATT-Spezifikation zur Übertragung von Umgebungssensordaten von einem IoT-Sensor an ein IoT-Gateway untersuchen.
IoT-Sensor
In diesem Beitrag verwenden wir einen Arduino-Single-Board-Mikrocontroller, der als IoT-Sensor dient, eigentlich ein Array von Sensoren. Das 3,3-V-AI-fähige Arduino Nano 33 BLE Sense-Board, das im August 2019 veröffentlicht wurde, verfügt über den leistungsstarken nRF52840-Prozessor von Nordic Semiconductors, eine 32-Bit-ARM Cortex-M4-CPU mit 64 MHz, 1 MB CPU-Flash-Speicher, 256 KB SRAM und ein eigenständiges NINA-B306 Bluetooth 5 Low Energy-Modul.
Der Sense enthält auch eine beeindruckende Reihe eingebetteter Sensoren:
- 9- achse Inertial Sensor (LSM9DS1): 3D digitale lineare beschleunigung sensor, eine 3D digitale
winkel rate sensor, und eine 3D digitale magnetische sensor - Feuchtigkeit und Temperatur Sensor (HTS221): Kapazitive digitale sensor für relative feuchtigkeit und temperatur
- Barometrischen Sensor (LPS22HB): MEMS nano druck sensor: 260-1260 hektopascal (hPa) absolute digital ausgang barometer
- Mikrofon (MP34DT05): MEMS audio sensor omnidirektionale digitale mikrofon
- Geste, Proximity, Licht Farbe, und Licht Intensität Sensor (APDS9960): Erweiterte Geste erkennung, Proximity erkennung, Digitale Umgebungs Licht Sinn (ALS), und Farbe Sinn (RGBC).
Der Sense ist ein hervorragender, kostengünstiger Single-Board-Mikrocontroller zum Erlernen des Sammelns und Übertragens von IoT-Sensordaten.
IoT-Gateway
Ein IoT-Gateway ist laut TechTarget ein physisches Gerät oder Softwareprogramm, das als Verbindungspunkt zwischen der Cloud und Steuerungen, Sensoren und intelligenten Geräten dient. Alle Daten, die in die Cloud verschoben werden oder umgekehrt, durchlaufen das Gateway, bei dem es sich entweder um eine dedizierte Hardware-Appliance oder ein Softwareprogramm handeln kann.
In diesem Beitrag verwenden wir einen Raspberry Pi 3 Model B+ Single-Board-Computer (SBC) der neuesten Generation, der als IoT-Gateway dient. Diese Raspberry Pi modell verfügt über eine 1,4 GHz Cortex-A53 (ARMv8) 64-bit quad-core prozessor System auf einem Chip (SoC), 1 gb LPDDR2 SDRAM, dual-band wireless LAN, Bluetooth 4.2 BLE, und Gigabit Ethernet.
Um dem Beitrag zu folgen, können Sie den Raspberry Pi durch einen beliebigen Linux-basierten Computer ersetzen, um das mitgelieferte Python-Beispielskript auszuführen.
Der Arduino überträgt IoT-Sensortelemetrie über BLE an den Raspberry Pi. Der Raspberry Pi kann dann über WLAN oder Ethernet die Sensortelemetriedaten sicher in die Cloud übertragen. In der Bluetooth-Terminologie überträgt das Bluetooth-Peripheriegerät (auch bekannt als GATT-Server), bei dem es sich um den Arduino handelt, Daten an das Bluetooth-Zentralgerät (auch bekannt als GATT-Client), bei dem es sich um den Raspberry Pi handelt.
Arduino Sketch
Für diejenigen, die mit Arduino nicht vertraut sind, ist eine Skizze der Name, den Arduino für ein Programm verwendet. Es ist die Codeeinheit, die in den nichtflüchtigen Flash-Speicher hochgeladen wird und auf einem Arduino-Board ausgeführt wird. Die Arduino-Sprache ist eine Reihe von C / C ++ – Funktionen. Alle Standard-C- und C ++ – Konstrukte, die vom avr-g ++ – Compiler unterstützt werden, sollten in Arduino funktionieren.
Für diesen Beitrag, die Skizze, combo_sensor_ble.ino, enthält alle code notwendig zu sammeln umwelt sensor telemetrie, einschließlich temperatur, relative feuchtigkeit, luftdruck, und umgebungs licht und RGB farbe. Der gesamte Code für diesen Beitrag, einschließlich der Skizze, kann auf GitHub gefunden werden.
Die Sensortelemetrie wird vom Sense über BLE als GATT Environmental Sensing Service (GATT zugewiesene Nummer 0x181A) mit mehreren GATT-Merkmalen beworben. Jedes Merkmal stellt einen Sensorwert dar und enthält die aktuellsten Sensorwerte, z. B. Temperatur (0x2A6E) oder Luftfeuchtigkeit (0x2A6F).
Jedes GATT-Merkmal definiert, wie die Daten dargestellt werden sollen. Um die Daten genau darzustellen, müssen die Sensorwerte geändert werden. Zum beispiel, mit ArduinoHTS221 bibliothek, die temperatur ist erfasst mit zwei dezimalstellen von präzision (zb, 22.21 °C). Die Temperatur-GATT-Kennlinie (0x2A6E) erfordert jedoch einen vorzeichenbehafteten 16–Bit-Wert (-32.768-32.767). Um die Genauigkeit beizubehalten, wird der erfasste Wert (z. B. 22,21 ° C) mit 100 multipliziert, um ihn in eine ganze Zahl (z. B. 2221) umzuwandeln. Der Raspberry Pi konvertiert dann den Wert mit der richtigen Genauigkeit wieder in den ursprünglichen Wert.
Die GATT-Spezifikation hat keine aktuelle vordefinierte Charakteristik, die Umgebungslicht und RGB-Farbe darstellt. Daher habe ich ein benutzerdefiniertes Merkmal für die Farbwerte erstellt und ihm einen Universally Unique Identifier (UUID) zugewiesen.
Gemäß der Dokumentation werden Umgebungslicht und RGB-Farbe als 16-Bit-Werte (ein Bereich von 0-65.535) erfasst. Mit der ArduinoAPDS9960-Bibliothek habe ich jedoch festgestellt, dass die Skala der Messwerte in einem Bereich von 0-4097 liegt. Ohne in das Unkraut einzutauchen, ist der maximale Zählungswert (oder Sättigungswert) variabel. Es kann basierend auf der Integrationszeit und der Größe des Zählregisters (z. B. 16 Bit) berechnet werden. Die ADC-Integrationszeit scheint in der Bibliotheksdatei Arduino_APDS9960 auf 10 ms eingestellt zu sein.cpp.
RGB-Werte werden typischerweise als 8-Bit-Farbe dargestellt. Wir könnten die Werte vor dem Senden in 8-Bit konvertieren oder später auf dem Raspberry Pi IoT Gateway verarbeiten. Aus Gründen der Demonstrationszwecke und der Datenübertragungseffizienz verkettet die Skizze die 12-Bit-Werte als Zeichenfolge (z. B. 4097,2811,1500,4097
). Die Zeichenfolge wird auf dem Raspberry Pi von 12-Bit in 8-Bit konvertiert (z. B. 255,175,93,255
).
Vorschau und Debugging von BLE-Gerätediensten
Bevor wir uns den auf dem Raspberry Pi ausgeführten Code ansehen, können wir eine beliebige Anzahl mobiler Anwendungen verwenden, um eine Vorschau und ein Debugging des auf dem Arduino ausgeführten und über BLE beworbenen Environmental Sensing-Dienstes anzuzeigen. Eine häufig empfohlene Anwendung ist Nordic Semiconductor nRF Connect für Mobile, auf Google Play verfügbar. Ich habe festgestellt, dass die Android-Version die GATT-Kennwerte besser korrekt interpretiert und anzeigt als die iOS-Version der App.
Unten sehen wir einen Scan meiner lokalen Umgebung für BLE-Geräte, die mit der Android-Version der mobilen nRF Connect-Anwendung beworben werden. Beachten Sie das BLE-Gerät ArduinoNano33BLESense (rot angezeigt). Beachten Sie auch die Media Access Control-Adresse (MAC-Adresse) dieses BLE-Geräts, in meinem Fall d1:aa:89:0c:ee:82
. Die MAC-Adresse wird später auf dem IoT-Gateway benötigt.
Wenn Sie eine Verbindung zum Gerät herstellen, sehen Sie drei Dienste. Der Environmental Sensing Service (rot gekennzeichnet) enthält die Sensorwerte.
Beim Drilldown in den Environmental Sensing Service (0x181A) sehen wir die vier erwarteten Merkmale: Temperatur (0x2A6E), Luftfeuchtigkeit (0X2A6F), Druck (0x2A6D) und unbekannte Eigenschaft (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Da nRF Connect den Farbsensorwert nicht als registriertes GATT-Merkmal (keine GATT-zugewiesene Nummer) erkennen kann, wird er als unbekanntes Merkmal angezeigt. Während die Temperatur-, Feuchtigkeits- und Druckwerte (rot dargestellt) korrekt interpretiert und angezeigt werden, bleibt der Farbsensorwert als roher hexadezimaler Text (z. B. 30-2c-30-2c-30-2c-30-00
oder 0,0,0,0
) erhalten.
Diese Ergebnisse zeigen, dass alles wie erwartet funktioniert.
BLE-Client Python-Code
Um als BLE-Client (auch bekannt als zentrales Gerät) zu fungieren, führt der Raspberry Pi ein Python-Skript aus. Das Skript rasppi_ble_receiver.py verwendet das bluepy Python-Modul für die Schnittstelle zu BLE-Geräten über Bluez unter Linux.
Um das Python-Skript auszuführen, führen Sie den folgenden Befehl aus und ersetzen Sie das Argument MAC-Adresse durch die angegebene MAC-Adresse Ihres eigenen BLE-Geräts.
python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82
Im Gegensatz zur nRF Connect App ist das bluepy Python Modul nicht in der Lage, die GATT Kennwerte korrekt zu interpretieren und anzuzeigen. Daher nimmt das Skript den rohen, eingehenden hexadezimalen Text vom Arduino und zwingt ihn zu den richtigen Werten. Beispielsweise muss ein Temperaturwert von Bytes b'\xb8\x08\x00\x00'
in ein Byte-Array bytearray(b'\xb8\x08\x00\x00')
, dann in eine Ganzzahl 2232
, dann in eine Dezimalzahl 22.32
und schließlich in die Fahrenheit-Skala 72.18°F
transformiert werden.
Sensorwerte werden alle zwei Sekunden vom BLE-Gerät abgerufen. Neben der Anzeige der numerischen Sensorwerte zeigt das Python-Skript auch ein Farbfeld der 8-Bit-RGB-Farbe sowie ein Graustufenmuster an, das die Lichtintensität mithilfe des Python-Moduls colr darstellt.
Die folgende Bildschirmaufnahme zeigt eine parallele Ansicht des seriellen Arduino-Monitors und des Terminalausgangs des Raspberry Pi. Der Raspberry Pi (zentrales Gerät) verbindet sich mit dem Arduino (Peripheriegerät), wenn das Python-Skript gestartet wird. Der Raspberry Pi liest und interpretiert erfolgreich die Telemetriedaten des Environmental Sensing Service.
Fazit
In diesem Beitrag haben wir die Verwendung von BLE und der GATT-Spezifikation zur Übertragung von Umgebungssensordaten von einem Peripheriegerät an ein zentrales Gerät untersucht. Aufgrund seines geringen Energieverbrauchs und seiner gut entwickelten Profile wie GATT ist Bluetooth Low Energy (BLE) ein ideales drahtloses Kurzstreckenprotokoll für IoT-Geräte.