blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
2
SLEDOVAŤ BLOG
martinius96 (at) gmail.com
deadawp



GATT server s ESP32-C6
pridal deadawp 12.9. 2025 o 22:46 (naposledy upravené 13.9. 2025 o 1:04)

ESP32-C6 je šikovný mikrokontrolér. V prevedení na XIAO doske od Seeed Studio ide o naozaj podarený devkit, ktorý má integrovaný nabíjací obvod pre lítiové batérie Li-pol/Li-Ion a poskytuje prístup k perifériám cez SPI aj I2C zbernicu. Vyskúšali sme už na samostatný senzorový uzol s ultrazvukovým snímačom, ktorý posielal dáta priamo do webového rozhrania hladinomera - Watmonitor, alebo skrz LoRa PPP komunikáciu na iný hardvér (SX1278). V režime hlbokého spánku má spotrebu len 15 µA, ak je napájaný priamo z batérie. Vďaka podpore BLE je vhodný pre mnohé aplikácie, kde môže byť ekvivalentom k nRF (Nordic) alebo MG24, ktoré tiež existujú v prevedení na XIAO doske a podporujú BLE. Dnes si ukážeme niečo nové a to GATT server na tomto mikrokontroléri, ku ktorému sa budeme pripájať z telefónu, kde budeme vidieť dáta v reálnom čase.

Nebudeme však využívať BLE v najvyššej verzii, ktorú ESP32-C6 podporuje a to 5.3, ale pôjdeme na verziu 4.2 (Legacy) pre maximálnu kompatibilitu a prenosnosť zdrojového kódu na iné ESP32 mikrokontroléry (WROOM-32, S3...). GATT je vrstva protokolu pod BLE, ktorá definuje, ako sú údaje usporiadané a prístupné. Údaje sú uložené v službách, pričom každá služba definuje charakteristiky. Charakteristiky uchovávajú dáta (konkrétnu hodnotu) a zároveň definujú vlastnosti, ktoré s nimi môže klient vykonať. Najčastejšie ide o čítanie (READ) alebo prijímanie automatických aktualizácií dát v okamihu, keď prídu – je to obdoba „subscribe“ u MQTT. Existujú aj vlastnosti pre zápis, tie však dnes nebudeme používať. Tieto dáta sú šírené cez BLE „webserver“, ku ktorému sa klient, ktorý chce dáta, musí pripojiť.


Zariadenie ESP32-C6 cez BLE skener v aplikácii nRF Connect

Pri skenovaní BLE zariadení klient uvidí naše zariadenie, pretože vysiela reklamné pakety (advertising packets). Reklamný paket obsahuje aj UUID, unikátny identifikátor služby. V našom prípade má UUID dĺžku 128 bitov, hoci môže nadobúdať aj iné dĺžky. Po pripojení si klient vyžiada zoznam služieb a začne komunikácia s GATT serverom, ktorý vráti jednotlivé služby vrátane ich charakteristík. Po použití vlastností READ alebo NOTIFY sa sprístupní aj hodnota v charakteristike. Pre testovacie účely môžeme využiť aplikáciu nRF Connect. Pre konkrétnejšiu aplikáciu je možné použiť napríklad HTML stránku s Web Bluetooth API.


Hodnota 115 ako parameter charakteristiky pod custom službou. Pri Notify sa mení v prednastavenej perióde

Aby sme mali nejaké dáta, pre testovaciu aplikáciu som k ESP32-C6 pripojil laserový ToF snímač vzdialenosti VL53L1X (známy tiež ako TOF400C), ktorý umožňuje meranie vzdialenosti až do 400 cm. Tento snímač je od STMicroelectronics a jeho fungovanie som už na blogu popisoval, vrátane detailov o používanom laseri.

