- Terminologie relative a BLE (Bluetooth Low Energy)
- Preparazione dell'hardware
- Programmazione di ESP32 per l'indicazione del livello della batteria utilizzando il servizio GATT
- Testare il servizio GATT su ESP32 BLE
Cuffie wireless, cinturini per il fitness, altoparlanti Bluetooth, cuffie in-ear, telefoni cellulari, laptop… ci sono così tanti dispositivi Bluetooth intorno a noi e la maggior parte di questi dispositivi funziona a batteria. Ti sei mai chiesto che, quando colleghi un dispositivo Bluetooth al tuo telefono cellulare, come capisca automaticamente che il dispositivo connesso è un computer, un dispositivo audio o un telefono cellulare? Per alcuni dispositivi il nostro telefono potrebbe persino mostrare automaticamente la percentuale di batteria del dispositivo connesso sulla barra delle notifiche. Come avviene tutto questo da soli? Dovrebbe esserci un protocollo comune condiviso tra il telefono e il dispositivo Bluetooth, giusto!
Rimani curioso, otterrai risposte a queste domande mentre cerchiamo di capire Bluetooth Low Energy (BLE in breve), con il popolare modulo ESP32. A differenza del Bluetooth classico in ESP32, il BLE funziona solo quando viene attivata una comunicazione e rimane in modalità di sospensione altrimenti, questo lo rende la scelta giusta per le applicazioni alimentate a batteria. BLE può anche formare reti mesh e agire come Beacon. Normalmente un modulo BLE funziona sia come server che come client, qui useremo ESP32 BLE come server.
Qui abbiamo diviso il Bluetooth ESP32 completo in tre segmenti per facilità di comprensione.
1. Bluetooth seriale su ESP32 commutando LED dal telefono cellulare
2 . Server BLE per inviare i dati sul livello della batteria al telefono cellulare utilizzando il servizio GATT
3. Client BLE per eseguire la scansione dei dispositivi BLE e agire come beacon.
Abbiamo già trattato il primo articolo; in questo articolo impareremo come far funzionare ESP32 BLE come server e utilizzare il servizio GATT per inviare informazioni sul livello della batteria. A scopo di test, invieremo valori hardcoded da ESP32 come percentuale della batteria al nostro telefono cellulare tramite il servizio BLE GATT, in questo modo il nostro cellulare presumerà che ESP32 sia un dispositivo Bluetooth a batteria che sta tentando di inviare alla sua percentuale di batteria. Prima di entrare nei dettagli, sottrairemo alcune terminologie relative a Bluetooth Low Energy.
Terminologie relative a BLE (Bluetooth Low Energy)
Server BLE: come detto in precedenza, il BLE può essere programmato per funzionare sia come server che come client. Quando si lavora come server, BLE può fornire solo dati ma non può avviare una connessione. L'esempio potrebbe essere una band di fitness. Un server può inviare informazioni solo se il client lo richiede.
Più comunemente il BLE di ESP32 viene utilizzato come server. Ogni Server avrà uno o più Servizi al suo interno e analogamente ogni Servizio avrà una o più caratteristiche ad esso associate. Una Caratteristica può contenere zero, uno o più Descrittori al suo interno. Ogni servizio, caratteristica o descrittore avrà il proprio ID univoco predefinito chiamato UUID.
Client BLE: il client può eseguire la scansione della connessione e ascoltare altri dispositivi Bluetooth. Un esempio potrebbe essere il tuo telefono cellulare. Si noti che la maggior parte dei dispositivi hardware BLE può funzionare come server e come client, è il software che decide il ruolo del dispositivo.
Dispositivo periferico / dispositivo centrale: in una rete BLE potrebbe esserci un solo dispositivo centrale, ma può avere tutti i dispositivi periferici necessari. Il dispositivo centrale può connettersi a tutti i dispositivi periferici contemporaneamente, ma il dispositivo periferico può connettersi solo al dispositivo centrale, in questo modo nessun dispositivo periferico può condividere dati tra loro. Un miglior esempio per il dispositivo centrale saranno i nostri smartphone e per il dispositivo periferico saranno i nostri auricolari Bluetooth o cinturini per il fitness.
Pubblicità BLE: una pubblicità BLE è il termine geniale per indicare al dispositivo Bluetooth di essere visibile a tutti in modo che possa accoppiarsi e stabilire una connessione.Può essere considerato come una comunicazione unidirezionale. Qui il server continua a fare pubblicità ai dati aspettandosi che un server li riceva. BLE Beacon è un tipo di BLE.
UUID (Universal Unique Identifier): a ogni dispositivo Bluetooth BLE viene assegnato un numero di identificazione univoco universale quando programmato dal programmatore. Puoi pensare a questo identificatore come a una sequenza di numeri che rappresenta la funzionalità / ruolo del dispositivo BLE. Anche in questo caso ci sono due tipi di UUID. Uno è l' UUID del servizio e l'altro è l' UUID caratteristico.
Servizio GATT: GATT sta per Generic Attribute Profile; questo definisce alcuni modi standard di utilizzare i quali due dispositivi BLE devono sempre comunicare. Questo protocollo di attributi (ATT) è predefinito ed è comune a tutti i dispositivi BLE, quindi in questo modo due dispositivi BLE possono identificarsi a vicenda. Quindi il GATT era la risposta alla nostra domanda precedente.
La tecnica con cui due dispositivi BLE devono inviare i dati avanti e indietro è definita dal concetto chiamato servizi e caratteristiche.
Caratteristica BLE Service / BLE: l'UUID del servizio ci dice quale tipo di servizio il dispositivo BLE eseguirà e l'UUID caratteristico indica quali sono i parametri o le funzioni che verranno eseguite da quel servizio. Quindi ogni Servizio avrà una o più caratteristiche sotto di loro. Va bene! Da dove il programmatore ottiene questo UUID? Ogni UUID è già definito dal GATT (Generic Attribute Profile) è possibile visitare il loro sito web e selezionare l'UUID come richiesto per il progetto. So che è rimbalzato un po 'sopra la nostra testa; proviamo a capirlo con un esempio.
Supponiamo che il dispositivo BLE di un lettore audio. Inizialmente quando lo si associa al telefono, il telefono lo identifica come dispositivo audio e visualizza anche il livello della batteria sulla barra di stato. Quindi, affinché ciò avvenga, il lettore audio deve in qualche modo dire al tuo telefono che è disposto a condividere il livello della batteria e la percentuale di carica che ha nella batteria. Questo viene fatto utilizzando l'UUID, c'è un UUID specifico che dice che i dadi BLE forniranno dettagli sul livello della batteria questo UUID che dice che il tipo di servizio è chiamato Service UUID, anche in questo caso potrebbero esserci così tanti parametri che devono essere scambiato per il completamento di un servizio come il valore della batteria è su tale parametro, ogni parametro avrà il proprio UUID e questi sono chiamati Characteristic UUID.La funzione comune svolta da una caratteristica è Lettura, Scrittura, Notifica e Indica.
Descrittore BLE: il descrittore è un attributo opzionale presente all'interno della caratteristica. Un descrittore normalmente specifica come accedere a una caratteristica.
Beacon BLE: un beacon Bluetooth è più simile a un interruttore di prossimità che esegue un'azione predefinita quando l'utente si trova in un raggio di azione (prossimità). Pubblicizza la sua identità tutto il tempo e quindi è sempre pronto per l'accoppiamento.
BLE2902: Sono ancora scettico su questa cosa, ma puoi pensarlo come un pezzo di software sul lato client che informa il server di attivare o disattivare la notifica questo ci aiuterà a risparmiare energia
Spero che tu abbia un'idea approssimativa, il bello è che non abbiamo bisogno di sapere molto poiché tutto il lavoro manuale è già fatto per noi attraverso le biblioteche.
Preparazione dell'hardware
Il progetto non richiede alcuna configurazione hardware, ma assicurati di aver aggiunto i dettagli della scheda ESP32 sul tuo IDE Arduino e di aver provato un programma di lampeggiamento di esempio minimo per verificare se tutto funziona come previsto. Se sei scettico su come farlo, puoi seguire il tutorial Introduzione a ESP32 con Arduino per fare lo stesso.
Anche per testare i servizi BLE utilizzeremo l'applicazione Android nRF sul nostro cellulare che può essere scaricata direttamente dal PlayStore. È disponibile anche in Itunes Store per gli utenti Iphone. Se hai intenzione di lavorare con BLE per molto tempo, questa applicazione ti tornerà davvero utile per scopi di debug.
Programmazione di ESP32 per l'indicazione del livello della batteria utilizzando il servizio GATT
A questo punto presumo che tu abbia una buona idea su quale servizio GATT e come viene implementato utilizzando i modelli di servizio e caratteristici. Ora, immergiamoci nel programma per scoprire come viene implementato in ESP32 utilizzando l'IDE di Arduino. Prima di continuare vorrei usare questo spazio per ringraziare Andreas Spiess per il suo video BLE che ha reso le cose molto chiare dalla mia parte.
Iniziamo il programma importando le librerie richieste nel nostro sketch. Ci sono molte cose da configurare per utilizzare la funzionalità BLE di ESP32, si spera, grazie a Neil Kolban che ha già fatto il duro lavoro per noi e ha fornito le librerie. Se vuoi capire le funzionalità delle librerie puoi fare riferimento alla sua documentazione sulla pagina github.
#includere
Successivamente dobbiamo definire la funzione di richiamata del server per il nostro dispositivo Bluetooth. Prima di ciò, capiamo che cos'è la funzione di callback in BLE.
Cos'è la funzione di callback in BLE?
Quando BLE funziona come server, è importante definire una funzione di callback del server. Esistono molti tipi di callback associati a BLE, ma per semplificare, li consideri come un riconoscimento eseguito per assicurarti che l'azione sia stata completata. Viene utilizzata una richiamata del server per garantire che la connessione tra client e server venga stabilita correttamente.
Usiamo le seguenti righe di codice per eseguire una richiamata del server.
bool _BLEClientConnected = false; class MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
All'interno della funzione di configurazione void , iniziamo la comunicazione seriale su 115200 per il debug e quindi inizializziamo il dispositivo Bluetooth tramite la funzione InitBLE .
void setup () { Serial.begin (115200); Serial.println ("Indicatore livello batteria - BLE"); InitBLE (); }
L'initBLE è il luogo dove tutta la magia accade. Dobbiamo creare un server Bluetooth e utilizzare il servizio Livello batteria qui. Ma prima dobbiamo definire l'UUID per Service, Characteristic e Descriptor per leggere il livello della batteria. Tutto l'UUID può essere ottenuto dal sito Web del servizio Bluetooth GATT. Nel nostro caso stiamo cercando di utilizzare il servizio Batteria e l'UUID è definito come 0X180F come mostrato di seguito.
Successivamente, dobbiamo conoscere la caratteristica associata a questo servizio. Per sapere che è sufficiente fare clic su Servizio batteria e verrai indirizzato alla pagina Caratteristiche del servizio, dove è menzionato che Livello batteria è il nome delle caratteristiche e assume il valore da 0 a 100. Si noti inoltre che possiamo eseguirne solo due azioni con questa caratteristica, una è Leggere che è obbligatorio fare e l'altra è Notifica che è Opzionale. Quindi dobbiamo inviare il valore della batteria al client (Telefono) che è obbligatorio e se necessario possiamo notificare al telefono quale è opzionale.
Ma aspetta, non abbiamo ancora trovato il valore UUID per il livello della batteria caratteristica. Per farlo entrare nella pagina delle caratteristiche della batteria e cercare il nome del livello della batteria, troverai il suo UUID come 0X2A19, l'istantanea dello stesso è mostrata di seguito.
Ora che abbiamo tutti i valori, inseriamolo nel programma come mostrato di seguito. Il nome BatterySerivce , BatteryLevelCharacteristic e BatteryLevelDescriptor sono variabili definite dall'utente per fare riferimento al servizio, alla caratteristica e al descrittore che stiamo utilizzando nel programma. Il valore per il descrittore 0X2901 viene utilizzato quando la dimensione del valore è 8 bit, ulteriori informazioni possono essere trovate nella pagina Descrizione descrittore.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Tornando alla funzione initBLE . Per prima cosa dobbiamo avviare il server BLE e farlo pubblicizzare con un nome. Le seguenti righe vengono utilizzate per avviare BLE come server. Il nome che ho dato al mio server BLe è "BLE Battery", ma puoi scegliere il tuo.
BLEDevice:: init ("BLE Battery"); // Crea il server BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (new MyServerCallbacks ());
Successivamente dobbiamo avviare il servizio GATT poiché abbiamo già definito l'UUID possiamo semplicemente avviare il servizio utilizzando la riga sottostante.
// Crea il servizio BLE BLEService * pBattery = pServer-> createService (BatteryService);
Una volta avviato il servizio, possiamo collegare il descrittore con le caratteristiche e impostare i valori. Anche il servizio BLE2902 viene aggiunto qui come mostrato di seguito.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Percentuale 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (new BLE2902 ());
Finalmente tutto è pronto, ora non resta che chiedere all'ESP32 di fare pubblicità in modo che altri dispositivi come il nostro telefono possano scoprirlo e connettersi ad esso, e quando connesso a un client dovrebbe avviare il servizio Batteria che può essere fatto tramite il seguenti righe.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Inizia a pubblicizzare pServer-> getAdvertising () -> start ();
Fin qui tutto bene, l' ultimo passo è dire al descrittore qual è il valore della batteria in percentuale che dovrebbe essere inviato al client (Telefono). Questo valore può essere compreso tra 0 e 100 come abbiamo letto in precedenza, per mantenere le cose semplici, ho semplicemente codificato il valore della batteria in modo che sia 57 e quindi lo incremento ogni 5 secondi e inizi da 0 una volta raggiunto 100. Il codice da fare quello è mostrato sotto. Notare che il valore inviato è nel formato unit8_t.
uint8_t level = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); ritardo (5000); livello ++; Serial.println (int (livello)); if (int (livello) == 100) livello = 0; }
Testare il servizio GATT su ESP32 BLE
Il codice completo spiegato sopra è riportato alla fine della pagina. Carica il codice sulla tua scheda ESP32. Una volta caricato, il tuo telefono dovrebbe rilevare un dispositivo Bluetooth chiamato "BLE Battery" Accoppiarlo.
Quindi installa l'applicazione Android nRF e aprila e connettiti al dispositivo BLE Battery BLE. Espandi la sezione Servizio batteria e dovresti trovare la seguente schermata.
Come puoi vedere l'Applicazione ha automaticamente identificato che il BLE fornisce il Servizio Batteria e ha le caratteristiche di Livello Batteria a causa dell'UUID che abbiamo utilizzato nel programma. Puoi anche vedere che il valore attuale della batteria che è del 67% aspetta 5 secondi e puoi anche notare che viene incrementato.
La cosa interessante dell'utilizzo di BLE è che ora qualsiasi applicazione che funziona con BLE penserà che il tuo ESP32 è un dispositivo BLE che notifica il livello della batteria. Per provarlo ho usato un'applicazione chiamata BatON e l'applicazione ha identificato l'ESP32 come dispositivo Bluetooth alimentato a batteria e ha dato la notifica percentuale sul mio telefono in questo modo
Freddo!! Destra? Ho anche mostrato il funzionamento completo nel video qui sotto. Ora che hai imparato a usare i servizi BLE Battery con ESP32, puoi provare anche altri servizi GATT che sono molto interessanti come Pulse rate, HID, Heart Rate ecc.. Buon divertimento….