BLE és GATT az IoT számára

a bejegyzés Audio verziója

a Wikipedia szerint a Bluetooth egy vezeték nélküli technológiai szabvány, amelyet a rögzített és a mobil eszközök közötti, rövid távolságra történő adatcserére használnak. A Bluetooth Low Energy (Bluetooth LE vagy ble) egy wireless personal area network (WPAN) technológia, amelyet a Bluetooth Special Interest Group (Bluetooth SIG) tervezett és forgalmaz. A Bluetooth SIG szerint a BLE-t nagyon alacsony fogyasztású működésre tervezték. A BLE támogatja az adatátviteli sebességet 125 Kb/s-tól 2 Mb / s-ig, több teljesítményszinttel 1 milliwatt (mW) – tól 100 mW-ig. Számos kulcsfontosságú tényező befolyásolja a megbízható Bluetooth-kapcsolat tényleges hatótávolságát, amely kilométerről kevesebb mint egy méterre változhat. Az újabb generációs Bluetooth 5 elméleti 4x hatótávolság-javulást biztosít a Bluetooth 4.2-hez képest, körülbelül 200 lábról (60 méter) 800 lábra (240 méter).

a Wikipedia jelenleg a Bluetooth SIG által meghatározott és elfogadott Bluetooth profilok 36 definícióját sorolja fel, beleértve a Generic Attribute Profile (GATT) specifikációt. A Bluetooth SIG szerint a GATT az Attribútumprotokoll (att) tetejére épül, és közös műveleteket és keretet hoz létre az ATT által szállított és tárolt adatokhoz. A GATT profilkeresési és leírási szolgáltatásokat nyújt a BLE protokollhoz. Meghatározza, hogy az ATT attribútumok hogyan csoportosulnak halmazokba a szolgáltatások kialakításához.

alacsony energiafogyasztása és jól fejlett profiljai, mint például a GATT, a BLE ideális rövid hatótávolságú vezeték nélküli protokoll a tárgyak internete (IoT) eszközök számára, összehasonlítva a Versengő protokollokkal, mint például a ZigBee, a Bluetooth classic és a Wi-Fi. Ebben a bejegyzésben megvizsgáljuk a BLE és a GATT specifikáció használatát a környezeti érzékelők adatainak IoT-érzékelőről IoT-átjáróra történő továbbítására.

IoT érzékelő

ebben a bejegyzésben egy Arduino egylapos mikrovezérlőt fogunk használni IoT érzékelőként, valójában érzékelők tömbjeként. A 3.3 V AI-kompatibilis Arduino Nano 33 BLE Sense tábla, amelyet 2019 augusztusában adtak ki, a Nordic Semiconductors erőteljes nrf52840 processzorával, egy 32 bites ARM Cortex-M4 64 MHz-en futó CPU-val, 1 MB CPU Flash memóriával, 256KB SRAM-mal és egy NINA-B306 önálló Bluetooth 5 alacsony energiájú modullal rendelkezik.

Arduino Nano 33 ble Sense (a fejlécek) a breadboard

A Sense is tartalmaz egy lenyűgöző tömb beágyazott érzékelők:

  • 9-tengely inerciális érzékelő (LSM9DS1): 3D digitális lineáris gyorsulás érzékelő, 3D digitális
    szögsebesség érzékelő és 3D digitális mágneses érzékelő
  • páratartalom és hőmérséklet érzékelő (HTS221): kapacitív digitális érzékelő relatív páratartalom és hőmérséklet
  • barometrikus érzékelő (LPS22HB): MEMS nano nyomásérzékelő: 260-1260 hectopascal (hPa) abszolút digitális kimeneti barométer
  • mikrofon (MP34DT05): MEMS audio érzékelő körsugárzó digitális mikrofon
  • gesztus, közelség, fényszín és fényintenzitás érzékelő (APDS9960): fejlett Gesztusérzékelés, Közelségérzékelés, digitális környezeti Fényérzék (ALS) és Színérzék (Rgbc).

A Sense egy kiváló, olcsó egylapos mikrokontroller az IoT-érzékelők adatainak gyűjtésére és továbbítására.

IoT Gateway

A TechTarget szerint az IoT Gateway egy fizikai eszköz vagy szoftver, amely a felhő és a vezérlők, érzékelők és intelligens eszközök közötti csatlakozási pontként szolgál. Minden adat mozog a felhő, vagy fordítva megy át az átjárón, amely lehet akár egy dedikált hardver eszköz vagy szoftver.

