GATT server s ESP32-C6
ESP32-C6 patrí medzi veľmi praktické mikrokontroléry. Vo verzii na XIAO doske od Seeed Studio ide o vydarený vývojársky kit, ktorý obsahuje vstavaný nabíjací obvod pre Li-Pol aj Li-Ion batérie a zároveň umožňuje pripojenie periférií cez rozhrania SPI a I2C. Otestovali sme ho už napríklad ako samostatný senzorový modul s ultrazvukovým snímačom, ktorý odosielal údaje priamo do webového rozhrania hladinomera Watmonitor, alebo cez LoRa PPP komunikáciu do iného zariadenia so SX1278. Pri napájaní z batérie spotrebuje v hlbokom spánku len približne 15 µA, čo ho robí ideálnym riešením pre ultra-nízkoenergetické aplikácie.

Keďže podporuje aj Bluetooth Low Energy, je vhodný na projekty, kde môže slúžiť ako alternatíva k mikrokontrolérom nRF (Nordic) alebo MG24, ktoré sú takisto dostupné v XIAO prevedení s podporou BLE. Tentokrát sa zameriame na praktickú ukážku – vytvoríme GATT server priamo na tomto mikrokontroléri, ku ktorému sa bude možné pripojiť z mobilného telefónu a sledovať dáta v reálnom čase. Výhodou je, že všetky XIAO dosky majú rovnaké zapojenie pinov pre hardvérové zbernice (MOSI, MISO, SCK sú vždy na rovnakých pozíciách), líši sa iba číslovanie konkrétnych GPIO pinov podľa danej platformy.
Nebudeme využívať najnovšiu verziu BLE, ktorú ESP32-C6 zvláda (5.3), ale zvolíme staršiu verziu 4.2 (Legacy). Dôvodom je vyššia kompatibilita a jednoduchší prenos zdrojového kódu na iné ESP32 moduly, ako napríklad WROOM-32 alebo S3.
Protokol GATT predstavuje vrstvu, ktorá určuje spôsob organizácie a prístupu k dátam v rámci BLE. Informácie sú usporiadané do tzv. služieb, pričom každá služba obsahuje charakteristiky. Charakteristika uchováva konkrétnu hodnotu a zároveň definuje, aké operácie môže klient s týmito údajmi vykonávať. Najčastejšie ide o čítanie (READ) alebo automatické prijímanie nových hodnôt hneď po ich zmene – podobne, ako keď sa pri MQTT použije funkcia "subscribe". Existujú aj možnosti zápisu, tie však v tomto príklade nevyužijeme.
Takto sprístupnené údaje sa prenášajú cez akýsi BLE server. Klient, ktorý chce dáta vidieť sa musí k serveru pripojiť.

Keď klient začne vyhľadávať dostupné BLE zariadenia, naše zariadenie sa mu zobrazí, pretože pravidelne vysiela tzv. reklamné pakety (advertising packets). Súčasťou takéhoto paketu je aj UUID – jedinečný identifikátor služby. V našom prípade ide o 128-bitový kód, hoci UUID môže mať aj inú dĺžku.
Po nadviazaní spojenia si klient vyžiada zoznam dostupných služieb a následne sa spustí komunikácia s GATT serverom. Ten odpovie zoznamom služieb spolu s ich charakteristikami. Ak sa použije vlastnosť READ alebo NOTIFY, klient získa prístup aj k samotnej hodnote uložené v charakteristike.

Na testovanie môžeme využiť aplikáciu nRF Connect, ktorá umožňuje pracovať s GATT službami a charakteristikami. V prípade reálnej aplikácie sa dá využiť aj webová stránka s podporou Web Bluetooth API, ktorá sprístupní dáta priamo v prehliadači.
Aby sme mali k dispozícii reálne dáta pre testovanie, k mikrokontroléru ESP32-C6 som pripojil laserový ToF senzor vzdialenosti VL53L1X (známy aj ako TOF400C). Tento snímač, vyvinutý spoločnosťou STMicroelectronics, dokáže merať vzdialenosti až do 400 cm. O jeho princípe fungovania, vrátane detailov o použitom laseri, som už písal v samostatnom článku na blogu.
Poďme si teda ukázať, ako na to. ESP32 obsahuje v Arduino Core vstavané BLE API, no príslušné knižnice zaberajú veľa pamäte. Už aj pre menšie aplikácie je preto štandardná partícia s kapacitou 1,2 MB nedostatočná a je potrebné použiť upravenú tabuľku partícií. Z tohto dôvodu budeme dnešný GATT server implementovať pomocou odľahčenej knižnice NimBLEDevice.
Na komunikáciu so snímačom VL53L1X použijeme oficiálnu knižnicu od Pololu. Senzor bude bežať v režime nepretržitého merania s intervalom 200 ms a časovým limitom 50 ms pre samotné meranie. Ak sa do tohto času laserový lúč neodrazí späť do prijímača, meranie zlyhá, no program pokračuje ďalej. Výstupná hodnota zo senzora je v milimetroch, pričom pre získanie vzdialenosti v centimetroch je potrebné výsledok vydeliť číslom 10.

