- Terminologie související s BLE (Bluetooth Low Energy)
- Příprava hardwaru
- Programování ESP32 pro indikaci stavu baterie pomocí služby GATT
- Testování služby GATT na ESP32 BLE
Bezdrátová sluchátka, fitness pásky, reproduktory Bluetooth, sluchátka do uší, mobilní telefony, notebooky… kolem nás je tolik zařízení Bluetooth a většina z těchto zařízení je napájena z baterie. Přemýšleli jste někdy nad tím, že když připojíte zařízení Bluetooth k mobilnímu telefonu, jak automaticky pochopí, že připojeným zařízením je počítač nebo audio zařízení nebo mobilní telefon? U některých zařízení může náš telefon dokonce automaticky zobrazit procento baterie připojeného zařízení na oznamovací liště. Jak se to všechno děje samo o sobě? Mezi telefonem a zařízením Bluetooth by měl být sdílen nějaký společný protokol!
Zůstaňte zvědaví, na tyto otázky získáte odpovědi, když se pokusíme porozumět Bluetooth Low Energy (zkráceně BLE) s populárním modulem ESP32. Na rozdíl od klasického Bluetooth v ESP32 funguje BLE pouze při aktivované komunikaci a jinak zůstává v režimu spánku, což z něj činí správnou volbu pro aplikace napájené z baterie. BLE může také vytvářet síťové sítě a fungovat jako majáky. Normálně moduly BLE fungují buď jako server nebo jako klient, zde jako server použijeme ESP32 BLE.
Zde jsme rozdělili kompletní ESP32 Bluetooth do tří segmentů pro snazší pochopení.
1. Sériové Bluetooth na přepínání LED z ESP32 z mobilního telefonu
2 . Server BLE k odesílání dat o úrovni baterie do mobilního telefonu pomocí služby GATT
3. Klient BLE vyhledá zařízení BLE a bude fungovat jako maják.
První článek jsme již probrali; v tomto článku se naučíme, jak zajistit, aby ESP32 BLE fungoval jako server a jak pomocí služby GATT odesílat informace o stavu baterie. Pro účely testování pošleme napevno hodnoty z ESP32 jako procento baterie do našeho mobilního telefonu prostřednictvím služby BLE GATT, tímto způsobem náš mobilní bude předpokládat, že ESP32 je bateriové Bluetooth zařízení, které se pokouší poslat na své procento baterie. Než se pustíme do podrobností, porozumíme několika terminologiím souvisejícím s technologií Bluetooth Low Energy.
Terminologie související s BLE (Bluetooth Low Energy)
BLE Server: Jak již bylo řečeno, BLE lze naprogramovat tak, aby fungoval buď jako server, nebo jako klient. Při práci jako server může BLE poskytnout pouze data, která nemůže navázat připojení. Příkladem může být fitness pásmo. Server mohl odesílat informace, pouze pokud o to klient požádá.
BLE ESP32 se nejčastěji používá jako server. Každý Server bude mít v sobě jednu nebo více Služeb a podobně bude mít každá služba přidruženou jednu nebo více charakteristik. Charakteristika může mít v sobě nulu, jeden nebo více než jeden deskriptor. Každá služba, charakteristika nebo deskriptor bude mít své vlastní předdefinované jedinečné ID zvané UUID.
Klient BLE: Klient může skenovat připojení a poslouchat jiná zařízení Bluetooth. Příkladem může být váš mobilní telefon. Všimněte si, že většina hardwarových zařízení BLE může fungovat jako server a jako klient, což je software, který rozhoduje o roli zařízení.
Periferní zařízení / centrální zařízení: V síti BLE může existovat pouze jedno centrální zařízení, ale může mít tolik periferních zařízení, kolik je požadováno. Centrální zařízení se může připojit ke všem periferním zařízením současně, ale periferní zařízení se může připojit pouze k centrálnímu zařízení, takže žádná dvě periferní zařízení nemohou mezi sebou sdílet data. Nejlepším příkladem pro centrální zařízení budou naše chytré telefony a pro periferní zařízení budou naše Bluetooth sluchátka nebo fitness pásma.
BLE Advertising: BLE Advertising je podivínský výraz, který dává pokyn zařízení Bluetooth, aby bylo viditelné pro všechny, aby se mohlo spárovat a navázat spojení. Lze to považovat za jednosměrnou komunikaci. Zde server neustále inzeruje data a očekává, že je server přijme. BLE Beacon je typ BLE.
UUID (Universal Unique Identifier): Každému zařízení BLE Bluetooth je při programování přiřazeno univerzální jedinečné identifikační číslo. Tento identifikátor si můžete představit jako posloupnost čísel, která představuje funkčnost / roli zařízení BLE. Opět existují dva typy UUID. Jeden je Service UUID a druhý je Characteristic UUID.
Služba GATT: GATT znamená Generic Attribute Profile; to definuje některé standardní způsoby, pomocí kterých by dvě zařízení BLE měla vždy komunikovat. Tento atributový protokol (ATT) je předdefinován a je společný pro všechna zařízení BLE, takže se tak mohou libovolná dvě zařízení BLE navzájem identifikovat. GATT byla tedy odpovědí na naši předchozí otázku.
Technika, pomocí které by měla dvě zařízení BLE odesílat data tam a zpět, je definována konceptem nazývaným služby a charakteristiky.
Charakteristika služby BLE / BLE: UUID služby nám říká, jaký typ služby bude zařízení BLE provádět, a charakteristický UUID říká, jaké jsou parametry nebo funkce, které bude tato služba provádět. Každá služba bude tedy mít pod sebou jednu nebo více charakteristik. Dobře! Odkud programátor získá toto UUID? Každý UUID je již definován GATT (Generic Attribute Profile), můžete navštívit jeho web a vybrat UUID podle požadavků projektu. Vím, že se to trochu odrazilo přes naši hlavu; zkusme to pochopit na příkladu.
Předpokládejme zařízení BLE audio přehrávače. Zpočátku, když jej spárujete s telefonem, telefon jej identifikuje jako zvukové zařízení a také zobrazí stav baterie na stavovém řádku. Aby se to stalo, musí audio přehrávač nějak telefon říct, že je ochoten sdílet úroveň baterie a procento nabití, které má v baterii. To se provádí pomocí UUID, existuje specifický UUID, který říká, že kostky BLE poskytnou podrobnosti o úrovni baterie, které tento UUID, který říká, že typ služby se nazývá Service UUID, může existovat tolik parametrů, které musí vyměnit za dokončení služby, jako je hodnota baterie na takovém parametru, každý parametr bude mít svůj vlastní UUID a ty se nazývají Characteristic UUID.Společnou funkcí prováděnou charakteristikou je čtení, zápis, upozornění a indikace.
Deskriptor BLE: Deskriptor je volitelný atribut, který je přítomen uvnitř charakteristiky. Deskriptor normálně určuje, jak získat přístup k charakteristice.
BLE Beacon: Bluetooth Beacon je spíš jako bezdotykový spínač, který provádí nějakou předem definovanou akci, když se uživatel dostane do dosahu (blízká blízkost). Po celou dobu inzeruje svoji identitu, a proto je vždy připraven k párování.
BLE2902: K této věci jsem stále skeptický, ale můžete si to představit jako software na straně klienta, který informuje server o zapnutí nebo vypnutí oznámení, což nám pomůže šetřit energii
Doufám, že máte hrubý nápad, dobré je, že toho nemusíme moc vědět, protože veškerá ruční práce je pro nás již hotová prostřednictvím knihoven.
Příprava hardwaru
Projekt nevyžaduje žádné hardwarové nastavení, ale ujistěte se, že jste do svého Arduino IDE přidali podrobnosti o desce ESP32 a vyzkoušeli jste minimální program blikání vzorku, abyste zkontrolovali, zda vše funguje podle očekávání. Jste skeptičtí, jak to udělat, můžete postupovat podle tutoriálu Začínáme s ESP32 s Arduinem.
Abychom otestovali služby BLE, budeme v mobilu používat aplikaci nRF pro Android, kterou lze přímo stáhnout z PlayStore. Je k dispozici také v Itunes Store pro uživatele Iphone. Pokud plánujete pracovat s BLE po dlouhou dobu, tato aplikace se pro účely ladění opravdu hodí.
Programování ESP32 pro indikaci stavu baterie pomocí služby GATT
Do této doby předpokládám, že máte férovou představu o tom, co služba GATT a jak je implementována pomocí služby a charakteristických modelů. Pojďme se nyní ponořit do programu a naučit se, jak je implementován v ESP32 pomocí Arduino IDE. Než budeme pokračovat, rád bych využil tento prostor a poděkoval Andreasovi Spiessovi za jeho video BLE, které mi na mé straně hodně objasnilo.
Program začneme importem požadovaných knihoven do naší skici. Existuje spousta věcí, které je třeba nakonfigurovat, aby bylo možné používat funkčnost ESP32 BLE snad, i když díky Neilovi Kolbanovi, který za nás již vykonal tvrdou práci a poskytl knihovny. Pokud chcete porozumět funkcím knihoven, můžete se podívat na jeho dokumentaci na stránce github.
#zahrnout
Dále musíme definovat funkci zpětného volání serveru pro naše zařízení Bluetooth. Před tím pochopíme, co je funkce zpětného volání v BLE.
Co je funkce zpětného volání v BLE?
Pokud BLE pracuje jako server, je důležité definovat funkci zpětného volání serveru. S BLE je spojeno mnoho typů zpětných volání, ale pro zjednodušení je považujete za potvrzení, které se provádí, abyste se ujistili, že akce byla dokončena. Zpětné volání serveru se používá k zajištění úspěšného navázání spojení mezi klientem a serverem.
Následující řádky kódu používáme k provedení zpětného volání serveru.
bool _BLEClientConnected = false; třída MyServerCallbacks : veřejné BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Uvnitř funkce nastavení neplatnosti inicializujeme sériovou komunikaci na 115200 pro ladění a poté inicializujeme zařízení Bluetooth pomocí funkce InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indikátor stavu baterie - BLE"); InitBLE (); }
InitBLE je místo, kde jsou všechny magie stane. Musíme vytvořit server Bluetooth a využívat zde službu Úroveň nabití baterie. Ale předtím musíme definovat UUID pro službu, charakteristiku a deskriptor pro čtení úrovně baterie. Všechny UUID lze získat na webových stránkách služby Bluetooth GATT. V našem případě se snažíme použít službu Baterie a UUID je definováno jako 0X180F, jak je znázorněno níže.
Dále potřebujeme znát charakteristiky spojené s touto službou. Chcete-li vědět, že jednoduše kliknete na Battery Service a dostanete se na stránku Service Characteristics, kde je uvedeno, že Battery Level je název charakteristik a nabývá hodnoty od 0 do 100. Všimněte si také, že můžeme provést pouze dva akce s touto charakteristikou, jedna je číst, což je povinné, a druhá je upozorňovat, což je volitelné. Musíme tedy zaslat hodnotu baterie klientovi (Telefon), což je povinné a v případě potřeby můžeme telefon informovat, což je volitelné.
Ale počkejte, stále jsme nenašli hodnotu UUID pro charakteristickou úroveň baterie. Chcete-li to provést, přejděte na stránku Vlastnosti baterie a vyhledejte název úrovně baterie, kde najdete jeho UUID jako 0X2A19, jeho snímek je uveden níže.
Nyní, když máme všechny hodnoty, řekněme program, jak je znázorněno níže. Název BatterySerivce , BatteryLevelCharacteristic a BatteryLevelDescriptor jsou uživatelem definované proměnné, které odkazují na službu, charakteristiku a deskriptor, které v programu používáme. Hodnota pro deskriptor 0X2901 se používá, když je velikost hodnoty 8bitová, více informací najdete na stránce Popis deskriptoru.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Dostat se zpátky k initBLE funkci. Nejprve musíme spustit server BLE a nechat ho inzerovat se jménem. Na následujících řádcích se používají ke spuštění ble jako server. Název, který jsem dal svému serveru BLE, je „BLE Battery“, ale můžete si vybrat vlastní.
BLEDevice:: init ("BLE baterie"); // Vytvoření serveru BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nové MyServerCallbacks ());
Dále musíme spustit službu GATT, protože jsme již definovali UUID, můžeme jednoduše spustit službu pomocí níže uvedeného řádku.
// Vytvoření služby BLE BLEService * pBattery = pServer-> createService (BatteryService);
Jakmile je služba spuštěna, můžeme propojit deskriptor s charakteristikami a nastavit hodnoty. Zde je také přidána služba BLE2902, jak je znázorněno níže.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("procento 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (nový BLE2902 ());
Nakonec je vše nastaveno, zbývá jen požádat ESP32 o reklamu, aby ji ostatní zařízení, jako je náš telefon, mohly objevit a připojit se k ní, a když je připojena ke klientovi, měla by zahájit službu Baterie, kterou lze provést prostřednictvím následující řádky.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Spustit reklamu pServer-> getAdvertising () -> start ();
To je zatím tak dobré, posledním krokem je říct deskriptoru, jaká je hodnota baterie v procentech, která by měla být odeslána klientovi (telefon). Tato hodnota může být od 0 do 100, jak jsme četli dříve, aby to bylo jednoduché, mám jednoduchou pevnou kódovanou hodnotu baterie na 57 a poté ji každých 5 sekund zvyšovat a začít od 0, jakmile dosáhne 100. který je zobrazen níže. Všimněte si, že odesílaná hodnota je ve formátu unit8_t.
uint8_t level = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); zpoždění (5 000); úroveň ++; Serial.println (int (úroveň)); if (int (level) == 100) level = 0; }
Testování služby GATT na ESP32 BLE
Celý výše vysvětlený kód je uveden na konci stránky. Nahrajte kód na svoji desku ESP32. Po nahrání by měl váš telefon objevit Bluetooth zařízení s názvem „BLE baterie“ spárovat s ním.
Poté nainstalujte aplikaci nRF pro Android a otevřete ji a připojte se k zařízení BLE Battery BLE. Rozbalte část Servis baterie a měla by se zobrazit následující obrazovka.
Jak vidíte, aplikace automaticky zjistila, že BLE poskytuje bateriovou službu a má vlastnosti úrovně baterie kvůli UUID, které jsme v programu použili. Můžete také vidět, že aktuální hodnota baterie, která je 67%, čeká na 5 sekund a můžete si také všimnout, že se zvyšuje.
Skvělá věc při používání BLE je, že nyní si každá aplikace, která pracuje s BLE, bude myslet, že váš ESP32 je BLE zařízení, které upozorňuje na úroveň nabití baterie. K vyzkoušení jsem použil aplikaci nazvanou BatON a aplikace identifikovala ESP32 jako bateriově napájené zařízení Bluetooth a dala mi procentní upozornění na můj telefon
Chladný!! Že jo? Ve videu níže jsem také ukázal kompletní práci. Nyní, když jste se naučili, jak používat služby BLE Battery s ESP32, můžete vyzkoušet i další služby GATT, které jsou velmi zajímavé, jako je tepová frekvence, HID, srdeční frekvence atd. Bavte se….