ebben a bejegyzésben egy újabb generációs Raspberry Pi 3 Model B+ egykártyás számítógépet (SBC) fogunk használni, hogy IoT átjáróként szolgáljunk. Ez a Raspberry Pi modell 1,4 GHz-es Cortex-A53 (ARMv8) 64 bites négymagos processzorrendszerrel rendelkezik chipen (SoC), 1 GB LPDDR2 SDRAM, kétsávos vezeték nélküli LAN, Bluetooth 4.2 BLE és Gigabit Ethernet.

hogy kövesse együtt a post, akkor helyettesítheti a Raspberry Pi bármely Linux-alapú gép futtatni a mellékelt minta Python script.

Raspberry Pi 3 B modell+

az Arduino továbbítja az IoT érzékelő telemetriáját a BLE-n keresztül a Raspberry Pi-hez. A Raspberry Pi Wi-Fi vagy Ethernet használatával képes biztonságosan továbbítani az érzékelő telemetriai adatait a felhőbe. A Bluetooth terminológiában a Bluetooth perifériás eszköz (más néven GATT szerver), amely az Arduino, adatokat továbbít a Bluetooth központi eszközre (más néven GATT kliens), amely a Raspberry Pi.

Arduino Sketch

azok számára, akik nem ismerik az Arduino – t, a sketch az a név, amelyet az Arduino használ egy programhoz. Ez a kódegység, amely feltöltődik a nem felejtő flash memóriába, és egy Arduino táblán fut. Az Arduino nyelv A C / C++ funkciók halmaza. Az avr-g++ fordító által támogatott összes szabványos C és C++ konstrukciónak az Arduino-ban kell működnie.

ehhez a bejegyzéshez a vázlat, combo_sensor_ble.az ino tartalmazza a környezeti érzékelő telemetriájának gyűjtéséhez szükséges összes kódot, beleértve a hőmérsékletet, a relatív páratartalmat, a légköri nyomást, valamint a környezeti fényt és az RGB színt. A bejegyzés összes kódja, beleértve a vázlatot is, megtalálható a Githubon.

az érzékelő telemetriáját a Sense hirdeti, ble felett, mint GATT Környezeti érzékelő szolgáltatás (GATT hozzárendelt szám 0x181A), több GATT jellemzővel. Minden jellemző egy érzékelő leolvasását jelenti, és tartalmazza a legfrissebb érzékelő értékeket, például a hőmérsékletet (0x2a6e) vagy a páratartalmat (0x2a6f).

minden GATT jellemző meghatározza az adatok ábrázolásának módját. Az adatok pontos ábrázolásához az érzékelő leolvasásait módosítani kell. Például az ArduinoHTS221 könyvtár használatával a hőmérsékletet két tizedesjegy pontossággal rögzítik(például 22,21 C). Azonban a hőmérséklet GATT jellemző (0x2A6E) igényel aláírt 16 bites érték (- 32,768-32,767). A pontosság fenntartása érdekében a rögzített értéket (például 22,21 C) megszorozzuk 100-zal, hogy egész számra konvertáljuk (például 2221). Ezután a Raspberry Pi kezeli az érték visszaállítását az eredeti értékre a megfelelő pontossággal.

a GATT specifikációnak nincs aktuális, előre meghatározott jellemzője, amely a környezeti fényt és az RGB színt képviselné. Ezért létrehoztam egy egyedi jellemzőt a színértékekhez, és hozzárendeltem egy univerzálisan egyedi azonosítót (uuid).

a dokumentáció szerint a környezeti fény és az RGB szín 16 bites értékként kerül rögzítésre (0-65, 535 tartomány). Az ArduinoAPDS9960 könyvtár használatával azonban azt tapasztaltam, hogy a leolvasások skálája 0-4097 tartományon belül van. A gyomokba merülés nélkül a maximális szám (vagy telítettség) értéke változó. Az integrációs idő és a számlálóregiszter mérete (pl. 16 bit) alapján számítható ki. Úgy tűnik, hogy az ADC integrációs ideje 10 ms-ra van állítva a könyvtár fájljában, Arduino_APDS9960.cpp.

az RGB értékeket általában 8 bites színként ábrázolják. Az értékeket 8 bitesre konvertálhatjuk, mielőtt elküldenénk vagy később kezelnénk a Raspberry Pi IoT átjárón. Az adatátvitel hatékonyságával szembeni demonstrációs célok érdekében a vázlat összefűzi a 12 bites értékeket karakterláncként (pl. 4097,2811,1500,4097). A karakterlánc 12 bitesről 8 bitesre konvertálódik a Raspberry Pi-n (például 255,175,93,255).