V knižnici NimBLEDevice využijeme štandardný GATT server s definovaným UUID služby a charakteristiky. Okrem toho môžeme použiť aj callback funkcie alebo triedy na detekciu pripojenia či odpojenia klienta. Keďže ESP32-C6 vysiela svoje reklamné pakety v pravidelných intervaloch, zariadenie ostáva viditeľné aj pre ďalších klientov, aj keď už je naň niekto pripojený. Na jednoduchšie pripojenie ESP32-C6 k perifériám môžeme využiť vlastnú prepojovaciu dosku XIAO_LoRa, prípadne alternatívne modul WM_MINI – oba produkty pochádzajú od spoločnosti Your-IoT.


Tieto moduly sú veľmi kompaktné, takže ich využitie je možné aj v nositeľnej elektronike – napríklad ako zariadenie zavesené na krku alebo ako malé príručné meradlo vzdialenosti. Praktické uplatnenie nájdu napríklad podlahári či maliari pri zameriavaní miestností. Pre takýchto používateľov však nRF Connect nie je vhodným riešením, potrebujú jednoduchšie prostredie – ideálne mobilnú aplikáciu alebo webovú aplikáciu.
Výhodou webovej aplikácie je, že moderné prehliadače natívne podporujú API pre BLE, takže nie je nutná žiadna inštalácia. Istou nevýhodou je, že server, na ktorom aplikácia beží, musí komunikovať s telefónom šifrovane, teda cez protokol HTTPS.
Pomocou HTML5 je možné rýchlo vytvoriť používateľské rozhranie, ktoré vizualizuje prijaté dáta. Podobne ako v nRF Connect, aj tu pri použití vlastnosti NOTIFY získavame nové hodnoty v intervale, ktorý sme si nastavili – napríklad každých 1000 ms, hoci BLE zvláda aj výrazne kratšie intervaly, pokojne pod 100 ms. Pri pokuse o pripojenie k zariadeniu API zobrazí výzvu na výber zariadenia. Nejde však o klasické párovanie, ale skôr o autorizáciu spojenia.
Po "párovaní" sa zariadenie spojí s telefónom priamo cez peer-to-peer komunikáciu – rovnako, ako sme to už videli v aplikácii nRF Connect. Následne sa dáta zobrazujú vo webovej aplikácii a automaticky sa aktualizujú vďaka vlastnosti NOTIFY. To znamená, že každých 1000 ms sa prenesie nová hodnota, ktorá sa okamžite zobrazí. V praxi ide o client-side webaplikáciu, ktorá funguje výhradne na strane používateľa.

