- Terminologier relateret til BLE (Bluetooth Low Energy)
- Forberedelse af hardware
- Programmering ESP32 til batteriniveauindikation ved hjælp af GATT-tjenesten
- Test af din GATT-tjeneste på ESP32 BLE
Trådløse hovedtelefoner, Fitnessbånd, Bluetooth-højttalere, In-Ear-hovedtelefoner, Mobiltelefoner, Laptops… der er så mange Bluetooth-enheder omkring os, og de fleste af disse enheder er batteridrevne. Har du nogensinde spekuleret på, at når du forbinder en Bluetooth-enhed til din mobiltelefon, hvordan den automatisk forstår, at den tilsluttede enhed er en computer eller lydenhed eller en mobiltelefon? For nogle enheder viser vores telefon muligvis automatisk batteriprocentdelen af den tilsluttede enhed på meddelelseslinjen. Hvordan sker alt dette alene? Der skal være en fælles protokol, der deles mellem telefonen og Bluetooth-enheden til højre!
Bliv nysgerrig, du får svar på disse spørgsmål, når vi prøver at forstå Bluetooth Low Energy (BLE for kort) med det populære ESP32-modul. I modsætning til klassisk Bluetooth i ESP32 fungerer BLE kun, når en kommunikation er aktiveret og forbliver i dvaletilstand ellers gør dette det til det rigtige valg til batteridrevne applikationer. BLE kan også danne mesh-netværk og fungere som Beacons. Normalt fungerer et BLE-modul enten som en server eller som en klient, her bruger vi ESP32 BLE som server.
Her har vi opdelt den komplette ESP32 Bluetooth i tre segmenter for at gøre det lettere at forstå.
1. Seriel Bluetooth på ESP32, der skifter LED fra mobiltelefon
2 . BLE-server til at sende data på batteriniveau til mobiltelefon ved hjælp af GATT Service
3. BLE-klient til at scanne efter BLE-enheder og fungere som et fyrtårn.
Vi har allerede dækket den første artikel; i denne artikel lærer vi, hvordan man får ESP32 BLE til at fungere som server og bruger GATT-tjenesten til at sende oplysninger om batteriniveau. Til testformål sender vi hardkodede værdier fra ESP32 som batteriprocent til vores mobiltelefon via BLE GATT-tjenesten. På denne måde antager vores mobil, at ESP32 er en batteridrevet Bluetooth-enhed, der prøver at sende til sin batteriprocent. Før vi går i detaljer, vil vi understadere få terminologier relateret til Bluetooth Low Energy.
Terminologier relateret til BLE (Bluetooth Low Energy)
BLE Server: Som tidligere sagt kan BLE programmeres til at fungere enten som en server eller som en klient. Når du arbejder som server, kan BLE kun levere data, den kan ikke starte en forbindelse. Eksempel ville være et fitnessband. En server kunne kun sende oplysninger, hvis klienten anmoder om det.
Oftest bruges ESP32's BLE en server. Hver server vil have en eller flere tjenester i den, og på samme måde vil hver tjeneste have en eller flere egenskaber forbundet med den. En karakteristik kan have nul, en eller flere end en deskriptor inde i den. Hver tjeneste, karakteristik eller deskriptor vil have sit eget foruddefinerede unikke ID kaldet UUID.
BLE-klient: Klienten kan scanne forbindelse og lytte til andre Bluetooth-enheder. Et eksempel er din mobiltelefon. Bemærk, at de fleste BLE-hardwareenheder kan fungere som server og som klient, det er softwaren, der bestemmer enhedens rolle.
Perifer enhed / central enhed: I et BLE-netværk kunne der kun være én central enhed, men kan have så mange perifere enheder som nødvendigt. Den centrale enhed kan oprette forbindelse til alle perifere enheder på samme tid, men den perifere enhed kan kun oprette forbindelse til den centrale enhed, på denne måde kan ikke to perifere enheder dele data mellem hinanden. Et bedste eksempel på en central enhed vil være vores smarte telefoner og til perifere enheder vil være vores Bluetooth-øretelefon eller fitnessbånd.
BLE Advertising: A BLE Advertising er det nørdelige udtryk for at instruere Bluetooth-enheden om at være synlig for alle, så den kan parre og etablere en forbindelse. Det kan betragtes som en envejskommunikation. Her fortsætter serveren med at reklamere for data og forventer, at en server modtager dem. BLE Beacon er en type BLE.
UUID (Universal Unique Identifier): Hver BLE Bluetooth-enhed tildeles et Universal Unique Identifier Number, når den er programmeret af programmøren. Du kan tænke på denne identifikator som en række af tal, der repræsenterer BLE-enhedens funktionalitet / rolle. Igen er der to typer UUID. Den ene er Service UUID og den anden er Karakteristisk UUID.
GATT Service: GATT står for Generic Attribute Profile; dette definerer nogle standard måder, hvorpå to BLE-enheder altid skal kommunikere. Denne attributprotokol (ATT) er foruddefineret og er almindelig for alle BLE-enheder, så på denne måde kan to BLE-enheder identificere hinanden. Så GATT var svaret på vores tidligere spørgsmål.
Teknikken, hvormed to BLE-enheder skal sende data frem og tilbage, er defineret af konceptet kaldet tjenester og egenskaber.
BLE Service / BLE-karakteristik: Service UUID fortæller os, hvilken type service BLE-enheden skal udføre, og den karakteristiske UUID fortæller, hvilke parametre eller funktioner der udføres af denne service. Så hver tjeneste vil have en eller flere egenskaber under sig. Okay! Hvor får programmøren denne UUID fra? Hver UUID er allerede defineret af GATT (Generic Attribute Profile), du kan besøge deres websted og vælge UUID efter behov til projektet. Jeg ved, at det er sprunget lidt over vores hoved; lad os prøve at forstå det med et eksempel.
Lad os antage BLE-enheden i en lydafspiller. Først når du parrer det med din telefon, identificerer din telefon det som en lydenhed og viser også batteriniveauet på statuslinjen. Så for at dette kan ske, skal lydafspilleren på en eller anden måde fortælle din telefon, at den er villig til at dele batteriniveauet og den procentdel af opladning, det har i batteriet. Dette gøres ved hjælp af UUID, der er en specifik UUID, der fortæller, at BLE-terningen vil give detaljer om batteriniveau, denne UUID, der fortæller, hvilken type service der kaldes Service UUID, igen kunne der være så mange parametre, der skal udveksles for at udføre en tjeneste som batteriets værdi er på en sådan parameter, vil hver parameter have sin egen UUID, og disse kaldes den karakteristiske UUID.Den fælles funktion, der udføres af en egenskab, er Læs, Skriv, Meddel og indikér.
BLE Descriptor: Descriptoren er en valgfri attribut, der findes i karakteristikken. En deskriptor angiver normalt, hvordan man får adgang til en karakteristik.
BLE Beacon: En Bluetooth Beacon er mere som en nærhedsafbryder, der udfører en foruddefineret handling, når brugeren kommer ind i en rækkevidde (tæt nærhed). Det annoncerer sin identitet hele tiden og er derfor klar til at parre sig altid.
BLE2902: Jeg er stadig skeptisk over for denne ting, men du kan tænke på det som et stykke software på klientsiden, der informerer serveren om at tænde eller slukke for underretning, dette hjælper os med at spare strøm
Håber du har en grov idé, det gode er, at vi ikke behøver at vide meget, da alt håndarbejdet allerede er gjort for os gennem bibliotekerne.
Forberedelse af hardware
Projektet kræver ingen hardwareopsætning, men sørg for at du har tilføjet ESP32-kortoplysninger på din Arduino IDE og har prøvet et minimumseksempel på blinkprogram for at kontrollere, om alt fungerer som forventet. Du er skeptisk til, hvordan du gør det, du kan følge Vejledningen Kom godt i gang med ESP32 med Arduino for at gøre det samme.
Også for at teste BLE-tjenesterne bruger vi nRF android-applikationen på vores mobil, som kan downloades direkte fra PlayStore. Den er også tilgængelig i Itunes Store til Iphone-brugere. Hvis du planlægger at arbejde med BLE i lang tid, vil denne applikation virkelig være praktisk til fejlfindingsformål.
Programmering ESP32 til batteriniveauindikation ved hjælp af GATT-tjenesten
På dette tidspunkt antager jeg, at du har en god idé om, hvilken GATT-tjeneste og hvordan den implementeres ved hjælp af Service- og karakteristiske modeller. Lad os nu dykke ned i programmet for at lære, hvordan det implementeres i ESP32 ved hjælp af Arduino IDE. Inden vi fortsætter, vil jeg gerne bruge dette rum til at takke Andreas Spiess for hans video BLE, der gjorde tingene meget klare på min side.
Vi starter programmet med at importere de krævede biblioteker til vores skitse. Der er mange ting at konfigurere for at bruge ESP32's BLE-funktionalitet forhåbentlig dog takket være Neil Kolban, der allerede har gjort det hårde arbejde for os og har leveret bibliotekerne. Hvis du vil forstå bibliotekernes funktionalitet, kan du henvise til hans dokumentation på github-siden.
#omfatte
Derefter skal vi definere serverens tilbagekaldsfunktion til vores Bluetooth-enhed. Før det kan vi forstå, at hvad der er tilbagekaldsfunktion i BLE.
Hvad er tilbagekaldsfunktion i BLE?
Når BLE fungerer som server, er det vigtigt at definere en tilbagekaldelsesfunktion til serveren. Der er mange typer tilbagekaldelser forbundet med BLE, men for at sige det enkelt betragter du disse som en bekræftelse, der udføres for at sikre, at handlingen er afsluttet. En server callback bruges til at sikre, at forbindelsen mellem klient og server oprettes med succes.
Vi bruger følgende kodelinjer til at udføre en tilbagekaldelse på serveren.
bool _BLEClientConnected = false; klasse MyServerCallbacks : offentlige BLEServerCallbacks { ugyldig onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; ugyldig onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Inde i funktionen til ugyldig opsætning initierer vi seriel kommunikation ved 115200 til fejlfinding og initialiserer derefter Bluetooth-enheden via InitBLE- funktionen.
ugyldig opsætning () { Serial.begin (115200); Serial.println ("Batteriniveauindikator - BLE"); InitBLE (); }
Den initBLE er det sted, hvor magien. Vi er nødt til at oprette en Bluetooth-server og bruge tjenesten Batteriniveau herinde. Men før det er vi nødt til at definere UUID til service, karakteristik og deskriptor til aflæsning af batteriniveauet. Alt UUID kan fås fra Bluetooth GATT-tjenestewebstedet. For vores sag forsøger vi at bruge batteritjenesten, og UUID til den er defineret som 0X180F som vist nedenfor.
Dernæst skal vi kende karakteristikken forbundet med denne service. For at vide, skal du blot klikke på batteriservice, så bliver du ført til siden Servicekarakteristik, hvor det nævnes, at batteriniveau er navnet på karakteristika, og det tager værdien fra 0 til 100. Bemærk også, at vi kun kan udføre to handlinger med denne egenskab, den ene er at læse, hvilket er obligatorisk at gøre, og den anden er Meddel, hvilket er valgfrit. Så vi er nødt til at sende batteriværdien til klienten (Telefon), som er obligatorisk, og hvis det er nødvendigt, kan vi give telefonen besked om, hvilken der er valgfri.
Men vent, vi fandt stadig ikke UUID-værdien for det karakteristiske batteriniveau. For at gøre det, gå ind på siden Batterikarakteristik og søg efter batteriniveaunavnet, du finder dets UUID som 0X2A19, snapshotet af det samme er vist nedenfor.
Nu hvor vi har alle værdierne, lad os sætte det i programmet som vist nedenfor. Navnet BatterySerivce , BatteryLevelCharacteristic og BatteryLevelDescriptor er brugerdefinerede variabler, der refererer til den Service, Characteristic og Descriptor, som vi bruger i programmet. Værdien for deskriptor 0X2901 bruges, når størrelsen på værdien er 8-bit, mere information kan findes på beskrivelsessiden.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
At komme tilbage til initBLE- funktionen. Vi skal først starte BLE-serveren og få den til at annoncere med et navn. De følgende linjer bruges til at starte BLE som serveren. Navnet, som jeg har givet til min BLe-server, er "BLE Battery", men du kan vælge dit eget.
BLEDevice:: init ("BLE Battery"); // Opret BLE-server BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nye MyServerCallbacks ());
Dernæst skal vi starte GATT-tjenesten, da vi allerede har defineret UUID, kan vi simpelthen starte tjenesten ved hjælp af linjen nedenfor.
// Opret BLE Service BLEService * pBattery = pServer-> createService (BatteryService);
Når tjenesten er startet, kan vi forbinde deskriptoren med egenskaber og indstille værdierne. BLE2902-tjenesten tilføjes også her som vist nedenfor.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Procentdel 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (ny BLE2902 ());
Endelig er alt klar, alt hvad der er tilbage er at bede ESP32 om at annoncere, så andre enheder som vores telefon kan opdage det og oprette forbindelse til det, og når de er tilsluttet en klient, skal det starte batteritjenesten, som kan udføres selvom følgende linjer.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Start annoncering pServer-> getAdvertising () -> start ();
Det er det indtil videre så godt, det sidste trin er at fortælle deskriptoren, hvad der er værdien af batteriet i procent, der skal sendes til klienten (Telefon). Denne værdi kan være fra 0-100, som vi læste tidligere, for at holde tingene enkle har jeg simpelt hårdt kodet værdien af batteriet til at være 57 og derefter øge det hvert 5. sekund og starte fra 0, når det når 100. Koden, der skal gøres der er vist nedenfor. Bemærk, at den værdi, der sendes, er i format unit8_t.
uint8_t niveau = 57; ugyldig sløjfe () { BatteryLevelCharacteristic.setValue (& niveau, 1); BatteryLevelCharacteristic.notify (); forsinkelse (5000); niveau ++; Serial.println (int (niveau)); hvis (int (niveau) == 100) niveau = 0; }
Test af din GATT-tjeneste på ESP32 BLE
Den komplette kode, der er forklaret ovenfor, findes i slutningen af siden. Upload koden til dit ESP32-kort. Når telefonen er uploadet, skal den opdage en Bluetooth-enhed, der hedder “BLE Battery”, parres med den.
Installer derefter nRF android-applikationen, og åbn den, og opret forbindelse til BLE Battery BLE-enheden. Udvid sektionen Batteriservice, og du skal finde følgende skærmbillede.
Som du kan se, har applikationen automatisk identificeret, at BLE leverer batteriservice og har karakteristika som batteriniveau på grund af UUID, som vi brugte i programmet. Du kan også se, at den aktuelle batteriværdi, der er 67%, venter i 5 sekunder, og du kan også bemærke, at den bliver steget.
Det seje ved at bruge BLE er, at ethvert program, der fungerer sammen med BLE, nu vil tro, at din ESP32 er BLE-enhed, der giver besked om batteriniveau. For at prøve det brugte jeg et program kaldet BatON, og applikationen identificerede ESP32 som en batteridrevet Bluetooth-enhed og gav den procentvise meddelelse på min telefon sådan
Fedt nok!! Ret? Jeg har også vist det komplette arbejde i videoen nedenfor. Nu, hvor du har lært, hvordan du bruger BLE-batteritjenester med ESP32, kan du også prøve andre GATT-tjenester, som er meget interessante som puls, HID, puls osv. Hav det sjovt….