előnézet és hibakeresés BLE Device Services

mielőtt megnéznénk a Raspberry Pi-n futó kódot, tetszőleges számú mobilalkalmazást használhatunk az Arduino-n futó Környezeti érzékelő szolgáltatás előnézetéhez és hibakereséséhez, és a BLE-n keresztül hirdetjük. Általánosan ajánlott alkalmazás a Nordic Semiconductor NRF Connect for Mobile, elérhető a Google Playen. Megállapítottam, hogy az Android verzió jobban működik a GATT jellemző értékek helyes értelmezésében és megjelenítésében, mint az alkalmazás iOS verziója.

az alábbiakban az NRF Connect mobilalkalmazás Android verziójának használatával a helyi környezetem vizsgálatát látjuk a hirdetett BLE eszközök számára. Megjegyzés: a BLE eszköz, ArduinoNano33BLESense (piros). Vegye figyelembe az adott BLE eszköz media access control címét (MAC-címét) is, esetemben d1:aa:89:0c:ee:82. A MAC-címre később lesz szükség az IoT átjárón.

az eszközhöz csatlakozva három szolgáltatást látunk. A környezeti érzékelő szolgáltatás (pirossal jelölve) tartalmazza az érzékelő leolvasásait.

fúrás le a környezeti érzékelő szolgáltatás (0x181a), látjuk a négy várható jellemzők: hőmérséklet (0x2a6e), Páratartalom (0x2a6f), nyomás (0x2a6d), és ismeretlen jellemző (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Mivel az nRF Connect nem ismeri fel a színérzékelő leolvasását regisztrált GATT jellemzőként (nincs GATT hozzárendelt szám), ismeretlen jellemzőként jelenik meg. Míg a hőmérséklet -, páratartalom-és nyomásértékeket (pirossal jelölve) helyesen értelmezik és jelenítik meg, a színérzékelő leolvasása nyers hexadecimális szövegként marad (pl. 30-2c-30-2c-30-2c-30-00 vagy 0,0,0,0).

ezek az eredmények azt mutatják, hogy minden a várt módon működik.

ble kliens Python kód

a BLE kliens (más néven központi eszköz) működéséhez a Raspberry Pi egy Python szkriptet futtat. A szkript, rasppi_ble_receiver.py, a bluepy Python modult használja a BLE eszközökhöz való kapcsolódáshoz a Bluez-en keresztül, Linuxon.

a Python parancsfájl futtatásához hajtsa végre a következő parancsot, helyettesítve a MAC-cím argumentumot a saját BLE-eszköz hirdetett MAC-címével.

python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82

az nRF Connect alkalmazástól eltérően a bluepy Python modul nem képes a GATT karakterisztikus értékek helyes értelmezésére és megjelenítésére. Ezért a szkript veszi a nyers, bejövő hexadecimális szöveget az Arduino-ból, és a helyes értékekre kényszeríti. Például egy hőmérséklet-leolvasást át kell alakítani bájtokból, b'\xb8\x08\x00\x00', bájt tömbre, bytearray(b'\xb8\x08\x00\x00'), majd egész számra, 2232, majd tizedesre, 22.32, végül Fahrenheit skálára, 72.18°F.

az érzékelő leolvasása két másodpercenként történik a BLE készülékről. A numerikus érzékelő leolvasásainak megjelenítése mellett a Python szkript a 8 bites RGB szín színmintáját, valamint a colr Python modul segítségével a fényintenzitást képviselő szürkeárnyalatos színmintát is megjeleníti.

A következő képernyőfelvétel párhuzamos képet mutat mind az Arduino Soros monitorról, mind a Raspberry Pi terminál kimenetéről. A Raspberry Pi (központi eszköz) csatlakozik az Arduino-hoz (perifériás eszköz), amikor a Python szkript elindul. A Raspberry Pi sikeresen beolvassa és értelmezi a környezeti érzékelő szolgálat telemetriai adatait.

következtetés

ebben a bejegyzésben a BLE és a GATT specifikáció használatát vizsgáltuk a környezeti érzékelők adatainak perifériás eszközről központi eszközre történő továbbítására. Alacsony energiafogyasztása és jól kidolgozott profiljai, mint például a GATT, a Bluetooth Low Energy (ble) ideális rövid hatótávolságú vezeték nélküli protokoll az IoT eszközök számára.



+