- Terminologije povezane s BLE (Bluetooth Low Energy)
- Priprema hardvera
- Programiranje ESP32 za indikaciju razine baterije pomoću GATT usluge
- Testiranje svoje GATT usluge na ESP32 BLE
Bežične slušalice, fitnes pojasevi, Bluetooth zvučnici, slušalice za uši, mobiteli, prijenosna računala… toliko je Bluetooth uređaja oko nas i većina tih uređaja radi na baterije. Jeste li se ikad zapitali da, kada povežete Bluetooth uređaj s mobitelom, kako on automatski razumije da je povezani uređaj računalo ili audio uređaj ili mobitel? Za neke uređaje naš telefon možda čak automatski prikazuje postotak napunjenosti povezanog uređaja na traci obavijesti. Kako se sve to događa samo od sebe? Trebao bi postojati zajednički protokol koji telefon dijeli s Bluetooth uređajem, zar ne!
Budite znatiželjni, dobit ćete odgovore na ova pitanja dok pokušavamo razumjeti Bluetooth Low Energy (skraćeno BLE), s popularnim modulom ESP32. Za razliku od klasičnog Bluetootha u ESP32, BLE djeluje samo kada je komunikacija aktivirana i u suprotnom ostaje u načinu mirovanja, što ga čini pravim izborom za aplikacije na baterije. BLE također može oblikovati mrežaste mreže i djelovati kao svjetionici. BLE moduli obično rade ili kao poslužitelj ili kao klijent, ovdje ćemo koristiti ESP32 BLE kao poslužitelj.
Ovdje smo podijelili kompletni ESP32 Bluetooth u tri segmenta radi lakšeg razumijevanja.
1. Serijski Bluetooth na ESP32 za uključivanje i isključivanje LED-a s mobitela
2 . BLE poslužitelj za slanje podataka o razini baterije na mobitel pomoću usluge GATT
3. BLE klijent za skeniranje BLE uređaja i ponašanje kao svjetionik.
Već smo obradili prvi članak; u ovom ćemo članku naučiti kako učiniti da ESP32 BLE radi kao poslužitelj i koristiti GATT uslugu za slanje podataka o razini baterije. Za potrebe testiranja, na naš ćemo mobilni telefon putem usluge BLE GATT poslati kodirane vrijednosti s ESP32 kao postotak baterije, na ovaj način će naš Mobile pretpostaviti da je ESP32 baterijski Bluetooth uređaj koji pokušava poslati svom postotku baterije. Prije ulaska u detalje razumjet ćemo nekoliko terminologija povezanih s Bluetooth Low Energy.
Terminologije povezane s BLE (Bluetooth Low Energy)
BLE poslužitelj: Kao što je ranije rečeno, BLE se može programirati da radi ili kao poslužitelj ili kao klijent. Kada radi kao poslužitelj, BLE može pružiti samo podatke koje ne može inicirati vezu. Primjer bi bio fitness bend. Poslužitelj je mogao poslati informacije samo ako ih klijent zatraži.
Najčešće se ESP32-ov BLE koristi kao poslužitelj. Svaki će poslužitelj u sebi imati jednu ili više usluga, a slično će svaka usluga imati jednu ili više karakteristika povezanih s njom. Karakteristika može sadržavati nulu, jedan ili više deskriptora. Svaka usluga, karakteristika ili deskriptor imat će svoj unaprijed definirani jedinstveni ID pod nazivom UUID.

