- Terminologier relatert til BLE (Bluetooth Low Energy)
- Forbereder maskinvaren
- Programmering ESP32 for batterinivåindikasjon ved hjelp av GATT-tjenesten
- Testing av GATT-tjenesten din på ESP32 BLE
Trådløse hodetelefoner, Fitness-bånd, Bluetooth-høyttalere, In-Ear-hodetelefoner, Mobiltelefoner, Bærbare datamaskiner… det er så mange Bluetooth-enheter rundt oss, og de fleste av disse enhetene er batteridrevne. Har du noen gang lurt på at når du kobler en Bluetooth-enhet til mobiltelefonen din, hvordan den automatisk forstår at den tilkoblede enheten er en datamaskin eller lydenhet eller en mobiltelefon? For noen enheter viser telefonen vår kanskje til og med automatisk batteriprosenten til den tilkoblede enheten på varslingslinjen. Hvordan skjer alt dette alene? Det bør være noen felles protokoller som deles mellom telefonen og Bluetooth-enheten til høyre!
Vær nysgjerrig, du vil få svar på disse spørsmålene når vi prøver å forstå Bluetooth Low Energy (BLE for kort), med den populære ESP32-modulen. I motsetning til Classic Bluetooth i ESP32 fungerer BLE bare når en kommunikasjon er aktivert og forblir i hvilemodus, ellers gjør dette det til det riktige valget for batteridrevne applikasjoner. BLE kan også danne nettverk og fungere som Beacons. Normalt fungerer en BLE-modul enten som en server eller som en klient, her vil vi bruke ESP32 BLE som server.
Her har vi delt den komplette ESP32 Bluetooth i tre segmenter for enkel forståelse.
1. Seriell Bluetooth på ESP32 veksle-LED fra mobiltelefon
2 . BLE-server for å sende data på batterinivå til mobiltelefon ved hjelp av GATT-tjenesten
3. BLE-klient for å skanne etter BLE-enheter og fungere som fyrtårn.
Vi har allerede dekket den første artikkelen; i denne artikkelen vil vi lære hvordan du får ESP32 BLE til å fungere som server og bruker GATT-tjenesten til å sende informasjon om batterinivå. For testformål vil vi sende hardkodede verdier fra ESP32 som batteriprosent til mobiltelefonen vår gjennom BLE GATT-tjenesten. På denne måten vil vår mobil anta at ESP32 er en batteridrevet Bluetooth-enhet som prøver å sende til batteriprosenten. Før vi går i detalj vil vi understad få terminologier relatert til Bluetooth Low Energy.
Terminologier relatert til BLE (Bluetooth Low Energy)
BLE Server: Som tidligere fortalt kan BLE programmeres til å fungere enten som server eller som klient. Når du jobber som server, kan BLE bare gi data, den kan ikke starte en tilkobling. Eksempel ville være et treningsband. En server kan bare sende informasjon hvis klienten ber om det.
Vanligvis brukes ESP32s BLE en server. Hver server vil ha en eller flere tjenester i seg, og på samme måte vil hver tjeneste ha en eller flere egenskaper knyttet til den. En karakteristikk kan ha null, en eller flere enn en beskrivelse inne i den. Hver tjeneste, karakteristikk eller beskrivelse vil ha sin egen forhåndsdefinerte unike ID kalt UUID.
BLE-klient: Klienten kan skanne koble til og lytte til andre Bluetooth-enheter. Et eksempel vil være mobiltelefonen din. Legg merke til at de fleste BLE-maskinvareenheter kan fungere som server og som klient, det er programvaren som bestemmer enhetens rolle.
Perifer enhet / sentral enhet: I et BLE-nettverk kan det bare være én sentral enhet, men kan ha så mange eksterne enheter som nødvendig. Den sentrale enheten kan koble til alle eksterne enheter samtidig, men den eksterne enheten kan bare koble til den sentrale enheten, på denne måten kan ikke to eksterne enheter dele data mellom hverandre. Et beste eksempel for sentral enhet vil være våre smarte telefoner og for perifere enheter vil være Bluetooth-øretelefoner eller treningsbånd.
BLE Advertising: A BLE Advertising er det geeky begrepet som instruerer Bluetooth-enheten om å være synlig for alle, slik at den kan pares og opprette en forbindelse. Det kan betraktes som en enveiskommunikasjon. Her fortsetter serveren med å annonsere data og forventer at en server skal motta den. BLE Beacon er en type BLE.
UUID (Universal Unique Identifier): Hver BLE Bluetooth-enhet får et Universal Unique Identifier Number når den er programmert av programmereren. Du kan tenke på denne identifikatoren som en sekvens av tall som representerer funksjonaliteten / rollen til BLE-enheten. Igjen er det to typer UUID. Den ene er Service UUID og den andre er Characteristic UUID.
GATT-tjeneste: GATT står for Generic Attribute Profile; dette definerer noen standard måter å bruke som to BLE-enheter alltid skal kommunisere. Denne attributtprotokollen (ATT) er forhåndsdefinert og er vanlig for alle BLE-enheter, slik at to BLE-enheter kan identifisere hverandre. Så GATT var svaret på vårt forrige spørsmål.
Teknikken der to BLE-enheter skal sende data frem og tilbake defineres av konseptet som kalles tjenester og egenskaper.
BLE Service / BLE-karakteristikk: Service UUID forteller oss hvilken type tjeneste BLE-enheten skal utføre, og Characteristic UUID forteller hva som er parametrene eller funksjonene som vil bli utført av den tjenesten. Så hver tjeneste vil ha en eller flere egenskaper under seg. Greit! Hvor får programmereren denne UUID-en fra? Hver UUID er allerede definert av GATT (Generic Attribute Profile), du kan besøke deres nettside og velge UUID etter behov for prosjektet. Jeg vet at den har spratt litt over hodet på oss; la oss prøve å forstå det med et eksempel.
La oss anta BLE-enheten til en lydavspiller. Først når du parer den med telefonen din, identifiserer telefonen den som en lydenhet og viser også batterinivået på statuslinjen. Så for at dette skal skje, må lydspilleren på en eller annen måte fortelle telefonen din at den er villig til å dele batterinivået og den prosentvise ladningen den har i batteriet. Dette gjøres ved å bruke UUID, det er en spesifikk UUID som forteller at BLE-terningen skal gi detaljer om batterinivå. Denne UUID som forteller hvilken type tjeneste som heter Service UUID, igjen kan det være så mange parametere som må byttes ut for å fullføre en tjeneste som verdien av batteriet er på en slik parameter, vil hver parameter ha sin egen UUID og disse kalles den karakteristiske UUID.Den vanlige funksjonen som utføres av en karakteristikk er lese, skrive, varsle og indikere.
BLE Descriptor: Descriptoren er et valgfritt attributt som er tilstede inne i karakteristikken. En deskriptor spesifiserer normalt hvordan du får tilgang til en karakteristikk.
BLE Beacon: En Bluetooth Beacon er mer som en nærhetsbryter som utfører noen forhåndsdefinerte handlinger når brukeren kommer inn i et område (nærhet). Det annonserer sin identitet hele tiden, og er derfor alltid klar til å pares.
BLE2902: Jeg er fortsatt skeptisk til denne tingen, men du kan tenke på det som et programvare på klientsiden som informerer serveren om å slå varsling på eller av, dette vil hjelpe oss med å spare strøm
Håper du har en grov ide, det gode er at vi ikke trenger å vite mye siden alt håndarbeidet allerede er gjort for oss gjennom bibliotekene.
Forbereder maskinvaren
Prosjektet krever ingen maskinvareoppsett, men sørg for at du har lagt til ESP32-kortdetaljer på Arduino IDE og har prøvd et minimumseksempel på blinkprogram for å sjekke om alt fungerer som forventet. Du er skeptisk til hvordan du gjør det. Du kan følge Veiledningen Komme i gang med ESP32 med Arduino for å gjøre det samme.
Også for å teste BLE-tjenestene bruker vi nRF android-applikasjonen på mobilen vår, som kan lastes ned direkte fra PlayStore. Den er også tilgjengelig i Itunes Store for Iphone-brukere. Hvis du planlegger å jobbe med BLE i lang tid, vil dette programmet virkelig være nyttig for feilsøkingsformål.
Programmering ESP32 for batterinivåindikasjon ved hjelp av GATT-tjenesten
På dette tidspunktet antar jeg at du har en god ide om hvilken GATT-tjeneste og hvordan den implementeres ved hjelp av Service og karakteristiske modeller. La oss nå dykke inn i programmet for å lære hvordan det implementeres i ESP32 ved hjelp av Arduino IDE. Før vi fortsetter vil jeg bruke dette rommet til å takke Andreas Spiess for hans video BLE som gjorde ting veldig tydelige på min side.
Vi starter programmet med å importere de nødvendige bibliotekene til skissen vår. Det er mange ting å konfigurere for å kunne bruke ESP32s BLE-funksjonalitet forhåpentligvis, takket være Neil Kolban som allerede har gjort det harde arbeidet for oss og har levert bibliotekene. Hvis du vil forstå funksjonaliteten til bibliotekene, kan du se dokumentasjonen hans på github-siden.
#inkludere
Deretter må vi definere Server Call-back-funksjonen for vår Bluetooth-enhet. Før det kan vi forstå at det som er tilbakeringingsfunksjon i BLE.
Hva er tilbakeringingsfunksjon i BLE?
Når BLE fungerer som server, er det viktig å definere en tilbakeringingsfunksjon for server. Det er mange typer tilbakeringinger knyttet til BLE, men for å si det enkelt, anser du disse som en bekreftelse som utføres for å sikre at handlingen er fullført. En server tilbakeringing brukes til å sikre at forbindelsen mellom klient og server er opprettet.
Vi bruker følgende kodelinjer for å utføre en tilbakeringing fra serveren.
bool _BLEClientConnected = false; klasse MyServerCallbacks : offentlige BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; ugyldig onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Inne i tomrommet setup -funksjonen, vi initiere Seriell kommunikasjon på 115 200 for feilsøking og deretter initialisere Bluetooth-enhet via InitBLE funksjon.
ugyldig oppsett () { Serial.begin (115200); Serial.println ("Batterinivåindikator - BLE"); InitBLE (); }
Den initBLE er stedet hvor all magien skjer. Vi må opprette en Bluetooth-server og bruke batterinivå-tjenesten her inne. Men før det må vi definere UUID for service, karakteristikk og deskriptor for å lese batterinivået. All UUID kan fås fra Bluetooth GATT-tjenestenettstedet. For vårt tilfelle prøver vi å bruke batteritjenesten, og UUID for den er definert som 0X180F som vist nedenfor.
Deretter må vi vite karakteristikken knyttet til denne tjenesten. For å vite at det bare er å klikke på Batteriservice så blir du ført til Servicekarakteristikk-siden, hvor det nevnes at batterinivå er navnet på egenskapene og det tar inn verdien fra 0 til 100. Vær også oppmerksom på at vi bare kan utføre to handlinger med denne egenskapen, den ene er å lese som er obligatorisk å gjøre, og den andre er varsle som er valgfri. Så vi må sende batteriverdien til klienten (Telefon) som er obligatorisk, og hvis nødvendig kan vi varsle telefonen om hvilken som er valgfri.
Men vent, vi fant fremdeles ikke UUID-verdien for det karakteristiske batterinivået. For å gjøre det, gå inn på batteriets karakteristiske side og søk etter navnet på batterinivået, du finner UUID som 0X2A19, øyeblikksbildet av det vises nedenfor.
Nå som vi har alle verdiene, la oss sette det i programmet som vist nedenfor. Navnet BatterySerivce , BatteryLevelCharacteristic og BatteryLevelDescriptor er brukerdefinerte variabler som refererer til tjenesten, karakteristikken og deskriptoren vi bruker i programmet. Verdien for deskriptor 0X2901 brukes når størrelsen på verdien er 8-bit, mer informasjon finner du Descriptor Description-siden.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Å komme tilbake til initBLE- funksjonen. Vi må først starte BLE-serveren og få den til å annonsere med et navn. De følgende linjer blir brukt til å starte BLE som serveren. Navnet jeg har gitt til BLe-serveren min er “BLE Battery”, men du kan velge ditt eget.
BLEDevice:: init ("BLE Battery"); // Opprett BLE Server BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nye MyServerCallbacks ());
Deretter må vi starte GATT-tjenesten siden vi allerede har definert UUID, kan vi ganske enkelt starte tjenesten ved hjelp av linjen nedenfor.
// Opprett BLE-tjenesten BLEService * pBattery = pServer-> createService (BatteryService);
Når tjenesten er startet, kan vi koble deskriptoren med egenskaper, og sette verdiene. BLE2902-tjenesten er også lagt til her som vist nedenfor.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Prosent 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (ny BLE2902 ());
Endelig er alt klart, alt som er igjen er å be ESP32 om å annonsere slik at andre enheter som telefonen vår kan oppdage den og koble til den, og når den er koblet til en klient, bør den starte batteritjenesten som kan gjøres selv om følgende linjer.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Begynn å annonsere pServer-> getAdvertising () -> start ();
Det er så langt så bra, det siste trinnet er å fortelle deskriptoren hva verdien av batteriet er i prosent som skal sendes til klienten (Telefon). Denne verdien kan være fra 0-100 som vi leste tidligere, for å holde ting enkelt, har jeg enkle hardkodede verdien av batteriet til å være 57 og deretter øke det hvert 5. sekund og starte fra 0 når det når 100. Koden du skal gjøre som er vist nedenfor. Vær oppmerksom på at verdien som sendes er i format unit8_t.
uint8_t nivå = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); forsinkelse (5000); nivå ++; Serial.println (int (nivå)); hvis (int (nivå) == 100) nivå = 0; }
Testing av GATT-tjenesten din på ESP32 BLE
Den komplette koden som er forklart ovenfor, er gitt på slutten av siden. Last opp koden til ESP32-kortet. Når telefonen er lastet opp, bør den oppdage en Bluetooth-enhet kalt “BLE Battery”.
Installer deretter nRF android-applikasjonen, åpne den og koble til BLE Battery BLE-enheten. Utvid seksjonen Batteriservice, og du finner følgende skjermbilde.
Som du ser, har applikasjonen automatisk identifisert at BLE tilbyr batteritjeneste og har egenskapene til batterinivå på grunn av UUID som vi brukte i programmet. Du kan også se at den nåværende batteriværdien på 67% venter i 5 sekunder, og du kan også legge merke til at den blir økende.
Det kule med å bruke BLE er at nå vil ethvert program som fungerer med BLE tro at ESP32 er BLE-enhet som varsler batterinivået. For å prøve det, brukte jeg et program som heter BatON, og applikasjonen identifiserte ESP32 som batteridrevet Bluetooth-enhet og ga prosentvis beskjed på telefonen min slik
Kul!! Ikke sant? Jeg har også vist hele arbeidet i videoen nedenfor. Nå som du har lært hvordan du bruker BLE-batteritjenester med ESP32, kan du også prøve andre GATT-tjenester som er veldig interessante som puls, HID, hjertefrekvens osv. Ha det gøy….