- Terminologii legate de BLE (Bluetooth Low Energy)
- Pregătirea hardware-ului
- Programarea ESP32 pentru indicarea nivelului bateriei utilizând serviciul GATT
- Testarea serviciului GATT pe ESP32 BLE
Căști fără fir, benzi de fitness, boxe Bluetooth, căști intraauriculare, telefoane mobile, laptop-uri… există atât de multe dispozitive Bluetooth în jurul nostru și majoritatea acestor dispozitive funcționează pe baterie. V-ați întrebat vreodată că, atunci când conectați un dispozitiv Bluetooth la telefonul mobil, cum înțelege automat că dispozitivul conectat este un computer sau un dispozitiv audio sau un telefon mobil? Pentru unele dispozitive, telefonul nostru ar putea chiar să afișeze automat procentajul bateriei dispozitivului conectat pe bara de notificare. Cum se întâmplă toate acestea de la sine? Ar trebui să existe un protocol comun partajat între telefon și dispozitivul Bluetooth!
Rămâneți curios, veți primi răspunsuri pentru aceste întrebări, pe măsură ce încercăm să înțelegem Bluetooth Low Energy (BLE pe scurt), cu popularul modul ESP32. Spre deosebire de Bluetooth-ul clasic în ESP32, BLE funcționează numai atunci când o comunicare este activată și rămâne în modul de repaus în caz contrar, aceasta îl face alegerea potrivită pentru aplicațiile alimentate cu baterie. BLE poate forma, de asemenea, rețele mesh și poate acționa ca faruri. În mod normal, un modul BLE funcționează fie ca server, fie ca client, aici vom folosi ESP32 BLE ca server.
Aici am împărțit complet ESP32 Bluetooth în trei segmente pentru ușurința înțelegerii.
1. Bluetooth serial pe LED-ul ESP32 care comută de pe telefonul mobil
2 . Server BLE pentru a trimite date la nivelul bateriei către telefonul mobil folosind serviciul GATT
3. Clientul BLE să scaneze dispozitivele BLE și să acționeze ca un far.
Am acoperit deja primul articol; în acest articol vom învăța cum să facem ca ESP32 BLE să funcționeze ca server și să folosim serviciul GATT pentru a trimite informații despre nivelul bateriei. În scopul testării, vom trimite valori codificate din ESP32 ca procentaj de baterie pe telefonul nostru mobil prin serviciul BLE GATT, în acest fel, telefonul nostru mobil va presupune că ESP32 este un dispozitiv Bluetooth cu baterie care încearcă să trimită la procentul său de baterie. Înainte de a intra în detaliu, vom înțelege câteva terminologii legate de Bluetooth Low Energy.
Terminologii legate de BLE (Bluetooth Low Energy)
Server BLE: După cum sa spus mai devreme, BLE poate fi programat să funcționeze fie ca server, fie ca client. Când lucrează ca server, BLE poate furniza doar date, nu poate iniția o conexiune. Un exemplu ar fi o bandă de fitness. Un server poate trimite informații numai dacă clientul solicită acest lucru.
Cel mai frecvent BLE-ul ESP32 este folosit ca server. Fiecare server va avea unul sau mai multe servicii în cadrul său și, în mod similar, fiecare serviciu va avea una sau mai multe caracteristici asociate acestuia. O caracteristică poate avea zero, unul sau mai mulți descriptori în interior. Fiecare serviciu, caracteristică sau descriptor va avea propriul ID unic predefinit numit UUID.
Client BLE: Clientul poate scana conectarea și asculta alte dispozitive Bluetooth. Un exemplu ar fi telefonul dvs. mobil. Rețineți că majoritatea dispozitivelor hardware BLE pot funcționa ca server și ca client, software-ul care decide rolul dispozitivului.
Dispozitiv periferic / dispozitiv central: într-o rețea BLE ar putea exista un singur dispozitiv central, dar poate avea cât mai multe dispozitive periferice, după cum este necesar. Dispozitivul central se poate conecta la toate dispozitivele periferice în același timp, dar dispozitivul periferic se poate conecta numai la dispozitivul central, astfel nu există două dispozitive periferice care să poată partaja date între ele. Un cel mai bun exemplu pentru dispozitivul central va fi Telefoanele noastre inteligente, iar pentru dispozitivul periferic vor fi căștile noastre Bluetooth sau benzile de fitness.
Publicitate BLE: o reclamă BLE este un termen ciudat care indică dispozitivului Bluetooth să fie vizibil pentru toți, astfel încât să poată asocia și să stabilească o conexiune. Poate fi considerat o comunicare unidirecțională. Aici serverul păstrează datele publicitare, așteaptă ca un server să le primească. BLE Beacon este un tip de BLE.
UUID (Universal Unique Identifier): Fiecare dispozitiv Bluetooth BLE primește un număr Universal Universal Identifier când este programat de programator. Vă puteți gândi la acest identificator ca la o secvență de numere care reprezintă funcționalitatea / rolul dispozitivului BLE. Din nou, există două tipuri de UUID. Unul este UUID de serviciu și celălalt este UUID caracteristic.
Serviciul GATT: GATT înseamnă Profil de atribut generic; aceasta definește câteva moduri standard prin care două dispozitive BLE ar trebui să comunice întotdeauna. Acest protocol de atribut (ATT) este predefinit și este comun pentru toate dispozitivele BLE, astfel încât orice două dispozitive BLE se pot identifica reciproc. Deci, GATT a fost răspunsul la întrebarea noastră anterioară.
Tehnica cu care două dispozitive BLE ar trebui să trimită date către și înapoi este definită de conceptul numit servicii și caracteristici.
Serviciu BLE / caracteristică BLE: UUID-ul de serviciu ne spune ce tip de serviciu va efectua dispozitivul BLE și UUID-ul caracteristic spune care sunt parametrii sau funcțiile care vor fi efectuate de acel serviciu. Deci, fiecare Serviciu va avea una sau mai multe caracteristici sub ele. Bine! De unde ia programatorul acest UUID? Fiecare UUID este deja definit de GATT (Generic Attribute Profile). Puteți vizita site-ul web și puteți selecta UUID după cum este necesar pentru proiect. Știu că ne-a sărit puțin peste cap; să încercăm să o înțelegem cu un exemplu.
Să presupunem dispozitivul BLE al unui player audio. Inițial, când îl asociați cu telefonul, telefonul îl identifică ca un dispozitiv audio și afișează, de asemenea, nivelul bateriei pe bara de stare. Deci, pentru ca acest lucru să se întâmple, playerul audio trebuie să-i spună cumva telefonului că este dispus să împartă nivelul bateriei și procentul de încărcare pe care îl are în baterie. Acest lucru se face folosind UUID, există un UUID specific care spune că zarurile BLE vor furniza detalii despre nivelul bateriei, acest UUID care spune că tipul de serviciu se numește UUID de serviciu, din nou ar putea exista atât de mulți parametri care trebuie să fie să fie schimbat pentru finalizarea unui serviciu precum valoarea bateriei este pe un astfel de parametru, fiecare parametru va avea propriul UUID și acestea se numesc UUID caracteristic.Funcția comună îndeplinită de o caracteristică este Citire, Scriere, Notificare și Indicare.
Descriptor BLE: Descriptorul este un atribut opțional care este prezent în interiorul caracteristicii. Un descriptor specifică în mod normal cum să accesați o caracteristică.
BLE Beacon: Un Beacon Bluetooth este mai mult ca un comutator de proximitate care efectuează o acțiune predefinită atunci când utilizatorul intră într-un interval (proximitate apropiată). Își face publicitate identității tot timpul și, prin urmare, este gata să se împerecheze întotdeauna.
BLE2902: Sunt încă sceptic în legătură cu acest lucru, dar vă puteți gândi la el ca la un software pe partea clientului care informează serverul să activeze sau să oprească notificarea, acest lucru ne va ajuta să economisim energie
Sper că ai o idee aproximativă, bine este că nu trebuie să știm prea multe, deoarece toate lucrările manuale sunt deja făcute pentru noi, deși bibliotecile.
Pregătirea hardware-ului
Proiectul nu necesită configurare hardware, dar asigurați-vă că ați adăugat detaliile plăcii ESP32 pe ID-ul dvs. Arduino și ați încercat un program minim de intermitent pentru a verifica dacă totul funcționează conform așteptărilor. Sunteți sceptic cu privire la modul de a face acest lucru, puteți urma tutorialul Noțiuni introductive despre ESP32 cu Arduino pentru a face același lucru.
De asemenea, pentru a testa serviciile BLE, vom folosi aplicația Android nRF de pe mobilul nostru, care poate fi descărcată direct din PlayStore. De asemenea, este disponibil în magazinul iTunes pentru utilizatorii de iPhone. Dacă intenționați să lucrați cu BLE pentru o lungă perioadă de timp, această aplicație vă va fi foarte utilă în scopuri de depanare.
Programarea ESP32 pentru indicarea nivelului bateriei utilizând serviciul GATT
În acest moment, presupun că aveți o idee corectă cu privire la ce serviciu GATT și cum este implementat utilizând serviciile și modelele caracteristice. Acum, haideți să ne scufundăm în program pentru a afla cum este implementat în ESP32 folosind Arduino IDE. Înainte de a continua, aș dori să folosesc acest spațiu pentru a-i mulțumi lui Andreas Spiess pentru videoclipul său BLE, care a făcut lucrurile foarte clare de partea mea.
Începem programul importând bibliotecile necesare în schița noastră. Există o mulțime de lucruri de configurat pentru a utiliza funcționalitatea BLE a ESP32, sperăm, deși datorită lui Neil Kolban care a făcut deja munca grea pentru noi și a oferit bibliotecile. Dacă doriți să înțelegeți funcționalitatea bibliotecilor, puteți consulta documentația sa pe pagina github.
#include
În continuare trebuie să definim funcția de apelare înapoi a serverului pentru dispozitivul nostru Bluetooth. Înainte de asta, să înțelegem că ceea ce este funcția de apel invers în BLE.
Ce este funcția de apel invers în BLE?
Când BLE funcționează ca server, este important să definiți o funcție de apelare server. Există multe tipuri de apeluri de apel asociate cu BLE, dar pentru a le simplifica, le considerați ca o confirmare efectuată pentru a vă asigura că acțiunea a fost finalizată. O apelare de server este utilizată pentru a se asigura că conexiunea dintre client și server este stabilită cu succes.
Folosim următoarele linii de cod pentru a efectua un apel invers de server.
bool _BLEClientConnected = false; clasa MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
În interiorul funcției de configurare nulă , inițiam comunicarea serială la 115200 pentru depanare și apoi inițializăm dispozitivul Bluetooth prin funcția InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indicator nivel baterie - BLE"); InitBLE (); }
InitBLE este locul în care toate magia se întâmplă. Trebuie să creăm un server Bluetooth și să folosim serviciul Battery Level aici. Dar înainte de asta trebuie să definim UUID pentru service, caracteristică și descriptor pentru citirea nivelului bateriei. Toate UUID-urile pot fi obținute de pe site-ul web al serviciului Bluetooth GATT. Pentru cazul nostru, încercăm să folosim serviciul Baterie, iar UUID pentru acesta este definit ca 0X180F așa cum se arată mai jos.
În continuare, trebuie să cunoaștem caracteristica asociată acestui serviciu. Pentru a ști că pur și simplu faceți clic pe Service baterie și veți fi direcționat la pagina Caracteristici service, unde se menționează că Nivelul bateriei este numele caracteristicilor și ia valoarea de la 0 la 100. De asemenea, rețineți că putem efectua doar două acțiuni cu această caracteristică, una este să citești ceea ce este obligatoriu de făcut și cealaltă este Notificare care este opțională. Deci, trebuie să trimitem valoarea bateriei către client (Telefon), care este obligatorie și, dacă este necesar, putem anunța telefonul despre care este opțional.
Dar așteptați, încă nu am găsit valoarea UUID pentru nivelul caracteristic al bateriei. Pentru aceasta, accesați pagina Caracteristică baterie și căutați numele nivelului bateriei, veți găsi UUID-ul său ca 0X2A19, instantaneul acestuia este prezentat mai jos.
Acum, că avem toate valorile, permiteți-i să punem programul așa cum se arată mai jos. Numele BatterySerivce , BatteryLevelCharacteristic și BatteryLevelDescriptor sunt variabile definite de utilizator pentru a se referi la serviciul, caracteristica și descriptorul pe care le folosim în program. Valoarea pentru descriptorul 0X2901 este utilizată atunci când dimensiunea valorii este de 8 biți, mai multe informații pot fi găsite pagina Descrierea descriptorului.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Revenind la funcția initBLE . Mai întâi trebuie să pornim serverul BLE și să îl facem să facă publicitate cu un nume. În următoarele linii sunt folosite pentru a porni BLE ca server. Numele pe care l-am dat serverului meu BLe este „BLE Battery”, dar vă puteți alege unul.
BLEDevice:: init ("BLE Baterie"); // Creați serverul BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (new MyServerCallbacks ());
Apoi trebuie să începem serviciul GATT, deoarece am definit deja UUID, putem pur și simplu să pornim serviciul folosind linia de mai jos.
// Creați serviciul BLE BLEService * pBattery = pServer-> createService (BatteryService);
Odată ce serviciul este pornit, putem lega descriptorul cu caracteristicile și putem seta valorile. Serviciul BLE2902 este, de asemenea, adăugat aici, așa cum se arată mai jos.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Procent 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (nou BLE2902 ());
În cele din urmă totul este setat, acum nu mai rămâne decât să solicitați ESP32 să facă publicitate, astfel încât alte dispozitive precum telefonul nostru să îl poată descoperi și să se conecteze la acesta, iar atunci când este conectat la un client ar trebui să inițieze serviciul Baterie, care se poate urmând rândurile.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Începeți publicitatea pServer-> getAdvertising () -> start ();
Asta este până acum atât de bine, ultimul pas este să spuneți descriptorului care este valoarea bateriei în procente care ar trebui trimise clientului (Telefon). Această valoare poate fi de la 0 la 100, așa cum am citit mai devreme, pentru a simplifica lucrurile, am o codificare simplă a valorii bateriei de 57 și apoi creșteți-o la fiecare 5 secunde și începeți de la 0 odată ce ajunge la 100. Codul de făcut care este prezentat mai jos. Rețineți că valoarea care este trimisă este în format unit8_t.
uint8_t level = 57; bucla nulă () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); întârziere (5000); nivel ++; Serial.println (int (nivel)); if (int (level) == 100) level = 0; }
Testarea serviciului GATT pe ESP32 BLE
Codul complet explicat mai sus este dată la sfârșitul paginii. Încărcați codul pe placa ESP32. Odată încărcat, telefonul dvs. ar trebui să descopere un dispozitiv Bluetooth numit „BLE Battery”.
Apoi instalați aplicația Android nRF și deschideți-o și conectați-vă la dispozitivul BLE Battery BLE. Extindeți secțiunea Service baterie și ar trebui să găsiți următorul ecran.
După cum puteți vedea, aplicația a identificat automat că BLE oferă service baterie și are caracteristicile nivelului bateriei datorită UUID-ului pe care l-am folosit în program. Puteți vedea, de asemenea, că valoarea actuală a bateriei, care este de 67%, așteaptă 5 secunde și puteți observa, de asemenea, că se mărește.
Interesantul utilizării BLE este că acum orice aplicație care funcționează cu BLE va crede că ESP32 este un dispozitiv BLE care notifică nivelul bateriei. Pentru a încerca, am folosit o aplicație numită BatON, iar aplicația a identificat ESP32 ca dispozitiv Bluetooth alimentat de baterie și a dat notificarea procentuală pe telefonul meu astfel
Misto!! Dreapta? De asemenea, am arătat lucrarea completă în videoclipul de mai jos. Acum, că ați învățat cum să utilizați serviciile BLE Battery cu ESP32, puteți încerca și alte servicii GATT, care sunt foarte interesante, cum ar fi rata pulsului, HID, ritmului cardiac etc.