- Terminologier relaterade till BLE (Bluetooth Low Energy)
- Förbereder hårdvaran
- Programmering ESP32 för indikering av batterinivå med hjälp av GATT-tjänsten
- Testa din GATT-tjänst på ESP32 BLE
Trådlösa hörlurar, Fitnessband, Bluetooth-högtalare, In-Ear-hörlurar, Mobiltelefoner, Bärbara datorer… det finns så många Bluetooth-enheter runt oss och de flesta av dessa enheter är batteridrivna. Har du någonsin undrat att när du ansluter en Bluetooth-enhet till din mobiltelefon hur den automatiskt förstår att den anslutna enheten är en dator eller ljudenhet eller en mobiltelefon? För vissa enheter visar vår telefon till och med automatiskt batteriprocenten för den anslutna enheten i meddelandefältet. Hur händer allt detta på egen hand? Det borde finnas något gemensamt protokoll som delas mellan telefonen och Bluetooth-enheten till höger!
Håll dig nyfiken, du får svar på dessa frågor när vi försöker förstå Bluetooth Low Energy (BLE för kort), med den populära ESP32-modulen. Till skillnad från Classic Bluetooth i ESP32 fungerar BLE bara när en kommunikation är aktiverad och förblir i viloläge, annars gör det det rätta valet för batteridrivna applikationer. BLE kan också bilda nätverk och fungera som fyrar. Normalt fungerar en BLE-modul antingen som server eller som klient, här kommer vi att använda ESP32 BLE som server.
Här har vi delat upp hela ESP32 Bluetooth i tre segment för att underlätta förståelsen.
1. Seriell Bluetooth på ESP32-växlingslampa från mobiltelefon
2 . BLE-server för att skicka batterinivåinformation till mobiltelefon med GATT-tjänsten
3. BLE-klient för att söka efter BLE-enheter och fungera som fyr.
Vi har redan täckt den första artikeln; i den här artikeln kommer vi att lära oss hur man får ESP32 BLE att fungera som server och använder GATT-tjänsten för att skicka information om batterinivå. För teständamål skickar vi hårdkodade värden från ESP32 som batteriprocent till vår mobiltelefon via BLE GATT-tjänsten. På så sätt antar vår mobil att ESP32 är en batteridriven Bluetooth-enhet som försöker skicka till sin batteriprocent. Innan vi går in i detalj kommer vi att förstå några terminologier relaterade till Bluetooth Low Energy.
Terminologier relaterade till BLE (Bluetooth Low Energy)
BLE-server: Som tidigare sagt kan BLE programmeras att fungera antingen som server eller som klient. När du arbetar som server kan BLE bara tillhandahålla data, den kan inte initiera en anslutning. Exempel skulle vara ett fitnessband. En server kan bara skicka information om klienten begär det.
ESP32: s BLE används oftast en server. Varje server kommer att ha en eller flera tjänster inom sig och på samma sätt kommer varje tjänst att ha en eller flera egenskaper associerade med sig. En karaktäristik kan ha noll, en eller flera än en deskriptor inuti. Varje tjänst, karakteristik eller beskrivare har sitt eget fördefinierade unika ID som heter UUID.
BLE-klient: Klienten kan skanna anslutning och lyssna på andra Bluetooth-enheter. Ett exempel kan vara din mobiltelefon. Observera att de flesta BLE-hårdvaruenheter kan fungera som server och som klient, det är programvaran som bestämmer enhetens roll.
Perifer enhet / central enhet: I ett BLE-nätverk kan det bara finnas en central enhet, men kan ha så många kringutrustning som krävs. Centralenheten kan ansluta till alla kringutrustning samtidigt, men den kringutrustade enheten kan endast anslutas till den centrala enheten, på detta sätt kan inga två perifera enheter dela data mellan varandra. Ett bästa exempel för centrala enheter är våra smarta telefoner och för perifera enheter är våra Bluetooth-hörlurar eller fitnessband.
BLE Advertising: A BLE Advertising är den nördiga termen att instruera Bluetooth-enheten att vara synlig för alla så att den kan para ihop och upprätta en anslutning. Det kan betraktas som en enkelriktad kommunikation. Här fortsätter servern att annonsera data och förväntar sig att en server ska ta emot den. BLE Beacon är en typ av BLE.
UUID (Universal Unique Identifier): Varje BLE Bluetooth-enhet får ett Universal Unique Identifier Number när den är programmerad av programmeraren. Du kan tänka på den här identifieraren som en sekvens av siffror som representerar BLE-enhetens funktion / roll. Återigen finns det två typer av UUID. Den ena är Service UUID och den andra är Characteristic UUID.
GATT Service: GATT står för Generic Attribute Profile; detta definierar några vanliga sätt på vilka två BLE-enheter alltid ska kommunicera. Detta attributprotokoll (ATT) är fördefinierat och är vanligt för alla BLE-enheter, så på det här sättet kan två BLE-enheter identifiera varandra. Så GATT var svaret på vår tidigare fråga.
Tekniken med vilken två BLE-enheter ska skicka data fram och tillbaka definieras av konceptet som kallas tjänster och egenskaper.
BLE Service / BLE-karakteristik: Service UUID berättar vilken typ av service BLE-enheten ska utföra och Characteristic UUID berättar vilka parametrar eller funktioner som kommer att utföras av den tjänsten. Så varje tjänst kommer att ha en eller flera egenskaper under sig. Okej! Varifrån får programmeraren detta UUID? Varje UUID är redan definierat av GATT (Generic Attribute Profile). Du kan besöka deras webbplats och välja UUID efter behov för projektet. Jag vet att det har studsat lite över huvudet på oss; låt oss förstå det med ett exempel.
Låt oss anta BLE-enheten för en ljudspelare. Först när du parar ihop den med din telefon identifierar den den som en ljudenhet och visar också batterinivån i statusfältet. Så för att detta ska hända måste ljudspelaren på något sätt berätta för din telefon att den är villig att dela batterinivån och den procentuella laddning den har i batteriet. Detta görs med hjälp av UUID, det finns en specifik UUID som talar om att BLE-tärningarna kommer att ge information om batterinivån. Denna UUID som berättar vilken typ av tjänst som heter Service UUID, återigen kan det finnas så många parametrar som måste bytas mot att slutföra en tjänst som om batteriets värde finns på en sådan parameter, kommer varje parameter att ha sin egen UUID och dessa kallas Characteristic UUID.Den gemensamma funktionen som utförs av en egenskap är Läs, skriv, meddela och indikera.
BLE Descriptor: Descriptor är ett valfritt attribut som finns i karaktäristiken. En Descriptor anger normalt hur man får åtkomst till en Characteristic.
BLE Beacon: En Bluetooth Beacon är mer som en närhetsomkopplare som utför någon fördefinierad åtgärd när användaren hamnar inom ett område (närhet). Det annonserar sin identitet hela tiden och är därmed alltid redo att para ihop.
BLE2902: Jag är fortfarande skeptisk till den här saken, men du kan tänka på det som en mjukvara på klientsidan som informerar servern om att sätta på eller stänga av meddelanden, detta hjälper oss att spara ström
Hoppas du har en grov uppfattning, det bästa är att vi inte behöver veta mycket eftersom allt handarbete redan är gjort för oss genom biblioteken.
Förbereder hårdvaran
Projektet kräver ingen hårdvaruuppsättning, men se till att du har lagt till ESP32-kortinformation på din Arduino IDE och har provat minimiproblinkprogram för att kontrollera om allt fungerar som förväntat. Du är skeptisk till hur du gör det, du kan följa guiden Komma igång med ESP32 med Arduino för att göra detsamma.
För att testa BLE-tjänsterna kommer vi att använda Android-appen nRF på vår mobil som kan laddas ner direkt från PlayStore. Det finns också i Itunes Store för Iphone-användare. Om du planerar att arbeta med BLE länge kommer den här applikationen att vara till nytta för felsökningsändamål.
Programmering ESP32 för indikering av batterinivå med hjälp av GATT-tjänsten
Vid den här tiden antar jag att du har en rättvis uppfattning om vilken GATT-tjänst och hur den implementeras med hjälp av Service- och karakteristiska modeller. Låt oss nu dyka in i programmet för att lära oss hur det implementeras i ESP32 med Arduino IDE. Innan vi fortsätter vill jag använda detta utrymme för att tacka Andreas Spiess för hans video BLE som gjorde saker mycket tydliga på min sida.
Vi börjar programmet med att importera de bibliotek som krävs till vår skiss. Det finns många saker att konfigurera för att kunna använda ESP32s BLE-funktionalitet förhoppningsvis tack vare Neil Kolban som redan har gjort det hårda arbetet för oss och har tillhandahållit biblioteken. Om du vill förstå funktionerna i biblioteken kan du hänvisa till hans dokumentation på github-sidan.
#omfatta
Därefter måste vi definiera återuppringningsfunktionen för vår Bluetooth-enhet. Innan det kan vi förstå att vad som är återuppringningsfunktion i BLE.
Vad är återuppringningsfunktion i BLE?
När BLE fungerar som server är det viktigt att definiera en serveråteruppringningsfunktion. Det finns många typer av återuppringningar associerade med BLE men för att göra det enkelt anser du dessa som en bekräftelse som utförs för att säkerställa att åtgärden har slutförts. En serveråterkallning används för att säkerställa att anslutningen mellan klient och server upprättas framgångsrikt.
Vi använder följande kodrader för att utföra en serveråteruppringning.
bool _BLEClientConnected = false; klass MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; ogiltigt onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Inuti funktionen för ogiltig installation initierar vi seriekommunikation vid 115200 för felsökning och initierar sedan Bluetooth-enheten via InitBLE- funktionen.
ogiltig installation () { Serial.begin (115200); Serial.println ("Indikator för batterinivå - BLE"); InitBLE (); }
Den initBLE är den plats där all magi händer. Vi måste skapa en Bluetooth-server och använda tjänsten Batterinivå här. Men innan det måste vi definiera UUID för Service, Characteristic och Descriptor för att läsa batterinivån. Allt UUID kan erhållas från Bluetooth GATT-tjänstens webbplats. För vårt fall försöker vi använda batteritjänsten och UUID för den definieras som 0X180F enligt nedan.
Därefter måste vi känna till karaktäristiken för denna tjänst. För att veta att klicka bara på batteriservice så kommer du till sidan Servicekarakteristik, där det nämns att batterinivån är namnet på egenskaperna och det tar in värdet från 0 till 100. Observera att vi bara kan utföra två åtgärder med denna egenskap, den ena är att läsa som är obligatorisk att göra och den andra är meddela vilken som är valfri. Så vi måste skicka batterivärdet till klienten (telefon) vilket är obligatoriskt och vid behov kan vi meddela telefonen om vilken som är valfri.
Men vänta, vi hittade fortfarande inte UUID-värdet för den karakteristiska batterinivån. För att komma in på sidan Karakteristik för batteri och söka efter batterinivånamnet hittar du dess UUID som 0X2A19, ögonblicksbilden av den visas nedan.
Nu när vi har alla värden, låt oss sätta det i programmet enligt nedan. Namnet BatterySerivce , BatteryLevelCharacteristic och BatteryLevelDescriptor är användardefinierade variabler för att hänvisa till den Service, Characteristic och Descriptor som vi använder i programmet. Värdet för Descriptor 0X2901 används när storleken på värdet är 8-bitars. Mer information finns på Descriptor Description-sidan.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Återgå till initBLE- funktionen. Vi måste först starta BLE-servern och få den att annonsera med ett namn. De följande rader används för att starta BLE som server. Namnet som jag har gett till min BLe-server är “BLE Battery”, men du kan välja ditt eget.
BLEDevice:: init ("BLE Battery"); // Skapa BLE Server BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (nya MyServerCallbacks ());
Därefter måste vi starta GATT-tjänsten eftersom vi redan har definierat UUID kan vi helt enkelt starta tjänsten med raden nedan.
// Skapa BLE-tjänsten BLEService * pBattery = pServer-> createService (BatteryService);
När tjänsten har startat kan vi länka beskrivaren med egenskaper och ställa in värdena. BLE2902-tjänsten läggs också till här enligt nedan.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Procent 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (ny BLE2902 ());
Slutligen är allt klart, allt som återstår är att be ESP32 att annonsera så att andra enheter som vår telefon kan upptäcka den och ansluta till den, och när den är ansluten till en klient bör den starta batteritjänsten som kan göras även om följande rader.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Börja annonsera pServer-> getAdvertising () -> start ();
Det är så långt så bra, det sista steget är att berätta för beskrivaren vad som är värdet på batteriet i procent som ska skickas till klienten (telefon). Detta värde kan vara från 0 -100 som vi läste tidigare, för att hålla sakerna enkla, jag har enkelt hårt kodat värdet på batteriet till att vara 57 och sedan öka det var 5: e sekund och börja från 0 när det når 100. Koden att göra som visas nedan. Observera att värdet som skickas är i format unit8_t.
uint8_t nivå = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); fördröjning (5000); nivå ++; Serial.println (int (nivå)); om (int (nivå) == 100) nivå = 0; }
Testa din GATT-tjänst på ESP32 BLE
Den fullständiga koden som förklaras ovan ges i slutet av sidan. Ladda upp koden till ditt ESP32-kort. När telefonen har laddats upp ska den upptäcka en Bluetooth-enhet som heter “BLE Battery”.
Installera sedan nRF android-applikationen och öppna den och anslut till BLE Battery BLE-enheten. Expandera batteriserviceavdelningen så hittar du följande skärm.
Som du kan se har applikationen automatiskt identifierat att BLE tillhandahåller batteriservice och har egenskaperna hos batterinivån på grund av UUID som vi använde i programmet. Du kan också se det aktuella batterivärdet som är 67% vänta i 5 sekunder och du kan också märka att det blir ökat.
Det coolaste med att använda BLE är att alla applikationer som fungerar med BLE nu tror att din ESP32 är BLE-enhet som meddelar batterinivån. För att prova det använde jag ett program som heter BatON och applikationen identifierade ESP32 som batteridriven Bluetooth-enhet och gav den procentuella aviseringen på min telefon så här
Häftigt!! Rätt? Jag har också visat hela arbetet i videon nedan. Nu när du har lärt dig hur du använder BLE-batteritjänster med ESP32 kan du också prova andra GATT-tjänster som är väldigt intressanta som puls, HID, hjärtfrekvens osv. Ha kul….