- Terminai, susiję su BLE („Bluetooth Low Energy“)
- Aparatūros paruošimas
- ESP32 programavimas akumuliatoriaus lygio rodymui naudojant GATT paslaugą
- GATT paslaugos testavimas naudojant ESP32 BLE
Belaidės ausinės, kūno rengybos juostos, „Bluetooth“ garsiakalbiai, ausinės ausyse, mobilieji telefonai, nešiojamieji kompiuteriai… aplink mus yra tiek daug „Bluetooth“ įrenginių, ir dauguma jų yra valdomi baterijomis. Ar kada pagalvojote, kaip prijungus „Bluetooth“ įrenginį prie savo mobiliojo telefono, kaip jis automatiškai supranta, kad prijungtas įrenginys yra kompiuteris, garso įrenginys ar mobilusis telefonas? Kai kuriuose įrenginiuose mūsų telefonas net automatiškai pranešimų juostoje rodo prijungto įrenginio akumuliatoriaus kiekį. Kaip visa tai vyksta savaime? Turėtų būti bendras telefono ir „Bluetooth“ įrenginio bendras protokolas!
Būkite įdomūs, gausite atsakymus į šiuos klausimus, kai mes bandysime suprasti „ Bluetooth Low Energy“ (trumpai - BLE), naudodami populiarųjį ESP32 modulį. Skirtingai nuo klasikinio „Bluetooth“, esančio ESP32, BLE veikia tik tada, kai ryšys yra įjungtas ir kitu atveju lieka miego režimu, todėl tai yra tinkamas pasirinkimas baterijomis maitinamoms programoms. BLE taip pat gali sudaryti tinklų tinklus ir veikti kaip švyturiai. Paprastai BLE moduliai veikia arba kaip serveris, arba kaip klientas, čia mes naudosime ESP32 BLE kaip serverį.
Kad būtų lengviau suprasti, visą ESP32 „Bluetooth“ padalijome į tris segmentus.
1. ESP32 serijinis „Bluetooth“ įjungiamas šviesos diodas iš mobiliojo telefono
2 . BLE serveris siunčia baterijos lygio duomenis į mobilųjį telefoną naudodamasis „GATT“ paslauga
3. BLE klientas ieško BLE įrenginių ir veikia kaip švyturys.
Pirmąjį straipsnį jau apžvelgėme; Šiame straipsnyje mes sužinosime, kaip priversti ESP32 BLE veikti kaip serverį ir naudoti GATT paslaugą informacijai apie baterijos lygį siųsti. Bandymo tikslu mes per „BLE GATT“ paslaugą išsiųsime „hardcod“ reikšmes iš ESP32 kaip akumuliatoriaus procentą į savo mobilųjį telefoną, tokiu būdu mūsų „Mobile“ manys, kad ESP32 yra baterijomis valdomas „Bluetooth“ įrenginys, kuris bando išsiųsti savo baterijos procentą. Prieš pradėdami smulkmenas, mes suprasime keletą terminų, susijusių su „Bluetooth Low Energy“.
Terminai, susiję su BLE („Bluetooth Low Energy“)
BLE serveris: Kaip buvo pasakyta anksčiau, BLE gali būti užprogramuota veikti kaip serveris arba kaip klientas. Dirbdamas kaip serveris, BLE gali pateikti tik duomenis, negalėdamas užmegzti ryšio. Pavyzdys galėtų būti kūno rengybos grupė. Serveris galėjo siųsti informaciją tik klientui paprašius.
Dažniausiai ESP32 BLE naudojamas serveris. Kiekviename serveryje bus viena ar daugiau Paslaugų, taip pat kiekviena paslauga turės vieną ar daugiau su ja susijusių savybių. Charakteristikos viduje gali būti nulis, vienas ar daugiau nei vienas deskriptorius. Kiekviena paslauga, charakteristika ar aprašas turės savo iš anksto nustatytą unikalų ID, vadinamą UUID.
„BLE Client“: klientas gali nuskaityti ryšį ir klausytis kitų „Bluetooth“ įrenginių. Pavyzdys galėtų būti jūsų mobilusis telefonas. Atkreipkite dėmesį, kad dauguma „BLE“ aparatinės įrangos gali veikti kaip serveris ir kaip klientas - tai programinė įranga, kuri nusprendžia įrenginio vaidmenį.
Periferinis įrenginys / Centrinis įrenginys: BLE tinkle gali būti tik vienas centrinis įrenginys, tačiau jis gali turėti tiek periferinių įrenginių, kiek reikia. Centrinis įrenginys gali prisijungti prie visų periferinių įrenginių tuo pačiu metu, tačiau periferinis įrenginys gali prisijungti tik prie centrinio įrenginio, tokiu būdu du periferiniai įrenginiai negali dalytis duomenimis tarpusavyje. Geriausias „Central“ įrenginio pavyzdys bus mūsų išmanieji telefonai, o periferiniam įrenginiui - „Bluetooth“ ausinės ar kūno rengybos juostos.
„BLE Advertising“: „BLE Advertising“ yra „geeky“ terminas, nurodantis, kad „Bluetooth“ įrenginys būtų matomas visiems, kad jis galėtų susieti ir užmegzti ryšį. Tai gali būti laikoma vienpusiu ryšiu. Čia serveris nuolat reklamuoja duomenis, tikėdamasis, kad serveris juos gaus. „BLE Beacon“ yra BLE rūšis.
UUID (universalus unikalus identifikatorius): kiekvienam BLE „Bluetooth“ įrenginiui suteikiamas universalus unikalus identifikatoriaus numeris, kai jį užprogramuoja programuotojas. Galite galvoti apie šį identifikatorių kaip skaičių seką, kuri atspindi BLE įrenginio funkcionalumą / vaidmenį. Vėlgi yra dviejų tipų UUID. Vienas iš jų yra „ Service UUID “, kitas - „ Characteristic UUID“.
GATT paslauga: GATT reiškia bendrųjų atributų profilį; tai apibrėžia keletą standartinių būdų, kuriais visada turėtų bendrauti du BLE įrenginiai. Šis atributų (ATT) protokolas yra iš anksto nustatytas ir būdingas visiems BLE įrenginiams, todėl bet kurie du BLE įrenginiai gali identifikuoti vienas kitą. Taigi GATT buvo atsakymas į mūsų ankstesnį klausimą.
Techniką, pagal kurią du BLE įrenginiai turėtų siųsti duomenis į priekį ir atgal, apibrėžia sąvoka, vadinama paslaugomis ir charakteristikomis.
„BLE Service“ / „BLE“ charakteristika: „Service UUID“ nurodo, kokio tipo paslaugą atliks BLE įrenginys, o „Characteristic UUID“ nurodo parametrus ar funkcijas, kurias atliks ta paslauga. Taigi kiekviena tarnyba turi vieną ar daugiau savybių. Gerai! Iš kur programuotojas gauna šį UUID? Kiekvieną UUID jau apibrėžia GATT („Generic Attribute Profile“). Galite apsilankyti jų svetainėje ir pasirinkti UUID, jei reikia projektui. Žinau, kad jis šiek tiek atsimušė į mūsų galvą; pabandykime tai suprasti pavyzdžiu.
Tarkime, kad garso grotuvo BLE įrenginys. Iš pradžių, kai suporuojate jį su savo telefonu, jūsų telefonas jį identifikuoja kaip garso įrenginį, taip pat būsenos juostoje rodo akumuliatoriaus įkrovos lygį. Taigi, kad tai įvyktų, garso grotuvas turi kažkaip pasakyti savo telefonui, kad jis nori dalytis akumuliatoriaus įkrovos ir jo įkrovimo procentais. Tai daroma naudojant UUID, yra konkretus UUID, sakantis, kad BLE kauliukai pateiks išsamią informaciją apie šio UUID akumuliatoriaus lygį, kuris pasako, kad paslaugos tipas vadinamas Service UUID, vėlgi gali būti tiek daug parametrų, kuriuos reikia būti pakeista už tokios paslaugos atlikimą, kaip antai tokio parametro yra akumuliatoriaus vertė, kiekvienas parametras turės savo UUID ir tai vadinama Charakteristiniu UUID.Bendra funkcija, kurią atlieka charakteristika, yra Skaityti, Rašyti, Pranešti ir Nurodyti.
BLE deskriptorius: deskriptorius yra pasirinktinis atributas, esantis charakteristikos viduje. Paprastai deskriptorius nurodo, kaip pasiekti charakteristiką.
„BLE“ švyturys: „Bluetooth“ švyturys yra labiau panašus į artumo jungiklį, kuris atlieka tam tikrą iš anksto nustatytą veiksmą, kai vartotojas patenka į diapazoną (arti). Ji nuolat reklamuoja savo tapatybę ir yra pasirengusi visada poruotis.
BLE2902: Aš vis dar skeptiškai vertinu šį dalyką, bet jūs galite tai galvoti kaip apie programinės įrangos dalį kliento pusėje, kuri informuoja serverį įjungti arba išjungti pranešimą, tai padės mums taupyti energiją
Tikiuosi, kad turite apytikslę idėją, gerai yra tai, kad mums nereikia daug žinoti, nes visos rankdarbės jau yra atliktos mums, nors bibliotekos.
Aparatūros paruošimas
Projektas nereikalauja aparatinės įrangos sąrankos, tačiau įsitikinkite, kad prie „Arduino IDE“ pridėjote išsamią ESP32 plokštės informaciją ir išbandėte minimalią „Blink“ pavyzdinę programą, kad patikrintumėte, ar viskas veikia taip, kaip tikėtasi. Jūs abejojate, kaip tai padaryti, galite sekti „Pradėti naudoti ESP32 su„ Arduino “pamoka, kad padarytumėte tą patį.
Taip pat norėdami išbandyti BLE paslaugas, savo mobiliajame telefone naudosime „nRF android“ programą, kurią galima tiesiogiai atsisiųsti iš „PlayStore“. Jis taip pat yra „iTunes“ parduotuvėje, skirtas „iPhone“ vartotojams. Jei planuojate dirbti su BLE ilgą laiką, ši programa tikrai pravers derinimo tikslais.
ESP32 programavimas akumuliatoriaus lygio rodymui naudojant GATT paslaugą
Šiuo metu manau, kad jūs turite teisingą idėją apie tai, kokia GATT paslauga ir kaip ji įgyvendinama naudojant tarnybą ir būdingus modelius. Dabar pasinerkime į programą, kad sužinotume, kaip ji įdiegta ESP32 naudojant „Arduino IDE“. Prieš tęsdami, norėčiau pasinaudoti šia vieta ir padėkoti Andreasui Spiessui už jo vaizdo įrašą „BLE“, kuris labai aiškiai parodė mano pusę.
Programą pradedame importuodami reikalingas bibliotekas į savo eskizą. Yra daugybė dalykų, kuriuos reikia sukonfigūruoti, norint, tikiuosi, naudoti ESP32 BLE funkciją, nors dėkojame Neilui Kolbanui, kuris jau atliko sunkų darbą už mus ir aprūpino bibliotekomis. Jei norite suprasti bibliotekų funkcionalumą, galite kreiptis į jo dokumentaciją „github“ puslapyje.
# įtraukti
Toliau turime nustatyti „Bluetooth“ įrenginio „Call-back“ funkciją. Prieš tai leidžia suprasti, kas yra skambinimo funkcija BLE.
Kas yra skambinimo funkcija BLE?
Kai BLE veikia kaip serveris, svarbu apibrėžti serverio atgalinio skambinimo funkciją. Su BLE yra susieta daugybė atgalinių skambučių tipų, tačiau, paprasčiau tariant, jūs manote, kad tai patvirtinimas, atliekamas norint įsitikinti, kad veiksmas atliktas. Serverio atgalinis skambutis naudojamas siekiant užtikrinti, kad kliento ir serverio ryšys būtų sėkmingai užmegztas.
Mes naudojame šias kodo eilutes, kad atliktume serverio atgalinį skambutį.
bool _BLEClientConnected = klaidinga; class MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Viduje negaliojančios sąrankos funkcija mes inicijuojame nuoseklųjį ryšį 115200 derinimui ir tada inicijuojame „Bluetooth“ įrenginį per „ InitBLE“ funkciją.
negaliojanti sąranka () { Serial.begin (115200); Serial.println („Baterijos lygio indikatorius - BLE“); InitBLE (); }
InitBLE yra ta vieta, kur visi magija atsitiks. Turime sukurti „Bluetooth“ serverį ir naudotis „Battery Level“ paslauga čia. Bet prieš tai mes turime apibrėžti UUID paslaugai, charakteristikai ir aprašui, norint nuskaityti akumuliatoriaus lygį. Visą UUID galima gauti „Bluetooth GATT“ paslaugos svetainėje. Šiuo atveju mes bandome naudoti akumuliatoriaus paslaugą, o UUID tai apibrėžiama kaip 0X180F, kaip parodyta žemiau.
Toliau turime žinoti su šia paslauga susijusias charakteristikas. Norėdami tai žinoti, tiesiog spustelėkite „Akumuliatoriaus tarnyba“ ir pateksite į „Serviso charakteristikų“ puslapį, kur minima, kad akumuliatoriaus įkrovos lygis yra charakteristikų pavadinimas ir jo vertė yra nuo 0 iki 100. Taip pat atkreipkite dėmesį, kad galime atlikti tik du veiksmai, turintys šią charakteristiką, vienas yra perskaityti, kurį privaloma atlikti, o kitas - pranešti, kuris yra neprivalomas. Taigi mes turime išsiųsti klientui (telefonui) akumuliatoriaus vertę, kuri yra privaloma, ir prireikus galime pranešti apie tai, kas yra neprivaloma.
Bet palaukite, vis tiek neradome charakteringo akumuliatoriaus lygio UUID vertės. Norėdami tai padaryti, pateksite į „Baterijos charakteristikų“ puslapį ir ieškokite „Baterijos lygio“ pavadinimo, jo UUID rasite kaip 0X2A19, to paties momentinė nuotrauka parodyta žemiau.
Dabar, kai turime visas vertes, įdėkime ją į programą, kaip parodyta žemiau. Pavadinimas „ BatterySerivce“ , „ BatteryLevelCharacteristic“ ir „ BatteryLevelDescriptor“ yra vartotojo apibrėžti kintamieji, nurodantys paslaugą, charakteristiką ir deskriptorių, kurį naudojame programoje. 0X2901 deskriptoriaus reikšmė naudojama, kai vertės dydis yra 8 bitai, daugiau informacijos galite rasti aprašo aprašo puslapyje.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); „BLEDescriptor BatteryLevelDescriptor“ (BLEUUID (((uint16_t) 0x2901));
Sugrįžimas į initBLE funkcija. Pirmiausia turime paleisti BLE serverį ir priversti jį reklamuoti pavadinimu. Šios eilutės naudojamos paleisti BLE kaip serverį. Pavadinimas, kurį suteikiau savo „BLe“ serveriui, yra „BLE Battery“, tačiau galite pasirinkti savo.
BLEDevice:: init („BLE baterija“); // Sukurkite BLE serverio BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nauji „MyServerCallbacks“);
Tada turime paleisti GATT paslaugą, nes mes jau apibrėžėme UUID, mes galime tiesiog paleisti paslaugą naudodamiesi žemiau esančia linija.
// Sukurkite BLE paslaugą BLEService * pBattery = pServer-> createService (BatteryService);
Paleidus paslaugą, mes galime susieti aprašą su charakteristikomis ir nustatyti vertes. Čia taip pat pridedama BLE2902 paslauga, kaip parodyta žemiau.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Procentai 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (naujas BLE2902 ());
Pagaliau viskas nustatyta, dabar belieka paprašyti „ESP32“ reklamuotis, kad kiti įrenginiai, pvz., Mūsų telefonas, galėtų jį atrasti ir prisijungti, o prisijungę prie kliento, turėtų inicijuoti akumuliatoriaus paslaugą, kurią galima atlikti naudojant sekančios eilutės.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> pradžia (); // Pradėti reklamuoti pServer-> getAdvertising () -> start ();
Tai yra iki šiol taip gerai, paskutinis žingsnis yra pasakyti aprašytojui, kokia yra akumuliatoriaus vertė procentais, kuri turėtų būti siunčiama klientui (telefonui). Ši vertė gali būti nuo 0 iki 100, kaip mes skaitėme anksčiau, kad viskas būtų paprasta, aš paprasčiausiai užkodavau akumuliatoriaus vertę, kad ji būtų 57, tada kas 5 sekundes ją padidinsiu ir pradėsiu nuo 0, kai tik ji pasieks 100. Kodas, kurį reikia padaryti tai parodyta žemiau. Atminkite, kad siunčiama reikšmė yra format_ unit__t.
uint8_t lygis = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); vėlavimas (5000); lygis ++; Serial.println (int (lygis)); if (int (lygis) == 100) lygis = 0; }
GATT paslaugos testavimas naudojant ESP32 BLE
Visiškai kodas paaiškinta pirmiau yra duotas puslapio pabaigoje. Įkelkite kodą į savo ESP32 plokštę. Įkėlus telefoną, jis turėtų rasti „Bluetooth“ įrenginį, vadinamą „BLE Battery“.
Tada įdiekite „nRF android“ programą, atidarykite ją ir prijunkite prie „BLE Battery BLE“ įrenginio. Išplėskite skyrių „Akumuliatoriaus tarnyba“ ir turėtumėte rasti šį ekraną.
Kaip matote, programa automatiškai nustatė, kad BLE teikia akumuliatoriaus aptarnavimą ir turi akumuliatoriaus lygio charakteristikas dėl UUID, kurį naudojome programoje. Taip pat galite pamatyti, kad dabartinė 67% akumuliatoriaus vertė laukia 5 sekundes, taip pat galite pastebėti, kad ji didėja.
Puikus dalykas naudojant BLE yra tai, kad dabar bet kuri programa, veikianti su BLE, manys, kad jūsų ESP32 yra BLE įrenginys, kuris praneša apie baterijos lygį. Norėdami tai išbandyti, naudojau programą „BatON“, o programa nustatė ESP32 kaip „Bluetooth“ įrenginį, maitinamą iš akumuliatoriaus, ir nurodiau procentinį pranešimą savo telefone.
Saunus!! Ar ne? Aš taip pat parodžiau visą darbą žemiau esančiame vaizdo įraše. Sužinoję, kaip naudotis „BLE Battery“ paslaugomis naudojant ESP32, galite išbandyti ir kitas GATT paslaugas, kurios yra labai įdomios, pvz., Pulso dažnis, HID, širdies ritmas ir pan.