- Terminologies relacionades amb BLE (Bluetooth Low Energy)
- Preparació del maquinari
- Programació ESP32 per a la indicació del nivell de bateria mitjançant el servei GATT
- Prova del vostre servei GATT a ESP32 BLE
Auriculars sense fils, bandes de fitness, altaveus Bluetooth, auriculars intrauriculars, telèfons mòbils, portàtils… hi ha tants dispositius Bluetooth al nostre voltant i la majoria d’aquests dispositius funcionen amb bateria. Us heu preguntat mai que, quan connecteu un dispositiu Bluetooth al vostre telèfon mòbil, com entén automàticament que el dispositiu connectat és un ordinador, un dispositiu d’àudio o un telèfon mòbil? Per a alguns dispositius, el nostre telèfon pot fins i tot mostrar automàticament el percentatge de bateria del dispositiu connectat a la barra de notificacions. Com passa tot això tot sol? Hi hauria d’haver algun protocol comú compartit entre el telèfon i el dispositiu Bluetooth.
Tingueu curiositat, obtindreu respostes a aquestes preguntes mentre intentem entendre el Bluetooth de baixa energia (BLE en breu), amb el popular mòdul ESP32. A diferència del Bluetooth clàssic de l'ESP32, el BLE només funciona quan s'activa una comunicació i, en cas contrari, es manté en mode de suspensió, això el converteix en l'elecció correcta per a aplicacions amb bateria. BLE també pot formar xarxes de malla i actuar com a balises. Normalment, els mòduls BLE funcionen com a servidor o com a client, aquí utilitzarem ESP32 BLE com a servidor.
Aquí hem dividit el Bluetooth ESP32 complet en tres segments per facilitar la comprensió.
1. Bluetooth de sèrie al LED alternatiu ESP32 des del telèfon mòbil
2 . Servidor BLE per enviar dades de nivell de bateria al telèfon mòbil mitjançant el servei GATT
3. Client BLE per cercar dispositius BLE i fer de far.
Ja hem tractat el primer article; en aquest article aprendrem com fer que l'ESP32 BLE funcioni com a servidor i utilitzarem el servei GATT per enviar informació sobre el nivell de bateria. A efectes de prova, enviarem valors codificats des de l’ESP32 com a percentatge de bateria al nostre telèfon mòbil a través del servei BLE GATT, d’aquesta manera el nostre mòbil assumirà que l’ESP32 és un dispositiu Bluetooth amb bateria que intenta enviar al seu percentatge de bateria. Abans d’entrar en detalls, comprendreem algunes terminologies relacionades amb Bluetooth Low Energy.
Terminologies relacionades amb BLE (Bluetooth Low Energy)
Servidor BLE: com es va dir anteriorment, el BLE es pot programar perquè funcioni com a servidor o com a client. Quan treballa com a servidor, el BLE només pot proporcionar dades i no pot iniciar una connexió. Un exemple seria una banda de fitness. Un servidor només pot enviar informació si el client ho sol·licita.
El més habitual és que el BLE de l'ESP32 s'utilitzi com a servidor. Cada servidor tindrà un o més serveis al seu interior i, de manera similar, cada servei tindrà associada una o més característiques. Una característica pot tenir zero, un o més d'un descriptor al seu interior. Tots els serveis, característiques o descriptors tindran el seu propi ID únic predefinit anomenat UUID.