Web Bluetooth API tu využíva filtrovanie podľa zvolených UUID, vďaka čomu sú konkrétne dáta odfiltrované a zobrazené v reálnom čase. Merané hodnoty sú presné a zodpovedajú reálnej vzdialenosti. Ich vizualizácia je zabezpečená jednoduchým zápisom cez JavaScript do príslušnej časti HTML rozhrania.
V tomto jednoduchom príklade nie je komunikácia medzi klientom a serverom cez BLE šifrovaná. Znamená to, že prenášané dáta môže zachytiť ktokoľvek. Pri aplikácii na meranie vzdialenosti to nepredstavuje problém, no pre citlivejšie nasadenia by to bolo riziko.
Knižnica NimBLE ponúka množstvo API funkcií, ktoré umožňujú aplikáciu rozšíriť a zabezpečiť – od nastavenia vysielacieho výkonu, cez rôzne formy asynchrónnej komunikácie až po šifrované prenosy. Obsahuje aj metódy na ochranu proti MITM útokom a podporuje použitie passkey, ktorý sa ukladá do NVS pamäte ESP32. Zdá sa však, že plnohodnotné Secure Connections, ktoré sú dnes štandardom pre bezpečnú BLE komunikáciu, zatiaľ implementované nie sú.
NimBLE má aj ukážkovú implementáciu vrstvy L2CAP, ktorá je nízkoúrovňovou časťou BLE. Umožňuje prenášať väčšie objemy dát v jednej správe a dosahuje nižšiu latenciu. Implementácia, ktorú som použil pre periodické meranie vzdialenosti cez BLE, má celkovú veľkosť 703 775 B, čo predstavuje približne 53 % štandardnej 1,2 MB partície.
Knižnica podporuje aj BLE 5 vrátane beacon technológií, ako sú iBeacon alebo Eddystone-TLM.
Poznámka: Ak chcete použiť BLE 5 Extended Advertising, je potrebné v súbore nimconfig.h odkomentovať riadok
#define CONFIG_BT_NIMBLE_EXT_ADV 1.
Bez tohto kroku sa projekt neskopiluje a skončí chybou, ktorá priamo odkazuje na potrebu tejto úpravy.
Aplikácia, ktorú sme pripravili, je pomerne jednoduchá, no má veľký priestor na rozšírenie. Napríklad by sa dalo pridať tlačidlo na odpojenie (DISCONNECT). Ďalšou možnosťou je doplnenie grafu, ktorý by sa v reálnom čase plnil údajmi z aktívnej relácie. Ten by ukazoval nielen samotné namerané hodnoty s časovou značkou, ale aj presnosť merania či prípadné zvlnenie dát pri rovnakých podmienkach.
Bluetooth Low Energy (BLE) ponúka obrovské možnosti využitia. Väčšina ľudí si ho spája s prepojením telefónu a smart náramku, no praktických aplikácií je podstatne viac. Nemusia to byť len zariadenia, ktoré periodicky vysielajú dáta – BLE zvládne aj obojsmernú komunikáciu v reálnom čase medzi dvomi alebo viacerými zariadeniami. Ľahko si vieme predstaviť systém, kde jedno zariadenie v pozícii "mastera" s WiFi pripojením zbiera údaje od ostatných a následne ich s identifikátorom zdroja (MAC/hostname) posiela ďalej. Takto môžu fungovať aj zložitejšie aplikácie, napríklad ovládanie drona. Ten by mohol kombinovať GATT pre stavové informácie (event-driven) a L2CAP pre rýchle príkazy s nízkou latenciou.
Rovnakú aplikáciu, akú sme vytvorili pre ESP32-C6, je možné zrealizovať aj na čipe nRF52840, ktorý je dostupný aj v XIAO prevedení. Podporuje rovnakú BLE knižnicu, no vyžaduje použitie n-able-Arduino stacku.
Ukážkový kód pre GATT server na ESP32-C6, ktorý využíva ako perifériu senzor VL53L1X, nájdete na GitHube projektu Watmonitor:
https://github.com/martinius96/hladinomer-studna-scripty/blob/master/examples/Hladinomer/BLE/BLE.ino
Jednoduché HTML rozhranie (iné, ako bolo použité pri testovaní) je dostupné tu:
https://github.com/martinius96/hladinomer-studna-scripty/blob/master/examples/Hladinomer/BLE/index.html
Príklady nositeľnej elektroniky na báze ESP32-C6 / nRF52840 s BLE GATT a Web Bluetooth API:
-
Merač tepovej frekvencie alebo oxymeter (MAX30102)
-
EKG monitor (AD8232) s podporou realtime aj historických údajov
-
Detektor pádu (IMU BMI260 / KXG08 / ADIS16448 / MPU-6500) s okamžitou notifikáciou do domácnosti
-
Tracker ergonómie
-
GPS tracker s ukladaním dát do SPIFFS (poloha, rýchlosť)
Príklady ďalších aplikácií s GATT serverom:
-
Merač vzdialenosti (VL53L1X) – vhodný pre maliarov a remeselníkov, aplikácia môže z výstupu počítať plochu pre cenové kalkulácie
-
Franklinov detektor búrky (AS3935) – upozornenie na bleskovú aktivitu, vhodné pre pokrývačov, či natieračov striech
-
Bezdrôtový teplomer a vlhkomer – s ukladaním histórie do SPIFFS, vhodný pre meteostanice
-
Automatické otváranie rampy – systém, ktorý otvorí rampu pri priblížení auta či jazdca na koni a po odchode ju automaticky zatvorí
-
Konfigurátor LED osvetlenia – režimy, animácie, adresovateľné LED pásy (WS2812, NeoPixel)
-
Detektor otvorených okien a dverí – na báze jazýčkových kontaktov alebo merania napätia na GPIO
-
Monitor spotreby energie – napríklad s čipmi INA219 alebo PZEM-004T
-
Akustický senzor s podporou TinyML – rozpoznávanie zvukov alebo druhov vtákov
-
Monitor DIY powerbanky
-
Diaľkovo ovládané zariadenia, BLE konfigurátor LoRa modulov či debug cez BLE Serial
Rozsiahle portfólio projektov Your-IoT nájdete na:
👉 https://your-iot.github.io/portfolio.html