Poďme teda od začiatku. Čo a ako použiť. ESP32 má v Arduino Core vstavané API BLE, ale knižnicu sú veľmi veľkostne náročné. Prakticky aj na malú aplikáciu nepostačuje úložný priestor štandardnej 1,2 MB partície. Vždy je tak nutné používať špecifickú tabuľku partícii. Preto si dnešný GATT server budeme demonštrovať na ekvivalentnej knižnici NimBLEDevice. Pre komunikáciu s laserovým snímačom VL53L1X využijeme knižnicu rovnomenného názvu od Pololu. Snímač budeme prevádzkovať v režime kontinuálneho merania po 200 ms a máme 50 ms time budget na samotné meranie, ak sa do tej doby laserový zväzok nevráti do prijímača, meranie zlyhá, ale program beží ďalej. Samotný senzor vracia vzdialenosť v milimetroch a až softvérovo sa dosahuje hodnota v centimetroch, keďže sa hodnota delí číslom 10. 

V knižnici NimBLEDevice využijeme štandardný webserver a chrakteristiku, zadefinujeme UUID služby a charakteristiky. Rovnako tak môžeme využiť aj callbacky s triedami pre detekciu pripojenia / odpojenia používateľa. Keďže ESP32-C6 vysiela v pravidelnej perióde, môžu ho vidieť aj iné zariadenia aj v prípade, že je naň aktuálne niekto pripojený.


Fragment kódu pre BLE server

Pre ľahšie prepojenie ESP32-C6 a periférii využijeme vlastnú prepojovaciu DPS XIAO_LoRa, prípadne vieme použiť aj WM_MINI, obe od Your-IoT.


XIAO_LoRa s ESP32-C6 + VL53L1X


WM_MINI, ilustračné s kompatibilným XIAO devkitom

Veľkostne sú veľmi malé a zariadenie sa tak hodí aj na nositeľnú elektroniku, či už zavesené na krku, alebo aj ako príručné zariadenie, napríklad na meranie vzdialenosti. To môžu oceniť podlahári, maliari pri meraní miestnosti. Lenže pre dáta nebudú používať nRF Connect. Musia mať niečo, čo sa dá ľahko použiť. Napríklad webaplikáciu, alebo aplikáciu pre smartfón. Webaplikácia má výhodu v tom, že API pre BLE podporuje natívne v prehliadači a nie je nutné nič doinštalovať. Má to ale svoje špecifiká. Webserver, na ktorom bude HTML aplikácia bežať a kam sa bude pripájať telefón, ktorý chce použiť Web Bluetooth API, musí mať šifrované spojenie s telefónom, teda HTTPS protokol je nutnosťou.

V HTML5 sa dajú rýchlo navrhnúť rozhrania, ktoré môžu vizualizovať dáta. Rovnako ako v nRF Connect, aj tu v prípade použitia vlastnosti NOTIFY budeme získavať nové dáta s preddefinovaným updatom, ktorý sme si v programe definovali na 1000 ms. Je to ale možné aktualizovať aj rýchlejšie. Bežne BLE beacony môžu uploadovať aj prakticky pod 100 ms. Samotné API pri pokuse o pripojenie k zariadeniu vypíše, že sa má vybrať zariadenie na spárovanie, ale nie je to spárovanie v danom slova zmysle. Ide skôr o autorizáciu pripojenia.

Po "párovaní" sa pripojíte k zariadeniu lokálne z telefónu (peer-to-peer) - identicky ako to bolo z nRF Connect aplikácie. Dáta sa zobrazia vo webaplikácii a dynamicky sa budú meniť, keďže sa používa vlastnosť NOTIFY, teda každých 1000 ms sa ukáže aktuálne číslo. Prakticky je to client-side webaplikácia. Čo sa týka samotného Web Bluetooth API, využíva sa tu filtrovanie podľa konkrétnych UUID, kde sú následne dáta vypísané používateľovi v reálnom čase. Merané dáta odpovedajú skutočnosti. Samotné dáta sa vypisujú cez JS do príslušnej časti HTML kódu.


Web Bluetooth API