BLE klijent: Klijent može skenirati povezivanje i slušati druge Bluetooth uređaje. Primjer bi mogao biti vaš mobilni telefon. Imajte na umu da većina BLE hardverskih uređaja može raditi kao poslužitelj i kao klijent, odnosno softver koji odlučuje o ulozi uređaja.
Periferni uređaj / središnji uređaj: U BLE mreži može postojati samo jedan središnji uređaj, ali može imati onoliko perifernih uređaja koliko je potrebno. Centralni uređaj može se istovremeno povezati sa svim perifernim uređajima, ali periferni uređaj može se povezati samo s centralnim uređajem, tako da niti jedan periferni uređaj ne može međusobno dijeliti podatke. Najbolji primjer za središnji uređaj bit će naši pametni telefoni, a za periferne uređaji naše Bluetooth slušalice ili fitnes trake.
BLE oglašavanje: BLE oglašavanje je geeky izraz koji upućuje Bluetooth uređaj da bude vidljiv svima kako bi se mogao upariti i uspostaviti vezu. Može se smatrati jednosmjernom komunikacijom. Ovdje poslužitelj nastavlja oglašavati podatke očekujući da će ih poslužitelj primiti. BLE Beacon je vrsta BLE-a.
UUID (Univerzalni jedinstveni identifikator): Svaki BLE Bluetooth uređaj dobiva univerzalni jedinstveni identifikacijski broj kada ga programer programira. O ovom identifikatoru možete razmišljati kao o nizu brojeva koji predstavlja funkcionalnost / ulogu BLE uređaja. Opet postoje dvije vrste UUID-a. Jedan je UUID usluge, a drugi je Karakteristični UUID.
GATT usluga: GATT je skraćenica od Generic Attribute Profile; ovo definira neke standardne načine pomoću kojih bi dva BLE uređaja uvijek trebala komunicirati. Ovaj protokol atributa (ATT) unaprijed je definiran i zajednički je za sve BLE uređaje, tako da se bilo koja dva BLE uređaja mogu međusobno identificirati. Dakle, GATT je bio odgovor na naše prethodno pitanje.
Tehnika pomoću koje bi dva BLE uređaja trebala slati podatke prema naprijed definirana je konceptom koji se naziva usluge i karakteristike.
BLE usluga / BLE karakteristika: UUID usluge govori nam koju će vrstu usluge BLE uređaj obavljati, a Karakteristični UUID govori koji su parametri ili funkcije koje će ta usluga obavljati. Tako će svaka Usluga imati jednu ili više karakteristika. U redu! Odakle programeru ovaj UUID? Svaki UUID već je definiran GATT-om (Generic Attribute Profile), možete posjetiti njihovu web stranicu i odabrati UUID prema potrebi za projekt. Znam da nam se malo odbio preko glave; pokušajmo to razumjeti na primjeru.
Pretpostavimo BLE uređaj audio playera. U početku kada ga uparite s telefonom, telefon ga prepoznaje kao audio uređaj i također prikazuje razinu baterije na statusnoj traci. Dakle, da bi se to dogodilo, audio uređaj mora nekako reći vašem telefonu da je spreman podijeliti razinu baterije i postotak napunjenosti koju ima u bateriji. To se radi korištenjem UUID-a, postoji određeni UUID koji govori da će BLE kocka pružiti detalje o razini baterije ovaj UUID koji govori da se vrsta usluge naziva Service UUID, opet može postojati toliko parametara koji moraju biti zamijenjeni za izvršavanje usluge kao što je vrijednost baterije na takvom parametru, svaki će parametar imati svoj UUID i oni se nazivaju Karakteristični UUID.Uobičajena funkcija koju obavlja karakteristika je Čitanje, pisanje, obavještavanje i označavanje.
BLE deskriptor: deskriptor je neobavezni atribut koji je prisutan unutar karakteristike. Deskriptor obično određuje kako pristupiti karakteristici.
BLE Beacon: Bluetooth svjetionik je više poput blizinskog prekidača koji izvršava neke unaprijed definirane radnje kada korisnik uđe u domet (neposredna blizina). Stalno oglašava svoj identitet i stoga je spreman za uparivanje uvijek.
BLE2902: I dalje sam sumnjičav prema ovoj stvari, ali možete je smatrati dijelom softvera na klijentskoj strani koji obavještava poslužitelj da uključi ili isključi obavijest, što će nam pomoći u uštedi energije
Nadam se da imate grubu ideju, dobro je što ne moramo znati puno jer su svi ručni radovi za nas već napravljeni u knjižnicama.
Priprema hardvera
Projekt ne zahtijeva postavljanje hardvera, ali provjerite jeste li dodali detalje o ploči ESP32 na svoj Arduino IDE i isprobali minimalni uzorak programa treptanja kako biste provjerili radi li sve kako se očekuje. Skeptični ste kako to učiniti. Možete slijediti Upute za početak rada s ESP32 s Arduinom da biste učinili isto.
Također za testiranje BLE usluga koristit ćemo nRF android aplikaciju na našem mobitelu koja se može izravno preuzeti s PlayStorea. Također je dostupan u Itunes Store za korisnike iPhonea. Ako planirate dugo raditi s BLE-om, ova će aplikacija zaista dobro doći u svrhu uklanjanja pogrešaka.

