BLE și GATT pentru IoT

versiunea Audio a postului

potrivit Wikipedia, Bluetooth este un standard de tehnologie fără fir utilizat pentru schimbul de date între dispozitive fixe și mobile pe distanțe scurte. Bluetooth Low Energy (Bluetooth LE sau BLE) este o tehnologie wireless personal area network (WPAN) proiectată și comercializată de Bluetooth Special Interest Group (Bluetooth SIG). Conform Bluetooth SIG, BLE este proiectat pentru funcționarea foarte scăzută a puterii. BLE acceptă rate de date de la 125 Kb/s la 2 Mb/s, cu mai multe niveluri de putere de la 1 milliwatt (mW) la 100 mW. Mai mulți factori cheie influențează gama eficientă a unei conexiuni Bluetooth fiabile, care poate varia de la un kilometru până la mai puțin de un metru. Noua generație Bluetooth 5 oferă o îmbunătățire teoretică a gamei 4x față de Bluetooth 4.2, de la aproximativ 200 de picioare (60 de metri) la 800 de picioare (240 de metri).

Wikipedia listează în prezent 36 de definiții ale profilurilor Bluetooth definite și adoptate de Bluetooth SIG, inclusiv specificația generic Attribute Profile (GATT). Conform Bluetooth SIG, GATT este construit pe partea de sus a Attribute Protocol (ATT) și stabilește operațiuni comune și un cadru pentru datele transportate și stocate de ATT. GATT oferă servicii de descoperire și descriere a profilului pentru protocolul BLE. Acesta definește modul în care atributele ATT sunt grupate împreună în seturi pentru a forma servicii.

având în vedere consumul redus de energie și profilurile bine dezvoltate, cum ar fi GATT, BLE este un protocol wireless ideal pentru dispozitivele Internet of Things (IoT), în comparație cu protocoalele concurente, cum ar fi ZigBee, Bluetooth classic și Wi-Fi. În acest post, vom explora utilizarea BLE și a specificației GATT pentru a transmite datele senzorilor de mediu de la un senzor IoT la un Gateway IoT.

senzor IoT

în acest post, vom folosi un microcontroler Arduino cu o singură placă pentru a servi ca senzor IoT, de fapt o serie de senzori. Placa Arduino Nano 33 ble Sense, activată AI de 3,3 V, lansată în August 2019, vine cu puternicul procesor Nrf52840 de la Nordic Semiconductors, un procesor ARM Cortex-M4 pe 32 de biți care rulează la 64 MHz, 1 MB de memorie flash CPU, 256KB de SRAM și un modul Bluetooth 5 autonom Nina-b306.

Arduino Nano 33 ble Sense (cu anteturi) pe panou

Sense conține, de asemenea, o gamă impresionantă de senzori încorporați:

  • 9-senzor inerțial axis (lsm9ds1): senzor digital de accelerație liniară 3D, senzor digital de viteză unghiulară 3D
    și senzor magnetic digital 3D
  • senzor de umiditate și temperatură (HTS221): senzor digital capacitiv pentru umiditate și temperatură relativă
  • senzor Barometric (LPS22HB): senzor de presiune Nano MEMS: 260-1260 hectopascal (hPa) barometru de ieșire digitală absolută
  • microfon (MP34DT05): senzor audio MEMS microfon digital omnidirecțional
  • senzor de gest, proximitate, Culoare lumină și intensitate lumină (APDS9960): detectare avansată a gesturilor, detectare de proximitate, sens Digital al luminii ambientale (ALS) și sens al culorii (Rgbc).

The Sense este un microcontroler excelent, cu costuri reduse, cu o singură placă, pentru a învăța despre colectarea și transmiterea datelor senzorului IoT.

Gateway IoT

un Gateway IoT, conform TechTarget, este un dispozitiv fizic sau un program software care servește ca punct de conexiune între Cloud și controlere, senzori și dispozitive inteligente. Toate datele care se deplasează în Cloud sau invers trec prin gateway, care poate fi fie un aparat hardware dedicat, fie un program software.

