- Terminologije, povezane z BLE (Bluetooth Low Energy)
- Priprava strojne opreme
- Programiranje ESP32 za prikaz stanja napolnjenosti baterije s storitvijo GATT
- Testiranje storitve GATT na ESP32 BLE
Brezžične slušalke, fitnes pasovi, zvočniki Bluetooth, ušesne slušalke, mobilni telefoni, prenosniki… okoli nas je toliko naprav Bluetooth in večina teh naprav deluje na baterije. Ste se kdaj vprašali, da ko povežete napravo Bluetooth z mobilnim telefonom, kako samodejno razume, da je povezana naprava računalnik ali zvočna naprava ali mobilni telefon? Pri nekaterih napravah naš telefon morda celo samodejno prikaže odstotek napolnjenosti povezane naprave v vrstici z obvestili. Kako se vse to zgodi samo od sebe? Telefon in naprava Bluetooth bi morali deliti nekaj skupnih protokolov!
Ostanite radovedni, na ta vprašanja boste dobili odgovore, ko skušamo razumeti Bluetooth Low Energy (na kratko BLE) s priljubljenim modulom ESP32. Za razliko od klasičnega Bluetootha v ESP32, BLE deluje le, če je komunikacija aktivirana in ostane v načinu spanja, zaradi česar je prava izbira za aplikacije na baterije. BLE lahko tvori tudi mrežna omrežja in deluje kot svetilnik. Moduli BLE običajno delujejo bodisi kot strežnik bodisi kot odjemalec, tu bomo kot strežnik uporabili ESP32 BLE.
Tu smo celoten ESP32 Bluetooth razdelili na tri segmente za lažje razumevanje.
1. Serijski Bluetooth na ESP32, ki preklaplja LED z mobilnega telefona
2 . BLE strežnik za pošiljanje podatkov o nivoju baterije v mobilni telefon s storitvijo GATT
3. BLE odjemalec za iskanje naprav BLE in delovanje kot svetilnik.
Prvi članek smo že pokrili; v tem članku bomo izvedeli, kako naj ESP32 BLE deluje kot strežnik, in s pomočjo storitve GATT pošiljamo informacije o nivoju baterije. Za namen testiranja bomo prek storitve BLE GATT na svoj mobilni telefon poslali trdno kodirane vrednosti iz ESP32 kot odstotek napolnjenosti akumulatorja, tako da bo naš mobilnik domneval, da je ESP32 baterijska naprava Bluetooth, ki poskuša poslati odstotek napolnjenosti baterije. Preden se spustimo v podrobnosti, bomo razumeli nekaj terminologij, povezanih z Bluetooth Low Energy.
Terminologije, povezane z BLE (Bluetooth Low Energy)
BLE Server: Kot smo že povedali, je BLE lahko programiran tako, da deluje kot strežnik ali kot odjemalec. Ko deluje kot strežnik, lahko BLE posreduje samo podatke, ne more vzpostaviti povezave. Primer bi bil fitnes pas. Strežnik je lahko podatke poslal le, če jih zahteva odjemalec.
Najpogosteje se BLE ESP32 uporablja kot strežnik. Vsak strežnik bo imel v sebi eno ali več storitev, podobno pa bo vsaka storitev povezana z eno ali več značilnostmi. Karakteristika ima lahko nič, enega ali več deskriptorjev. Vsaka storitev, značilnost ali deskriptor bo imel svoj vnaprej določen edinstven ID, imenovan UUID.
BLE odjemalec: odjemalec lahko skenira povezave in posluša druge naprave Bluetooth. Primer je vaš mobilni telefon. Upoštevajte, da lahko večina naprav BLE strojne opreme deluje kot strežnik in kot odjemalec, in sicer programska oprema, ki določa vlogo naprave.
Periferna naprava / centralna naprava: V omrežju BLE je lahko samo ena centralna naprava, vendar ima lahko toliko perifernih naprav, kot je potrebno. Centralna naprava se lahko istočasno poveže z vsemi zunanjimi napravami, vendar se lahko zunanja naprava poveže samo s centralno napravo, tako da nobena zunanja naprava ne more izmenjati podatkov med seboj. Najboljši primer za centralno napravo bodo naši pametni telefoni, za zunanjo napravo pa bodo slušalke Bluetooth ali pasovi za fitnes.
Oglaševanje BLE: Oglaševanje BLE je gee-izraz, s katerim se napravi Bluetooth pove, da mora biti vidna vsem, da se lahko seznani in vzpostavi povezavo. To lahko štejemo za enosmerno komunikacijo. Tu strežnik še naprej oglašuje podatke in pričakuje, da jih bo strežnik prejel. BLE Beacon je vrsta BLE.
UUID (Univerzalni unikatni identifikator): Vsaka naprava BLE Bluetooth dobi univerzalno unikatno identifikacijsko številko, če jo programira programer. Ta identifikator si lahko predstavljate kot zaporedje številk, ki predstavlja funkcionalnost / vlogo naprave BLE. Spet obstajata dve vrsti UUID. Eden je UUID storitve, drugi pa Značilni UUID.
Storitev GATT: GATT pomeni Generic Attribute Profile; to opredeljuje nekaj standardnih načinov, s katerimi morata dve napravi BLE vedno komunicirati. Ta protokol atributov (ATT) je vnaprej določen in je skupen za vse naprave BLE, tako da se lahko kateri koli napravi BLE medsebojno prepoznata. Torej je bil GATT odgovor na naše prejšnje vprašanje.
Tehnika, s katero naj dve napravi BLE pošiljata podatke naprej in nazaj, je opredeljena s konceptom, imenovanim storitve in značilnosti.
BLE Service / BLE характеристиka: Service UUID nam pove, katero vrsto storitve bo naprava BLE izvajala, Characteristic UUID pa pove, kateri so parametri ali funkcije, ki jih bo ta storitev izvajala. Torej bo vsaka storitev imela eno ali več značilnosti. V redu! Od kod programerju ta UUID? Vsak UUID je že opredeljen v GATT (Generic Attribute Profile), lahko obiščete njihovo spletno mesto in izberete UUID, kot je zahtevano za projekt. Vem, da se nam je nekoliko odbilo nad glavo; poskusimo to razumeti na primeru.
Predpostavimo, da je naprava BLE zvočnega predvajalnika. Ko ga sprva seznanite s telefonom, ga prepozna kot zvočno napravo in v vrstici stanja prikaže tudi stanje napolnjenosti. Torej, da bi se to lahko zgodilo, mora predvajalnik zvoka nekako povedati telefonu, da je pripravljen deliti raven baterije in odstotek napolnjenosti baterije. To se naredi z uporabo UUID, obstaja poseben UUID, ki sporoča, da bo kocka BLE zagotovila podrobnosti o nivoju baterije, ta UUID, ki pravi, da se vrsta storitve imenuje Service UUID, spet lahko obstaja toliko parametrov, da zamenjati za dokončanje storitve, kot je vrednost akumulatorja na takem parametru, bo vsak parameter imel svoj UUID in ti se imenujejo karakteristični UUID.Skupna funkcija, ki jo opravlja značilnost, je Branje, pisanje, obveščanje in označevanje.
BLE deskriptor: deskriptor je neobvezen atribut, ki je prisoten znotraj karakteristike. Deskriptor običajno določi, kako dostopati do značilnosti.
BLE Svetilnik: Svetilnik Bluetooth je bolj kot bližinsko stikalo, ki izvede neko vnaprej določeno dejanje, ko uporabnik pride v domet (neposredna bližina). Ves čas oglašuje svojo identiteto in je zato pripravljen na vedno seznanjanje.
BLE2902: Še vedno sem skeptičen glede te stvari, vendar lahko nanjo gledate kot na del odjemalske strani, ki strežniku sporoči, da vklopi ali izklopi obvestilo, kar nam bo pomagalo pri varčevanju z energijo
Upam, da imate grobo idejo, dobro je, da nam ni treba vedeti veliko, saj so vsa ročna dela že opravljena za nas v knjižnicah.
Priprava strojne opreme
Projekt ne zahteva nastavitve strojne opreme, vendar se prepričajte, da ste na svoj Arduino IDE dodali podrobnosti plošče ESP32 in preizkusili najmanjši program za utripanje, da preverite, ali vse deluje po pričakovanjih. Če ste skeptični, kako to storiti, lahko sledite navodilom za začetek uporabe ESP32 z Arduinom.
Za preizkus storitev BLE bomo na svojem mobilnem telefonu uporabljali aplikacijo nRF android, ki jo lahko neposredno prenesete iz PlayStore. Na voljo je tudi v trgovini Itunes za uporabnike Iphone. Če nameravate dolgo delati z BLE, vam bo ta aplikacija resnično prišla prav za odpravljanje napak.
Programiranje ESP32 za prikaz stanja napolnjenosti baterije s storitvijo GATT
V tem času domnevam, da imate pošteno predstavo o tem, katera storitev GATT in kako se izvaja z uporabo storitev in značilnih modelov. Zdaj pa se poglobimo v program in se naučimo, kako je implementiran v ESP32 z uporabo Arduino IDE. Preden nadaljujemo, bi se rad s tem prostorom zahvalil Andreasu Spiessu za njegov video BLE, ki je na moji strani razjasnil stvari.
Program začnemo z uvozom zahtevanih knjižnic v našo skico. Za uporabo funkcije BLE ESP32, upam, da je treba konfigurirati veliko stvari, zahvaljujoč Neilu Kolbanu, ki je za nas že naredil trdo delo in poskrbel za knjižnice. Če želite razumeti funkcionalnost knjižnic, si oglejte njegovo dokumentacijo na strani github.
#include
Nato moramo definirati funkcijo povratnega klica strežnika za našo napravo Bluetooth. Pred tem razumemo, kaj je funkcija povratnega klica v BLE.
Kaj je funkcija povratnega klica v BLE?
Ko BLE deluje kot strežnik, je pomembno, da določite funkcijo povratnega klica strežnika. Z BLE je povezanih več vrst povratnih klicev, vendar poenostavljeno menite, da so to potrditve, ki se izvajajo, da se prepričate, da je bilo dejanje končano. Za zagotovitev uspešne povezave med odjemalcem in strežnikom se uporablja povratni klic strežnika.
Za izvedbo povratnega klica strežnika uporabljamo naslednje vrstice kode.
bool _BLEEClientConnected = false; razred MyServerCallbacks : javni BLEServerCallbacks { nična onConnect (BLEServer * pserver) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Znotraj funkcije nastavitve praznine sprožimo serijsko komunikacijo na 115200 za odpravljanje napak in nato inicializiramo napravo Bluetooth s pomočjo funkcije InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indikator nivoja baterije - BLE"); InitBLE (); }
InitBLE je kraj, kjer se vse zgodi čarovnija. Ustvariti moramo strežnik Bluetooth in tukaj uporabiti storitev Battery Level. Pred tem pa moramo določiti UUID za servis, karakteristiko in deskriptor za branje nivoja baterije. Vse UUID lahko dobite na spletnem mestu storitve Bluetooth GATT. V našem primeru poskušamo uporabiti storitev Battery in UUID zanj je definiran kot 0X180F, kot je prikazano spodaj.
Nato moramo vedeti značilnosti, povezane s to storitvijo. Če želite vedeti, da preprosto kliknete na Battery Service, boste preusmerjeni na stran z značilnostmi storitev, kjer je omenjeno, da je nivo baterije ime lastnosti in ima vrednost od 0 do 100. Upoštevajte tudi, da lahko izvedemo samo dva dejanja s to značilnostjo, eno je branje, ki je obvezno, drugo pa obveščanje, ki ni obvezno. Torej moramo odjemalcu (telefonu) poslati vrednost baterije, ki je obvezna in po potrebi lahko telefon obvestimo o neobvezni.
Toda počakajte, še vedno nismo našli vrednosti UUID za značilno raven baterije. Če želite to narediti, pojdite na stran z značilnostmi akumulatorja in poiščite ime nivoja akumulatorja, kjer boste našli njegov UUID kot 0X2A19;
Zdaj, ko imamo vse vrednosti, ga postavimo v program, kot je prikazano spodaj. Ime BatterySerivce , BatteryLevelCharacteristic in BatteryLevelDescriptor so uporabniško določene spremenljivke se nanašajo na storitve, ki so značilne in Descriptor, ki jih uporabljamo v programu. Vrednost za deskriptor 0X2901 se uporablja, če je velikost vrednosti 8-bitna, več informacij najdete na strani Opis deskriptorja.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Vrnitev k funkciji initBLE . Najprej moramo zagnati strežnik BLE in ga oglaševati z imenom. V naslednji vrstici se uporabljajo za zagon ble kot strežnik. Ime, ki sem ga dal svojemu strežniku BLe, je »BLE Battery«, vendar lahko izberete svojega.
BLEDevice:: init ("BLE baterija"); // Ustvari strežnik BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (novo MyServerCallbacks ());
Nato moramo zagnati storitev GATT, ker smo že definirali UUID, lahko storitev preprosto zaženemo s spodnjo vrstico.
// Ustvari storitev BLE BLEService * pBattery = pServer-> createService (BatteryService);
Ko se storitev zažene, lahko deskriptor povežemo z značilnostmi in nastavimo vrednosti. Tu je dodana tudi storitev BLE2902, kot je prikazano spodaj.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Odstotek 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (novo BLE2902 ());
Končno je vse nastavljeno, zdaj je ostalo le, da prosimo ESP32, da se oglašuje, da ga lahko druge naprave, kot je naš telefon, odkrijejo in se nanj povežejo, ko je povezan s stranko, pa mora začeti storitev akumulatorja, ki jo lahko opravi naslednje vrstice.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Začni oglaševati pServer-> getAdvertising () -> start ();
To je zaenkrat dobro, zadnji korak je opisati deskriptorju, kolikšna je vrednost baterije v odstotkih, ki jo je treba poslati odjemalcu (telefonu). Ta vrednost je lahko od 0 do 100, kot smo prebrali že prej, da bom stvari poenostavil, sem preprosto trdo kodiral vrednost baterije 57 in jo nato povečeval vsakih 5 sekund in začel od 0, ko doseže 100. Koda, ki jo je treba narediti to je prikazano spodaj. Upoštevajte, da je vrednost, ki jo pošiljate, v formatu unit8_t.
uint8_t raven = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); zamuda (5000); raven ++; Serial.println (int (nivo)); če je (int (nivo) == 100) nivo = 0; }
Testiranje storitve GATT na ESP32 BLE
Popolna koda je pojasnjeno zgoraj je podan na koncu strani. Naložite kodo na ploščo ESP32. Ko naložite telefon, naj odkrije napravo Bluetooth z imenom »BLE Battery«.
Nato namestite aplikacijo nRF android in jo odprite ter povežite z napravo BLE Battery BLE. Razširite razdelek Baterija in našli bi naslednji zaslon.
Kot lahko vidite, je aplikacija samodejno ugotovila, da BLE zagotavlja baterijo in ima značilnosti nivoja baterije zaradi UUID, ki smo ga uporabili v programu. Prav tako lahko vidite trenutno vrednost akumulatorja, ki je 67%, počakajte 5 sekund, opazite pa tudi, da se poveča.
Fina stvar pri uporabi BLE je, da bo zdaj vsaka aplikacija, ki deluje z BLE, mislila, da je vaš ESP32 naprava BLE, ki obvešča o nivoju baterije. Da bi ga preizkusil, sem uporabil aplikacijo, imenovano BatON, ki je prepoznala ESP32 kot baterijsko napravo z baterijskim napajanjem in na telefonu poslala tako odstotno obvestilo
Kul !! Prav? Celotno delo sem prikazal tudi v spodnjem videu. Zdaj, ko ste se naučili, kako uporabljati storitve BLE Battery z ESP32, lahko preizkusite tudi druge storitve GATT, ki so zelo zanimive, kot so pulzni utrip, HID, srčni utrip itd. Zabavajte se….