Client BLE: el client pot escanejar la connexió i escoltar altres dispositius Bluetooth. Un exemple seria el vostre telèfon mòbil. Tingueu en compte que la majoria de dispositius de maquinari BLE poden funcionar com a servidor i com a client, ja que és el programari que decideix el paper del dispositiu.
Dispositiu perifèric / dispositiu central: en una xarxa BLE només hi pot haver un dispositiu central, però pot tenir tants dispositius perifèrics com calgui. El dispositiu central es pot connectar a tots els dispositius perifèrics al mateix temps, però el dispositiu perifèric només es pot connectar al dispositiu central, d'aquesta manera no hi ha cap dispositiu perifèric que pugui compartir dades entre si. Un millor exemple per al dispositiu central seran els nostres telèfons intel·ligents i per al dispositiu perifèric els auriculars Bluetooth o les bandes de fitness.
Publicitat BLE: una publicitat BLE és el terme friki que indica al dispositiu Bluetooth que sigui visible per a tothom perquè pugui emparellar-se i establir una connexió. Es pot considerar com una comunicació de sentit únic. Aquí el servidor continua publicant dades esperant que el rebi un servidor. BLE Beacon és un tipus de BLE.
UUID (Universal Unique Identifier): a cada dispositiu Bluetooth BLE se li proporciona un número d'identificador únic universal quan el programador el programa. Podeu pensar en aquest identificador com una seqüència de nombres que representa la funcionalitat / funció del dispositiu BLE. De nou hi ha dos tipus d'UUID. Un és el UUID del servei i l’altre és UUID característic.
Servei GATT: GATT significa Generic Attribute Profile; això defineix algunes formes estàndard mitjançant les quals dos dispositius BLE sempre s'han de comunicar. Aquest protocol d'atribut (ATT) està predefinit i és comú per a tots els dispositius BLE, de manera que dos dispositius BLE poden identificar-se mútuament. Així doncs, GATT va ser la resposta a la nostra pregunta anterior.
La tècnica amb què dos dispositius BLE han d'enviar dades cap a endavant es defineix pel concepte anomenat serveis i característiques.
Servei BLE / característica BLE: el UUID del servei ens indica quin tipus de servei farà el dispositiu BLE i el UUID característic indica quins són els paràmetres o les funcions que realitzarà aquest servei. Per tant, cada servei tindrà una o més característiques. Bé! D’on treu el programador aquest UUID? Tots els UUID ja estan definits pel GATT (perfil genèric d’atribut). Podeu visitar el seu lloc web i seleccionar-ne l’UUID segons el projecte. Sé que ha rebotat una mica per sobre del nostre cap; intentem entendre-ho amb un exemple.
Suposem el dispositiu BLE d’un reproductor d’àudio. Inicialment, quan el parleu amb el telèfon, el telèfon l’identifica com a dispositiu d’àudio i també mostra el nivell de bateria a la barra d’estat. Per tant, perquè això passi, el reproductor d’àudio ha d’indicar d’alguna manera al telèfon que està disposat a compartir el nivell de bateria i el percentatge de càrrega que té. Això es fa utilitzant l’UUID, hi ha un UUID específic que indica que els daus BLE proporcionaran detalls sobre el nivell de la bateria, aquest UUID que diu que el tipus de servei s’anomena UUID de servei, de nou hi podria haver tants paràmetres que hagin de es canviarà per completar un servei com si el valor de la bateria estigui en aquest paràmetre, cada paràmetre tindrà el seu propi UUID i s’anomenarà UUID característic.La funció comuna que realitza una característica és llegir, escriure, notificar i indicar.
Descriptor BLE: el descriptor és un atribut opcional que es troba dins de la característica. Un descriptor normalment especifica com accedir a una característica.
BLE Beacon: un Bluetooth Beacon s’assembla més a un commutador de proximitat que realitza alguna acció predefinida quan l’usuari entra en un abast (proximitat). Anuncia la seva identitat tot el temps i, per tant, està a punt per emparellar-se sempre.
BLE2902: Encara sóc escèptic sobre aquest tema, però el podeu pensar com un programari del client que informa el servidor que activa o desactiva la notificació, cosa que ens ajudarà a estalviar energia
Espero que tingueu una idea aproximada, el bo és que no necessitem saber molt, ja que totes les feines manuals ja les hem fet a les biblioteques.
Preparació del maquinari
El projecte no requereix cap configuració de maquinari, però assegureu-vos que heu afegit els detalls de la placa ESP32 al vostre IDE Arduino i que heu provat un programa mínim de parpelleig de mostra per comprovar si tot funciona com s’esperava. Si sou escèptic sobre com fer-ho, podeu seguir el tutorial Introducció a ESP32 amb Arduino per fer el mateix.
També per provar els serveis BLE, farem servir l’aplicació nRF per a Android del nostre mòbil, que es pot descarregar directament des de PlayStore. També està disponible a la botiga Itunes per a usuaris d’iPhone. Si teniu previst treballar durant molt de temps amb BLE, aquesta aplicació us serà molt útil per a la depuració.