Tento jednoduchý príklad nevyužíva šifrovanú BLE komunikáciu medzi klientom a serverom. Ktokoľvek môže dáta vidieť. Pre takúto aplikáciu, ktorá meria vzdialenosť je to v poriadku. Samotná knižnica NimBLE má mnoho API, ktoré sa dajú použiť pre skvalitnenie aplikácie. Od ovládania vysielacieho výkonu, cez rôzne metódy pre asynchrónnu komunikáciu, či šifrovanú komunikáciu. Knižnica má metódy pre ochranu voči útokom typu MITM. Má implementáciu pre passkey, ktorý je uložený v NVS pamäti ESP32, ale z toho, čo som videl Secure Connections asi nemá, čo je vyššia forma ochrany a prakticky štandard pre šifrovanú BLE komunikáciu. Rovnako tak má knižnica aj príklad pre L2CAP, čo je nízkoúrovňová vrstva BLE a umožňuje prenášať väčšie objemy dát v jednotlivých správach. Má ale aj nižšiu latenciu. Daná implementácia, ktorú som použil pre periodické meranie vzdialenosti s a BLE má celkom 703775 B, čo je  53% štandardnej 1,2 MB partície. Knižnica má aj podporu pre BLE 5 a podporuje aj Beacony, napríklad iBeacon, či Eddystone-TLM.

Aplikácia, ktorá bola vytvorená je veľmi jednoduchá a dá sa v mnohom rozšíriť. Môže sa pridať tlačidlo pre ukončenie spojenia (DISCONNECT). Z aktívnej session a prijímaných dát by sa na webovom rozhraní mohol dynamicky napĺňať graf, ktorý by reprezentoval dáta s časovou značkou, ale zároveň by poukazoval aj na presnosť meraní a prípadne zvlnenie nameraných dát by bolo viditeľné, ak by k nemu dochádzalo za identických podmienok.

BLE má obrovský potenciál pre rôzne aplikácie, väčšina má BLE aplikácie spojené možno s telefónom a náramkom, ale má mnoho iných využití. Nemusia to byť iba takéto jednoúčelové, kedy periodicky niečo vysielač vysiela. Môže ísť o real-time komunikáciu medzi dvoma (alebo aj viacerými) zariadeniami, kedy zariadenie prijíma, ale aj vysiela dáta. Viem si predstaviť mnoho BLE zariadení, ktoré majú "MASTRA", ktorý má WiFi konektivitua je schopný dáta, vrátane identifikátora zdroja (MAC / hostname) zaslať ďalej. Vďaka tomu môžu existovať riadiace systémy, napríklad cez BLE ovládaný dron, kde sa môže kombinovať GATT pre stavové dáta (event-driven) s L2CAP pre zasielanie rýchlych povelov s nízkou latenciou.

Obdobnú aplikáciu, ako sme vytvorili pre ESP32-C6 je možné postaviť aj na nRF52840, ktoré tiež existuje na XIAO devkite a podporuje aj rovnakú BLE knižnicu, akú sme použili s ESP32-C6. Je však potrebné pre nRF použiť aj n-able-Arduino stack.

Spomenutý príklad GATT servera na ESP32-C6, ktoré využíva ako perifériu VL53L1X môžete nájsť na Githube projektu Watmonitora, kde sú dostupné aj zdrojové kódy pre WiFi, Ethernet a ďalšie: 
https://github.com/martinius96/hladinomer-studna-scripty/blob/master/examples/Hladinomer/BLE/BLE.ino

DEMO HTML rozhranie (nie to, na ktorom som testoval ja s krajším GUI) nájdete na: 
https://github.com/martinius96/hladinomer-studna-scripty/blob/master/examples/Hladinomer/BLE/index.html

 

 



Prístupov 157
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDUJETE
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
GATT server s ESP32-C6
[ 12.9.2025] (príspevkov 0)
Tohtoročné výnosy obilia pod Tatrami
[ 31.8.2025] (príspevkov 0)
Odstávky elektriny - ePaper s ESP32
[ 30.8.2025] (príspevkov 0)
Dojmy: VIETCONG
[ 28.8.2025] (príspevkov 0)
433 MHz prijímač s Arduinom v roku 2025
[ 26.8.2025] (príspevkov 0)
Systém ochrany fotopasce - Python
[ 24.8.2025] (príspevkov 0)
Vlastný audio-streamovací systém
[ 23.8.2025] (príspevkov 0)
Výmena karburátora Homelite ST-155
[ 30.7.2025] (príspevkov 0)
AR dashboard pre IoT zariadenia
[ 30.7.2025] (príspevkov 0)
Začiatky s AR / VR pre web
[ 23.7.2025] (príspevkov 0)