Programiranje ESP32 za indikaciju razine baterije pomoću GATT usluge
U to vrijeme pretpostavljam da imate dobru ideju o tome koja je GATT usluga i kako se implementira pomoću usluga i karakterističnih modela. Sada, zaronimo u program da bismo saznali kako je implementiran u ESP32 pomoću Arduino IDE-a. Prije nego što nastavimo, htio bih iskoristiti ovaj prostor da se zahvalim Andreasu Spiess-u za njegov video BLE koji je stvari jasno razjasnio s moje strane.
Program započinjemo uvozom potrebnih knjižnica u našu skicu. Puno je stvari potrebno konfigurirati kako bismo koristili ESP32-ovu BLE funkcionalnost, nadamo se, zahvaljujući Neilu Kolbanu koji je već obavio naporan posao za nas i osigurao knjižnice. Ako želite razumjeti funkcionalnost knjižnica, možete pogledati njegovu dokumentaciju na github stranici.
#include
Dalje moramo definirati funkciju povratnog poziva poslužitelja za naš Bluetooth uređaj. Prije toga razumijemo što je funkcija povratnog poziva u BLE-u.
Što je funkcija povratnog poziva u BLE-u?
Kada BLE radi kao poslužitelj, važno je definirati funkciju povratnog poziva poslužitelja. Brojne su vrste povratnih poziva povezane s BLE-om, ali pojednostavljeno rečeno, smatrate ih potvrdom koja se izvodi kako biste bili sigurni da je radnja dovršena. Povratni poziv poslužitelja koristi se kako bi se osiguralo da je veza između klijenta i poslužitelja uspješno uspostavljena.
Sljedeće retke koda koristimo za izvršavanje povratnog poziva poslužitelja.
bool _BLEClientConnected = false; klasa MyServerCallbacks : javni BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Unutar praznog postavljanje funkcija, možemo pokrenuti serijsku komunikaciju na 115200 za ispravljanje pogrešaka, a zatim inicijalizira Bluetooth uređaja putem InitBLE funkciju.
void setup () { Serial.begin (115200); Serial.println ("Pokazatelj razine napunjenosti baterije - BLE"); InitBLE (); }
InitBLE je mjesto gdje sve se događa magija. Moramo stvoriti Bluetooth poslužitelj i ovdje koristiti uslugu Battery Level. Ali prije toga moramo definirati UUID za servis, karakteristike i deskriptor za očitavanje razine baterije. Sve UUID-ove možete dobiti na web mjestu usluge Bluetooth GATT. U našem slučaju pokušavamo koristiti uslugu baterije i UUID za nju je definiran kao 0X180F kao što je prikazano dolje.

Dalje, moramo znati Karakteristike povezane s ovom uslugom. Da biste znali da jednostavno kliknite na Servis baterije i bit ćete preusmjereni na stranicu Karakteristike usluge, gdje se spominje da je Razina baterije naziv karakteristika i uzima vrijednost od 0 do 100. Također imajte na umu da možemo izvesti samo dvije radnje s ovom karakteristikom, jedno je Čitanje što je obavezno učiniti, a drugo Obavijesti što nije obavezno. Stoga moramo poslati vrijednost baterije klijentu (telefonu), što je obavezno, a ako je potrebno možemo obavijestiti telefon o tome što nije obavezno.

Ali pričekajte, još uvijek nismo pronašli vrijednost UUID za karakterističnu razinu baterije. Da biste to učinili, uđite na stranicu Karakteristike baterije i potražite naziv razine baterije, pronaći ćete njen UUID kao 0X2A19, snimak istog prikazan je u nastavku.