în acest post, vom folosi o generație recentă Raspberry Pi 3 Model B+ computer cu o singură placă (SBC), pentru a servi drept Gateway IoT. Acest model Raspberry Pi are un sistem de procesor quad-core de 1,4 GHz Cortex-A53 (ARMv8) pe 64 de biți pe un cip (SoC), 1 GB LPDDR2 SDRAM, LAN wireless dual-band, Bluetooth 4.2 BLE și Gigabit Ethernet.

pentru a urmări împreună cu postarea, puteți înlocui Raspberry Pi pentru orice mașină bazată pe Linux pentru a rula eșantionul inclus Python script.

Raspberry Pi 3 Model B+

Arduino va transmite telemetria senzorului IoT, peste BLE, către Raspberry Pi. Raspberry Pi, folosind Wi-Fi sau Ethernet, este apoi capabil să transmită în siguranță datele de telemetrie ale senzorului în Cloud. În terminologia Bluetooth, dispozitivul periferic Bluetooth (aka serverul GATT), care este Arduino, va transmite date către dispozitivul Central Bluetooth (aka clientul GATT), care este Raspberry Pi.

Arduino Sketch

pentru cei care nu sunt familiarizați cu Arduino, o schiță este numele pe care Arduino îl folosește pentru un program. Este unitatea de cod care este încărcată în memoria flash nevolatilă și rulează pe o placă Arduino. Limba Arduino este un set de funcții c / c++. Toate construcțiile standard C și C++ acceptate de compilatorul AVR-g++ ar trebui să funcționeze în Arduino.

pentru acest post, schița, combo_sensor_ble.ino, conține tot codul necesar pentru colectarea telemetriei senzorului de mediu, inclusiv temperatura, umiditatea relativă, presiunea barometrică și lumina ambientală și culoarea RGB. Tot codul pentru acest post, inclusiv schița, pot fi găsite pe GitHub.

telemetria senzorului va fi promovat de Sense, peste BLE, ca un serviciu de detectare a mediului GATT (GATT număr atribuit 0x181A) cu mai multe caracteristici GATT. Fiecare caracteristică reprezintă o citire a senzorului și conține cea mai mare valoare curentă a senzorului, de exemplu temperatura(0x2a6e) sau umiditatea (0x2a6f).

fiecare caracteristică GATT definește modul în care datele ar trebui să fie reprezentate. Pentru a reprezenta datele cu exactitate, citirile senzorului trebuie modificate. De exemplu, folosind biblioteca ArduinoHTS221, temperatura este captată cu două puncte zecimale de precizie (de exemplu, 22.21 c). Cu toate acestea, caracteristica de temperatură GATT (0x2a6e) necesită o valoare semnată pe 16 biți (- 32,768-32,767). Pentru a menține precizia, valoarea capturată (de exemplu, 22,21 CT) este înmulțită cu 100 pentru a o converti într-un număr întreg (de exemplu, 2221). Raspberry Pi se va ocupa apoi de conversia valorii înapoi la valoarea inițială cu precizia corectă.

specificația GATT nu are nicio caracteristică predefinită actuală care să reprezinte lumina ambientală și culoarea RGB. Prin urmare, am creat o caracteristică personalizată pentru valorile culorilor și i-am atribuit un identificator universal unic (UUID).

conform documentației, lumina ambientală și culoarea RGB sunt capturate ca valori pe 16 biți (un interval de 0-65,535). Cu toate acestea, folosind biblioteca ArduinoAPDS9960, am găsit scara citirilor într-un interval de 0-4097. Fără scufundări în buruieni, valoarea maximă a numărului (sau saturației) este variabilă. Acesta poate fi calculat pe baza timpului de integrare și dimensiunea registrului de numărare (de exemplu, 16 biți). Timpul de integrare ADC pare să fie setat la 10 ms în fișierul bibliotecii, Arduino_APDS9960.cpp.

valorile RGB sunt de obicei reprezentate ca culoare pe 8 biți. Am putea converti valorile la 8 biți înainte de a le trimite sau de a le gestiona mai târziu pe Raspberry Pi IoT Gateway. De dragul scopurilor demonstrative față de eficiența transferului de date, schița concatenează valorile pe 12 biți împreună ca un șir (de exemplu, 4097,2811,1500,4097). Șirul va fi convertit de la 12 biți la 8 biți pe Raspberry Pi (de exemplu, 255,175,93,255).