Programació ESP32 per a la indicació del nivell de bateria mitjançant el servei GATT
En aquest moment suposo que teniu una bona idea de quin servei GATT i de com s’implementa utilitzant els serveis i els models característics. Ara, aprofundim en el programa per conèixer com s’implementa a ESP32 mitjançant l’IDE Arduino. Abans de continuar, m'agradaria fer servir aquest espai per agrair a Andreas Spiess el seu vídeo BLE que va deixar les coses molt clares al meu costat.
Comencem el programa important les biblioteques necessàries al nostre esbós. Hi ha moltes coses a configurar per tal d’utilitzar la funcionalitat BLE de l’ESP32 amb sort, tot i que gràcies a Neil Kolban que ja ha fet el nostre treball dur i ha proporcionat les biblioteques. Si voleu entendre la funcionalitat de les biblioteques, podeu consultar la seva documentació a la pàgina de github.
#incloure
A continuació, hem de definir la funció de trucada de servidor del nostre dispositiu Bluetooth. Abans això permet entendre que és la funció de devolució de trucada a BLE.
Què és la funció de devolució de trucada a BLE?
Quan BLE funciona com a servidor, és important definir una funció de devolució de trucada del servidor. Hi ha molts tipus de devolucions de trucada associades a BLE, però per simplificar-les, les considereu com un reconeixement que s'està realitzant per assegurar-vos que l'acció s'ha completat. S'utilitza una devolució de trucada del servidor per assegurar-se que la connexió entre client i servidor s'estableix correctament.
Utilitzem les línies de codi següents per realitzar una devolució de trucada del servidor.
bool _BLEClientConnected = fals; classe MyServerCallbacks : BLEServerCallbacks públics { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Dins de la funció de configuració del buit , iniciem la comunicació sèrie al 115200 per a la depuració i, a continuació, inicialitzem el dispositiu Bluetooth mitjançant la funció InitBLE .
configuració nul·la () { Serial.begin (115200); Serial.println ("Indicador de nivell de bateria - BLE"); InitBLE (); }
L’ iniciativa és el lloc on succeeix tota la màgia. Hem de crear un servidor Bluetooth i utilitzar el servei de nivell de bateria aquí. Abans, però, hem de definir l’UUID per al servei, la característica i el descriptor per llegir el nivell de la bateria. Tots els UUID es poden obtenir al lloc web del servei Bluetooth GATT. Per al nostre cas, intentem utilitzar el servei de bateria i l’UUID es defineix com a 0X180F com es mostra a continuació.

A continuació, hem de conèixer la característica associada a aquest servei. Per saber-ho, només cal que feu clic a Servei de bateria i se us dirigirà a la pàgina Característiques del servei, on s'esmenta que el nivell de bateria és el nom de les característiques i que inclou el valor de 0 a 100. Tingueu en compte també que només podem realitzar dos accions amb aquesta característica, una és llegir el que és obligatori fer i l’altra és Notificar que és opcional. Per tant, hem d’enviar el valor de la bateria al client (Telèfon), que és obligatori i, si cal, podem notificar al telèfon quina opció té.

Però espereu, encara no hem trobat el valor UUID per al nivell de bateria característic. Per fer-ho, accediu a la pàgina Característiques de la bateria i cerqueu el nom del nivell de bateria, trobareu el seu UUID com a 0X2A19, la imatge que es mostra a continuació.

Ara que tenim tots els valors, posem-lo en el programa tal com es mostra a continuació. El nom BatterySerivce , BatteryLevelCharacteristic i BatteryLevelDescriptor són variables definides per l'usuari per referir-se al servei, característica i descriptor que estem utilitzant al programa. El valor per al descriptor 0X2901 s’utilitza quan la mida del valor és de 8 bits; es pot trobar més informació a la pàgina Descripció del descriptor.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Tornant a la funció initBLE . Primer hem d’iniciar el servidor BLE i fer-lo anunciar amb un nom. Les línies següents s’utilitzen per iniciar el BLE com a servidor. El nom que he posat al meu servidor BLe és "BLE Battery", però podeu triar la vostra.
BLEDevice:: init ("BLE Bateria"); // Creeu el servidor BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (new MyServerCallbacks ());
A continuació, hem d' iniciar el servei GATT, ja que ja hem definit l'UUID, simplement podem iniciar el servei mitjançant la línia següent.
// Creeu el servei BLE BLEService * pBattery = pServer-> createService (BatteryService);
Un cop iniciat el servei, podem enllaçar el descriptor amb les característiques i establir els valors. El servei BLE2902 també s'afegeix aquí com es mostra a continuació.
pBateria-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Percentatge de 0 a 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (nou BLE2902 ());
Finalment, tot està configurat, ara només queda demanar a l’ESP32 que faci publicitat perquè altres dispositius com el nostre telèfon puguin descobrir-lo i connectar-s’hi, i quan estigui connectat a un client hauria d’iniciar el servei de bateria que es pot fer a seguint línies.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBateria-> start (); // Inicieu la publicitat de pServer-> getAdvertising () -> start ();
És a dir, fins ara bé, l' últim pas és dir al descriptor quin és el valor de la bateria en percentatge que s'hauria d'enviar al client (Telèfon). Aquest valor pot variar de 0 a 100, tal com hem llegit anteriorment, per simplificar les coses, he codificat de manera senzilla el valor de la bateria a 57 i després l'incrementar cada 5 segons i començar a partir de 0 un cop arribi a 100. El codi a fer que es mostra a continuació. Tingueu en compte que el valor que s’envia té el format unit8_t.
uint8_t nivell = 57; bucle buit () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); retard (5000); nivell ++; Serial.println (int (nivell)); if (int (nivell) == 100) nivell = 0; }
Prova del vostre servei GATT a ESP32 BLE
El codi complet explicat anteriorment es dóna al final de la pàgina. Pengeu el codi a la vostra placa ESP32. Un cop carregat, el telèfon hauria de descobrir un dispositiu Bluetooth anomenat "BLE Battery".

A continuació, instal·leu l'aplicació nRF per a Android, obriu-la i connecteu-vos al dispositiu BLE Battery BLE. Amplieu la secció Servei de bateria i trobareu la pantalla següent.

Com podeu veure, l'aplicació ha identificat automàticament que el BLE proporciona servei de bateria i que té les característiques del nivell de bateria a causa de l'UID que hem utilitzat al programa. També podeu veure el valor actual de la bateria que és del 67% d’espera durant 5 segons i també podeu notar que augmenta.
El més interessant d’utilitzar BLE és que ara qualsevol aplicació que funcioni amb BLE pensarà que el vostre ESP32 és un dispositiu BLE que notifica el nivell de bateria. Per provar-ho, he utilitzat una aplicació anomenada BatON i l’aplicació ha identificat l’ESP32 com a dispositiu Bluetooth alimentat per bateria i he donat la notificació percentual al meu telèfon així

Guai!! Dret? També he mostrat el treball complet al vídeo següent. Ara, ja que heu après a utilitzar els serveis de la bateria BLE amb ESP32, podeu provar altres serveis GATT que són molt interessants, com ara la freqüència de pols, HID, la freqüència cardíaca, etc. Diverteix-te…
