- Terminológie týkajúce sa BLE (Bluetooth Low Energy)
- Príprava hardvéru
- Programovanie ESP32 na indikáciu stavu batérie pomocou služby GATT
- Testovanie vašej služby GATT na ESP32 BLE
Bezdrôtové slúchadlá, fitnes pásky, reproduktory Bluetooth, slúchadlá do uší, mobilné telefóny, notebooky… okolo nás je toľko zariadení Bluetooth a väčšina týchto zariadení je napájaná z batérie. Už ste niekedy premýšľali nad tým, že keď pripojíte zariadenie Bluetooth k svojmu mobilnému telefónu, ako automaticky pochopí, že pripojeným zariadením je počítač alebo zvukové zariadenie alebo mobilný telefón? U niektorých zariadení môže náš telefón na oznamovacej lište dokonca automaticky zobrazovať percentuálny podiel batérie pripojeného zariadenia. Ako sa to všetko deje samo? Medzi telefónom a zariadením Bluetooth by mal byť zdieľaný nejaký spoločný protokol!
Zostaňte zvedaví, na tieto otázky dostanete odpovede, keď sa pokúsime porozumieť technológii Bluetooth Low Energy (skrátene BLE) s populárnym modulom ESP32. Na rozdiel od klasického Bluetooth v systéme ESP32 funguje BLE iba vtedy, keď je aktivovaná komunikácia, a inak zostáva v režime spánku, čo z neho robí správnu voľbu pre aplikácie napájané z batérie. BLE môže tiež vytvárať sieťové siete a fungovať ako majáky. Normálne moduly BLE fungujú buď ako server alebo ako klient, tu ako server použijeme ESP32 BLE.
Tu sme pre ľahšie pochopenie rozdelili kompletný Bluetooth ESP32 na tri segmenty.
1. Sériové Bluetooth na prepínaní LED diód ESP32 z mobilného telefónu
2 . Server BLE na odosielanie údajov o úrovni batérie do mobilného telefónu pomocou služby GATT
3. Klient BLE vyhľadá zariadenia BLE a bude slúžiť ako maják.
Prvému článku sme sa už venovali; v tomto článku sa dozvieme, ako dosiahnuť, aby ESP32 BLE fungoval ako server a ako služba GATT mohla posielať informácie o úrovni nabitia batérie. Na účely testovania pošleme napevno zadané hodnoty z ESP32 ako percento batérie do nášho mobilného telefónu prostredníctvom služby BLE GATT, takže náš mobil bude predpokladať, že ESP32 je zariadenie Bluetooth napájané z batérie, ktoré sa pokúša odoslať na svoje percento batérie. Predtým, ako sa pustíme do podrobností, pochopíme niekoľko terminológií týkajúcich sa technológie Bluetooth Low Energy.
Terminológie týkajúce sa BLE (Bluetooth Low Energy)
BLE Server: Ako už bolo povedané, BLE je možné naprogramovať tak, aby fungoval buď ako server alebo ako klient. Pri práci ako server môže BLE poskytnúť iba údaje, ktoré nedokáže nadviazať pripojenie. Príkladom môže byť fitnes pásmo. Server mohol odosielať informácie, iba ak o ne klient požiada.
Najčastejšie sa BLE ESP32 používa ako server. Každý Server bude mať v sebe jednu alebo viac Služieb a podobne bude mať každá služba priradenú jednu alebo viac charakteristík. V charakteristike môže byť nula, jeden alebo viac deskriptorov. Každá služba, charakteristika alebo deskriptor bude mať svoje vlastné preddefinované jedinečné ID nazývané UUID.
Klient BLE: Klient môže skenovať pripojenie a počúvať ďalšie zariadenia Bluetooth. Príkladom môže byť váš mobilný telefón. Všimnite si, že väčšina hardvérových zariadení BLE môže fungovať ako server a ako klient, pričom o úlohe zariadenia rozhoduje softvér.
Periférne zariadenie / centrálne zariadenie: V sieti BLE môže byť iba jedno centrálne zariadenie, ale môže obsahovať toľko periférnych zariadení, koľko je požadované. Centrálne zariadenie sa môže pripojiť ku všetkým periférnym zariadeniam súčasne, ale periférne zariadenie sa môže pripojiť iba k centrálnemu zariadeniu, takže žiadne dva periférne zariadenia nemôžu medzi sebou zdieľať údaje. Najlepším príkladom pre zariadenie Central budú naše inteligentné telefóny a pre periférne zariadenie budú naše slúchadlá Bluetooth alebo fitnes pásky.
BLE Advertising: BLE Advertising je výstredný výraz, ktorý dáva pokyn zariadeniu Bluetooth, aby bolo viditeľné pre všetkých, aby bolo možné ich spárovať a nadviazať spojenie. Môže sa považovať za jednosmernú komunikáciu. Server tu ďalej inzeruje údaje a očakáva, že ich server prijme. BLE Beacon je typ BLE.
UUID (Universal Unique Identifier): Každému zariadeniu Bluetooth BLE sa pri programovaní programátorom pridelí číslo Universal Unique Identifier Number. Tento identifikátor si môžete predstaviť ako postupnosť čísel, ktorá predstavuje funkčnosť / úlohu zariadenia BLE. Opäť existujú dva typy UUID. Jedným z nich je Service UUID a druhým je Characteristic UUID.
Služba GATT: GATT znamená Generic Attribute Profile; definuje to niekoľko štandardných spôsobov, pomocou ktorých by mali dve zariadenia BLE vždy komunikovať. Tento atribútový protokol (ATT) je preddefinovaný a je spoločný pre všetky zariadenia BLE, takže sa tak môžu akékoľvek dve zariadenia BLE navzájom identifikovať. GATT teda bola odpoveďou na našu predchádzajúcu otázku.
Technika, pomocou ktorej majú dve zariadenia BLE odosielať údaje tam a späť, je definovaná konceptom nazývaným služby a charakteristiky.
Charakteristika služby BLE / BLE: Služba UUID nám hovorí, aký typ služby bude zariadenie BLE vykonávať, a charakteristický UUID informuje, aké sú parametre alebo funkcie, ktoré bude táto služba vykonávať. Každá služba bude mať teda jednu alebo viac charakteristík. Dobre! Odkiaľ programátor získa toto UUID? Každý UUID je už definovaný GATT (Generic Attribute Profile), môžete navštíviť jeho webovú stránku a zvoliť UUID podľa potreby pre projekt. Viem, že sa to trochu odrazilo nad našu hlavu; skúsme to pochopiť na príklade.
Predpokladajme, že BLE zariadenie audioprehrávača. Spočiatku, keď ho spárujete s telefónom, telefón ho identifikuje ako zvukové zariadenie a na stavovom riadku tiež zobrazí stav batérie. Aby sa tak stalo, musí audioprehrávač nejako povedať vášmu telefónu, že je ochotný zdieľať úroveň batérie a percentuálny podiel nabitia batérie. To sa deje pomocou UUID, existuje konkrétny UUID, ktorý hovorí, že kocky BLE poskytnú podrobnosti o úrovni batérie, ktoré tento UUID, ktorý hovorí, že typ služby sa volá Service UUID, môže opäť existovať toľko parametrov, ktoré musia vymenené za dokončenie služby, ako je hodnota batérie na takomto parametri, každý parameter bude mať svoje vlastné UUID a tieto sa nazývajú Characteristic UUID.Spoločná funkcia vykonávaná charakteristikou je čítať, zapisovať, informovať a označovať.
Deskriptor BLE: Deskriptor je voliteľný atribút, ktorý sa nachádza vo vnútri charakteristiky. Deskriptor normálne určuje, ako získať prístup k charakteristike.
BLE Beacon: Bluetooth Beacon je skôr spínač priblíženia, ktorý vykonáva určité preddefinované akcie, keď sa užívateľ dostane do dosahu (blízkosť). Svoju identitu inzeruje neustále, a preto je vždy pripravená na párovanie.
BLE2902: K tejto veci som stále skeptický, ale môžete si to myslieť ako softvér na strane klienta, ktorý informuje server o zapnutí alebo vypnutí upozornenia, čo nám pomôže šetriť energiu
Dúfam, že máte približnú predstavu. Dobré je, že toho veľa vedieť nemusíme, pretože všetka ručná práca je už za nás vykonaná prostredníctvom knižníc.
Príprava hardvéru
Projekt nevyžaduje žiadne hardvérové nastavenie, ale uistite sa, že ste do svojho Arduino IDE pridali podrobnosti o doske ESP32 a vyskúšali ste minimálny program blikania vzorky, aby ste skontrolovali, či všetko funguje podľa očakávaní. Ste skeptický, ako na to, môžete postupovať podľa tutoriálu Začíname s ESP32 s Arduino.
Na otestovanie služieb BLE tiež použijeme aplikáciu nRF pre Android v mobilnom telefóne, ktorú je možné priamo stiahnuť z obchodu PlayStore. Je k dispozícii aj v obchode iTunes pre používateľov telefónov iPhone. Ak plánujete dlhšiu dobu pracovať s BLE, táto aplikácia sa vám na účely ladenia skutočne zíde.
Programovanie ESP32 na indikáciu stavu batérie pomocou služby GATT
Do tejto doby predpokladám, že máte reálnu predstavu o tom, čo je služba GATT a ako sa implementuje pomocou služby a charakteristických modelov. Teraz sa ponoríme do programu a dozvieme sa, ako je implementovaný v ESP32 pomocou Arduino IDE. Než budeme pokračovať, rád by som využil tento priestor na poďakovanie Andreasovi Spiessovi za jeho video BLE, ktoré na mojej strane veľa objasnilo.
Program začneme importom požadovaných knižníc do našej skice. Existuje veľa vecí, ktoré je potrebné nakonfigurovať, aby bolo možné využívať funkčnosť ESP32 BLE, dúfajme, aj keď vďaka Neilovi Kolbanovi, ktorý za nás už vykonal tvrdú prácu a poskytol knižnice. Ak chcete porozumieť funkčnosti knižníc, môžete si pozrieť jeho dokumentáciu na stránke github.
#include
Ďalej musíme definovať funkciu spätného volania servera pre naše zariadenie Bluetooth. Predtým pochopíme, čo je funkcia spätného volania v BLE.
Čo je funkcia spätného volania v BLE?
Keď BLE pracuje ako server, je dôležité definovať funkciu spätného volania servera. S BLE je spojených veľa druhov spätných volaní, ale pre zjednodušenie ich považujete za vykonanie potvrdenia, aby ste sa uistili, že akcia bola dokončená. Na zabezpečenie úspešného nadviazania spojenia medzi klientom a serverom sa používa spätné volanie servera.
Nasledujúce riadky kódu používame na uskutočnenie spätného volania servera.
bool _BLEClientConnected = false; trieda MyServerCallbacks : verejné BLEServerCallbacks { void onConnect (BLEServer * Pserver) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Vo vnútri funkcie nastavenia neplatnosti inicializujeme sériovú komunikáciu na 115200 za účelom ladenia a potom inicializujeme zariadenie Bluetooth pomocou funkcie InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indikátor stavu batérie - BLE"); InitBLE (); }
InitBLE je miesto, kde sú všetky mágie stane. Musíme vytvoriť server Bluetooth a tu používať službu Úroveň nabitia batérie. Ale predtým musíme definovať UUID pre službu, charakteristiku a deskriptor pre čítanie úrovne batérie. Všetky UUID je možné získať na webových stránkach služieb Bluetooth GATT. V našom prípade sa snažíme využívať službu Batéria a identifikátor UUID je definovaný ako 0X180F, ako je uvedené nižšie.
Ďalej musíme poznať charakteristiky spojené s touto službou. Ak chcete vedieť, že jednoducho kliknete na Batériový servis, dostanete sa na stránku Servisné charakteristiky, kde je uvedené, že Úroveň batérie je názov charakteristík a má hodnotu od 0 do 100. Upozorňujeme tiež, že môžeme vykonať iba dva akcie s touto charakteristikou, jedným je čítanie, ktoré je povinné robiť, a druhým je oznamovanie, ktoré je voliteľné. Hodnotu batérie teda musíme poslať klientovi (Telefón), čo je povinné a v prípade potreby môžeme telefónu oznámiť, ktorá je voliteľná.
Ale počkajte, stále sme nenašli hodnotu UUID pre charakteristickú úroveň batérie. Ak to chcete urobiť, choďte na stránku Charakteristiky batérie a vyhľadajte názov úrovne batérie, kde nájdete jeho UUID ako 0X2A19, ktorého fotografia je uvedená nižšie.
Teraz, keď máme všetky hodnoty, dajme tomu program, ako je uvedené nižšie. Názov BatterySerivce , BatteryLevelCharacteristic a BatteryLevelDescriptor sú používateľom definované premenné, ktoré odkazujú na službu, charakteristiku a deskriptor, ktorú používame v programe. Hodnota pre deskriptor 0X2901 sa používa, keď je veľkosť hodnoty 8-bitová, ďalšie informácie nájdete na stránke Popis deskriptora.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Návrat k funkcii initBLE . Najprv musíme spustiť server BLE a nechať ho inzerovať s menom. Na nasledujúcich riadkoch sa používajú na spustenie ble ako server. Názov, ktorý som dal svojmu serveru BLE, je „BLE Battery“, ale môžete si zvoliť svoj vlastný.
BLEDevice:: init ("batéria BLE"); // Vytvorte BLE server BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nové MyServerCallbacks ());
Ďalej musíme spustiť službu GATT, pretože sme už definovali UUID, môžeme ju jednoducho spustiť pomocou riadku nižšie.
// Vytvorenie služby BLE BLEService * pBattery = pServer-> createService (BatteryService);
Po spustení služby môžeme deskriptor prepojiť s charakteristikami a nastaviť hodnoty. Sem je tiež pridaná služba BLE2902, ako je to znázornené nižšie.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Percento 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (nový BLE2902 ());
Nakoniec je všetko nastavené, zostáva iba požiadať ESP32 o reklamu, aby ju mohli zistiť a pripojiť k nej ďalšie zariadenia, ako je náš telefón, a po pripojení ku klientovi by mala spustiť službu Batéria, ktorú je možné vykonať prostredníctvom nasledujúce riadky.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Spustiť reklamu pServer-> getAdvertising () -> start ();
To je zatiaľ všetko dobré, posledným krokom je povedať deskriptoru, aká je hodnota batérie v percentách, ktorá by sa mala odoslať klientovi (telefón). Táto hodnota môže byť od 0 do 100, ako sme čítali skôr. Aby to nebolo jednoduché, mám jednoduchú pevnú kódovanú hodnotu batérie na 57 a potom ju každých 5 sekúnd zvyšujem a od 0 začíname od 0, keď dosiahne 100. ktorý je zobrazený nižšie. Upozorňujeme, že odosielaná hodnota je vo formáte unit8_t.
úroveň uint8_t = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); oneskorenie (5 000); úroveň ++; Serial.println (int (level)); if (int (level) == 100) level = 0; }
Testovanie vašej služby GATT na ESP32 BLE
Kompletný kód vyššie vysvetlené je uvedený na konci stránky. Vložte kód na svoju dosku ESP32. Po načítaní by mal váš telefón objaviť zariadenie Bluetooth s názvom „BLE batéria“, ktoré s ním spárovať.
Potom nainštalujte aplikáciu nRF pre Android a otvorte ju a pripojte k zariadeniu BLE Battery BLE. Rozbaľte sekciu Batériová služba a mala by sa zobraziť nasledujúca obrazovka.
Ako vidíte, aplikácia automaticky identifikovala, že BLE poskytuje batériovú službu a má vlastnosti úrovne batérie z dôvodu UUID, ktoré sme použili v programe. Môžete tiež vidieť, že aktuálna hodnota batérie, ktorá je 67%, počkajte 5 sekúnd a môžete si tiež všimnúť, že sa zvyšuje.
Skvelé na používaní BLE je, že teraz si každá aplikácia, ktorá pracuje s BLE, bude myslieť, že váš ESP32 je BLE zariadenie, ktoré oznamuje stav batérie. Na vyskúšanie som použil aplikáciu s názvom BatON, ktorá identifikovala ESP32 ako batériové Bluetooth zariadenie a dala percentuálne upozornenie na môj telefón takto
Super !! Správny? Kompletné fungovanie som ukázal aj vo videu nižšie. Teraz, keď ste sa naučili používať služby BLE Battery s ESP32, môžete vyskúšať aj ďalšie služby GATT, ktoré sú veľmi zaujímavé, ako napríklad pulzová frekvencia, HID, srdcová frekvencia atď. Bavte sa….