previzualizarea și depanarea BLE Device Services

înainte de a privi codul care rulează pe Raspberry Pi, putem folosi orice număr de aplicații mobile pentru a previzualiza și depana serviciul de detectare a mediului care rulează pe Arduino și a fi anunțat pe BLE. O aplicație recomandată în mod obișnuit este Nordic Semiconductor NRF Connect pentru mobil, disponibil pe Google Play. Am găsit versiunea Android funcționează mai bine la interpretarea corectă și afișarea valorilor caracteristice GATT decât versiunea iOS a aplicației.

mai jos, vedem o scanare a vecinătății mele locale pentru dispozitivele BLE care sunt anunțate, utilizând versiunea Android a aplicației mobile NRF Connect. Notă dispozitivul BLE, ArduinoNano33BLESense (indicat în roșu). De asemenea, rețineți adresa de control al accesului media (adresa MAC) a dispozitivului BLE, în cazul meu, d1:aa:89:0c:ee:82. Adresa MAC va fi necesară mai târziu pe Gateway-ul IoT.

conectându-ne la dispozitiv, vedem trei servicii. Serviciul de detectare a mediului (indicat cu roșu) conține citirile senzorului.

forarea în serviciul de detectare a mediului (0x181A), vedem cele patru caracteristici așteptate: temperatura (0x2A6E), umiditatea (0x2a6f), presiunea (0x2a6d) și caracteristica necunoscută (936b6a25-E503–4f7c-9349-bcc76c22b8c3). Deoarece NRF Connect nu poate recunoaște citirea senzorului de culoare ca o caracteristică GATT înregistrată (fără număr atribuit GATT), acesta este afișat ca o caracteristică necunoscută. În timp ce valorile de temperatură, umiditate și presiune (indicate cu roșu) sunt interpretate și afișate corect, citirea senzorului de culoare este lăsată ca text hexazecimal brut (de exemplu, 30-2c-30-2c-30-2c-30-00 sau 0,0,0,0).

aceste rezultate indică faptul că totul funcționează conform așteptărilor.

cod Python client ble

pentru a acționa ca Client BLE (aka dispozitiv central), Raspberry Pi rulează un script Python. Script-ul, rasppi_ble_receiver.py, utilizează modulul Bluepy Python pentru interfațarea cu dispozitivele BLE prin Bluez, pe Linux.

pentru a rula scriptul Python, executați următoarea comandă, înlocuind argumentul adresei MAC pentru adresa MAC anunțată a propriului dispozitiv BLE.

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

spre deosebire de aplicația NRF Connect, modulul Bluepy Python nu este capabil să interpreteze și să afișeze corect valorile caracteristice GATT. Prin urmare, scriptul preia textul hexazecimal brut, primit de la Arduino și îl constrânge la valorile corecte. De exemplu, o citire a temperaturii trebuie transformată din octeți, b'\xb8\x08\x00\x00', într-o matrice de octeți, bytearray(b'\xb8\x08\x00\x00'), apoi într-un număr întreg, 2232, apoi într-o zecimală, 22.32 și, în final, la scara Fahrenheit, 72.18°F.

citirile senzorilor sunt preluate de pe dispozitivul BLE la fiecare două secunde. În plus față de afișarea citirilor numerice ale senzorului, scriptul Python afișează, de asemenea, un specimen de culoare al culorii RGB pe 8 biți, precum și un specimen în tonuri de gri reprezentând intensitatea luminii folosind modulul Colr Python.

următoarea înregistrare pe ecran arată o vizualizare paralelă atât a monitorului Serial Arduino, cât și a ieșirii terminale a Raspberry Pi. Raspberry Pi (dispozitiv central) se conectează la Arduino (dispozitiv periferic) atunci când scriptul Python este pornit. Raspberry Pi citește și interpretează cu succes datele de telemetrie de la Serviciul de detectare a mediului.

concluzie

în acest post, am explorat utilizarea BLE și specificația GATT pentru a transmite datele senzorului de mediu de la un dispozitiv periferic la un dispozitiv central. Având în vedere consumul redus de energie și profilurile bine dezvoltate, cum ar fi GATT, Bluetooth Low Energy (BLE) este un protocol wireless ideal pentru dispozitivele IoT.



+