Sad kad imamo sve vrijednosti, stavimo ga u program kao što je prikazano u nastavku. Ime BatterySerivce , BatteryLevelCharacteristic i BatteryLevelDescriptor su korisničke varijable koje se odnose na usluge, karakterističan i deskriptor koji mi koristimo u programu. Vrijednost za deskriptor 0X2901 koristi se kada je veličina vrijednosti 8-bitna, više informacija možete pronaći na stranici Opis 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));
Povratak na funkciju initBLE . Prvo moramo pokrenuti BLE poslužitelj i natjerati ga da se oglašava imenom. U sljedeće retke se koriste za pokretanje ble kao poslužitelj. Ime koje sam dao svom BLe poslužitelju je "BLE Battery", ali možete odabrati svoje.
BLEDevice:: init ("BLE baterija"); // Stvaranje BLE poslužitelja BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (novi MyServerCallbacks ());
Dalje moramo pokrenuti GATT uslugu, jer smo već definirali UUID, možemo jednostavno pokrenuti uslugu pomoću donjeg retka.
// Stvorimo BLE uslugu BLEService * pBattery = pServer-> createService (BatteryService);
Jednom kada je usluga pokrenuta, možemo povezati deskriptor sa karakteristikama i postaviti vrijednosti. Ovdje je dodana i usluga BLE2902, kao što je prikazano u nastavku.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Postotak 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (novi BLE2902 ());
Napokon je sve postavljeno, sada ostaje samo tražiti da se ESP32 oglašava kako bi ga drugi uređaji poput našeg telefona mogli otkriti i povezati se s njim, a kada se poveže s klijentom trebao bi pokrenuti uslugu baterije što se može učiniti putem slijedeći redovi.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Pokretanje oglašavanja pServer-> getAdvertising () -> start ();
Da li je to zasad dobro, zadnji korak je reći deskriptoru kolika je vrijednost baterije u postocima koju treba poslati klijentu (telefonu). Ova vrijednost može biti od 0 -100 kao što smo ranije čitali, kako bi stvari bile jednostavne, jednostavno sam tvrdo kodirao vrijednost baterije na 57, a zatim je povećavam svakih 5 sekundi i započinjem s 0 kad dosegne 100. Kôd za napraviti to je prikazano u nastavku. Imajte na umu da je vrijednost koja se šalje u formatu unit8_t.
uint8_t razina = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); kašnjenje (5000); razina ++; Serial.println (int (razina)); ako je (int (razina) == 100) razina = 0; }
Testiranje svoje GATT usluge na ESP32 BLE
Kompletan kod iznad objasnio je dano na kraju stranice. Učitajte kod na svoju ESP32 ploču. Nakon što ga prenesete, telefon bi trebao otkriti Bluetooth uređaj pod nazivom "BLE Battery" (Upari se s njim).

Zatim instalirajte aplikaciju nRF android i otvorite je i spojite na BLE Battery BLE uređaj. Proširite odjeljak Usluga baterija i trebali biste pronaći sljedeći zaslon.

Kao što vidite, aplikacija je automatski prepoznala da BLE pruža uslugu baterija i ima karakteristike razine baterije zbog UUID-a koji smo koristili u programu. Također možete vidjeti da trenutna vrijednost baterije koja iznosi 67% čeka 5 sekundi, a također možete primijetiti kako se povećava.
Super stvar kod korištenja BLE-a je da će sada svaka aplikacija koja radi s BLE-om pomisliti da je vaš ESP32 BLE uređaj koji obavještava o razini baterije. Da bih ga isprobao, koristio sam aplikaciju koja se zove BatON, a aplikacija je identificirala ESP32 kao Bluetooth uređaj na baterije i na ovaj telefon dala obavijest o postotku poput ove

Super !! Pravo? Kompletni rad također sam prikazao u videu ispod. Sada, kad ste naučili kako koristiti usluge BLE Battery s ESP32, možete isprobati i druge GATT usluge koje su vrlo zanimljive poput pulsa, HID, pulsa itd. Zabavite se….
