komma igång med Bluetooth Low Energy (BLE) och Generic Attribute Profile (GATT) specifikation för IoT
enligt Wikipedia är Bluetooth en trådlös teknikstandard som används för utbyte av data mellan fasta och mobila enheter över korta avstånd. Bluetooth Low Energy (Bluetooth LE eller BLE) är en trådlös personal area network (WPAN) teknik som utformats och marknadsförs av Bluetooth Special Interest Group (Bluetooth SIG). Enligt Bluetooth SIG är BLE konstruerad för mycket låg effektdrift. BLE stöder datahastigheter från 125 Kb/s till 2 Mb/s, med flera effektnivåer från 1 milliwatt (mW) till 100 mW. Flera viktiga faktorer påverkar det effektiva intervallet för en pålitlig Bluetooth-anslutning, som kan variera från en kilometer ner till mindre än en meter. Den nyare generationen Bluetooth 5 ger en teoretisk 4x-intervallförbättring jämfört med Bluetooth 4.2, från cirka 200 fot (60 meter) till 800 fot (240 meter).
Wikipedia listar för närvarande 36 definitioner av Bluetooth-profiler definierade och antagna av Bluetooth SIG, inklusive GATT-specifikationen (Generic Attribute Profile). Enligt Bluetooth SIG är GATT byggt ovanpå Attributprotokollet (att) och etablerar gemensamma operationer och ett ramverk för data som transporteras och lagras av ATT. GATT tillhandahåller profil upptäckt och beskrivning tjänster för BLE-protokollet. Den definierar hur att-attribut grupperas i uppsättningar för att bilda tjänster.
med tanke på dess låga energiförbrukning och välutvecklade profiler, såsom GATT, BLE är en idealisk kort räckvidd trådlöst protokoll för sakernas Internet (IoT) enheter, jämfört med konkurrerande protokoll, såsom ZigBee, Bluetooth classic, och Wi-Fi. I det här inlägget kommer vi att undersöka användningen av BLE och GATT-specifikationen för att överföra miljösensordata från en IoT-Sensor till en IoT-Gateway.
IoT Sensor
i det här inlägget kommer vi att använda en Arduino single-board microcontroller för att fungera som en IoT-sensor, faktiskt en rad sensorer. Det 3.3 V AI-aktiverade Arduino Nano 33 BLE Sense-kortet, som släpptes i augusti 2019, levereras med den kraftfulla nrf52840-processorn från Nordic Semiconductors, en 32-bitars ARM Cortex-M4-CPU som körs vid 64 MHz, 1 MB CPU-flashminne, 256 KB SRAM och en NINA-B306 fristående Bluetooth 5 low energy-modul.
Sense innehåller också en imponerande uppsättning inbyggda sensorer:
- 9-axel Tröghetssensor( LSM9DS1): 3D digital linjär accelerationssensor, en 3D digital
vinkelhastighetssensor och en 3D digital magnetisk sensor - fukt-och temperatursensor( HTS221): kapacitiv digital sensor för relativ fuktighet och temperatur
- barometrisk Sensor( LPS22HB): MEMS nano trycksensor: 260-1260 hektoPascal (hPa) absolut digital utgång barometer
- mikrofon (Mp34dt05): MEMS ljudsensor omnidirectional digital mikrofon
- gest, närhet, ljusfärg och Ljusintensitetssensor (APDS9960): avancerad Gestdetektering, Närhetsdetektering, Digital Ambient Light Sense (ALS) och Color Sense (Rgbc).
Sense är en utmärkt, billig enkortsmikrokontroller för att lära sig att samla in och överföra IoT-sensordata.
IoT Gateway
en IoT Gateway, enligt TechTarget, är en fysisk enhet eller programvara som fungerar som anslutningspunkt mellan molnet och styrenheter, sensorer och intelligenta enheter. All data som flyttar till molnet, eller vice versa, går genom porten, som kan vara antingen en dedikerad hårdvaruapparat eller programvara.
i det här inlägget kommer vi att använda en ny generation Raspberry Pi 3 Model B+ single-board computer (SBC) för att fungera som en IoT-Gateway. Denna Raspberry Pi-modell har ett 1,4 GHz Cortex-A53 (ARMv8) 64-bitars fyrkärnig processorsystem på ett Chip (SoC), 1 GB LPDDR2 SDRAM, trådlöst LAN med dubbla band, Bluetooth 4.2 BLE och Gigabit Ethernet.
för att följa med posten kan du ersätta Raspberry Pi för vilken Linux-baserad maskin som helst för att köra det medföljande Python-skriptet.
Arduino kommer att överföra IoT-sensortelemetri, över BLE, till Raspberry Pi. Raspberry Pi, som använder Wi-Fi eller Ethernet, kan sedan säkert överföra sensorns telemetridata till molnet. I Bluetooth-terminologi kommer Bluetooth-kringutrustningen (aka GATT-servern), som är Arduino, att överföra data till Bluetooth-centralenheten (aka GATT-klienten), som är Raspberry Pi.
Arduino Sketch
för dem som inte känner till Arduino är en skiss det namn som Arduino använder för ett program. Det är kodenheten som laddas upp i icke-flyktigt flashminne och körs på ett Arduino-kort. Arduino-språket är en uppsättning C / C++ – funktioner. Alla standard C-och C++ – konstruktioner som stöds av AVR-g++ – kompilatorn ska fungera i Arduino.
för det här inlägget, skissen, combo_sensor_ble.ino, innehåller all kod som krävs för att samla in miljösensortelemetri, inklusive temperatur, relativ fuktighet, barometertryck och omgivande ljus och RGB-färg. All kod för detta inlägg, inklusive skissen, finns på GitHub.
sensortelemetri kommer att annonseras av Sense, över BLE, som en GATT Environmental Sensing Service (GATT tilldelat nummer 0x181A) med flera GATT-egenskaper. Varje egenskap representerar en sensoravläsning och innehåller de mest aktuella sensorvärdena, till exempel temperatur (0x2A6E) eller fuktighet (0x2a6f).
varje GATT-egenskap definierar hur data ska representeras. För att representera data korrekt måste sensoravläsningarna ändras. Till exempel, med hjälp av arduinohts221 bibliotek, är temperaturen fångas med två decimaler precision (t.ex. 22,21 kub C). Emellertid temperaturen GATT karakteristiska (0x2A6E) kräver en signerad 16-bitars värde (- 32,768–32,767). För att bibehålla precisionen multipliceras det infångade värdet (t.ex. 22,21 C) med 100 för att konvertera det till ett heltal (t. ex. 2221). Raspberry Pi hanterar sedan konvertering av värdet tillbaka till det ursprungliga värdet med rätt precision.
GATT-specifikationen har ingen aktuell fördefinierad egenskap som representerar omgivande ljus och RGB-färg. Därför har jag skapat en anpassad egenskap för färgvärdena och tilldelat den en universellt unik identifierare (UUID).
enligt dokumentationen fångas omgivande ljus och RGB-färg som 16-bitars värden (ett intervall på 0-65, 535). Men med hjälp av arduinoapds9960-biblioteket har jag funnit att avläsningens Skala ligger inom ett intervall av 0-4097. Utan att dyka in i ogräset är det maximala värdet (eller mättnaden) variabelt. Det kan beräknas baserat på integrationstiden och storleken på räkningsregistret (t.ex. 16-bitar). ADC-integrationstiden verkar vara inställd på 10 ms i bibliotekets fil, Arduino_APDS9960.cpp.
RGB-värden representeras vanligtvis som 8-bitars färg. Vi kan konvertera värdena till 8-bitars innan vi skickar eller hanterar det senare på Raspberry Pi IoT Gateway. För demonstrationsändamål kontra dataöverföringseffektivitet sammanfogar skissen 12-bitarsvärdena tillsammans som en sträng (t.ex. 4097,2811,1500,4097
). Strängen kommer att konverteras från 12-bitars till 8-bitars på Raspberry Pi (t.ex. 255,175,93,255
).
förhandsgranska och felsöka BLE Device Services
innan vi tittar på koden som körs på Raspberry Pi kan vi använda valfritt antal mobilapplikationer för att förhandsgranska och felsöka Miljöavkänningstjänsten som körs på Arduino och annonseras över BLE. En vanlig rekommenderad applikation är Nordic Semiconductors NRF Connect för Mobil, tillgänglig på Google Play. Jag har hittat Android-versionen fungerar bättre på att korrekt tolka och visa GATT karakteristiska värden än iOS-versionen av appen.
nedan ser vi en genomsökning av min lokala närhet för BLE enheter som annonseras, med hjälp av Android-versionen av NRF Connect mobilapplikation. Notera BLE enheten, ArduinoNano33BLESense (anges i rött). Observera också media access control-adressen (MAC-adress) för den BLE-enheten, i mitt fall d1:aa:89:0c:ee:82
. MAC-adressen kommer att krävas senare på IoT Gateway.
anslutning till enheten ser vi tre tjänster. Miljöavkänningstjänsten (indikerad i rött) innehåller sensoravläsningarna.
borrning ner i Miljöavkänningstjänsten (0x181A) ser vi de fyra förväntade egenskaperna: temperatur (0x2a6e), Fuktighet (0x2a6f), Tryck (0x2A6D) och okänd egenskap (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Eftersom nRF Connect inte kan känna igen färgsensoravläsningen som en registrerad GATT-egenskap (inget GATT-tilldelat nummer) visas den som en okänd egenskap. Medan temperatur -, fuktighets-och tryckvärdena (indikerade i rött) tolkas och visas korrekt, lämnas färgsensorns avläsning som rå hexadecimal text (t.ex. 30-2c-30-2c-30-2c-30-00
eller 0,0,0,0
).
dessa resultat indikerar att allt fungerar som förväntat.
BLE Client Python-kod
för att fungera som BLE-klienten (aka central device) kör Raspberry Pi ett Python-skript. Skriptet, rasppi_ble_receiver.py, använder bluepy Python-modulen för gränssnitt med BLE-enheter via Bluez, på Linux.
för att köra Python-skriptet, kör följande kommando och ersätt Mac-adressargumentet för din egen BLE-enhetens annonserade MAC-adress.
python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82
till skillnad från NRF Connect-appen kan bluepy Python-modulen inte tolka och visa GATT-karakteristiska värden korrekt. Därför tar manuset den råa, inkommande hexadecimala texten från Arduino och tvingar den till rätt värden. Till exempel måste en temperaturavläsning omvandlas från byte, b'\xb8\x08\x00\x00'
, till en byte-array, bytearray(b'\xb8\x08\x00\x00')
, sedan till ett heltal, 2232
, sedan till en decimal, 22.32
och slutligen till Fahrenheit-skalan, 72.18°F
.
sensoravläsningar hämtas från BLE-enheten varannan sekund. Förutom att visa de numeriska sensoravläsningarna visar Python-skriptet också en färgprov av 8-bitars RGB-färg, liksom en gråskala som representerar ljusintensiteten med hjälp av colr Python-modulen.
följande skärminspelning visar en parallell vy av både Arduino Serial Monitor och Raspberry Pi: s terminalutgång. Raspberry Pi (central enhet) ansluts till Arduino (kringutrustning) när Python-skriptet startas. Raspberry Pi läser och tolkar framgångsrikt telemetridata från Miljöavkänningstjänsten.
slutsats
i det här inlägget undersökte vi användningen av BLE och GATT-specifikationen för att överföra miljösensordata från en kringutrustning till en central enhet. Med tanke på dess låga energiförbrukning och välutvecklade profiler, som GATT, är Bluetooth Low Energy (BLE) ett idealiskt trådlöst protokoll med kort räckvidd för IoT-enheter.