- Komponenter krävs
- Använda nRF Connect Android-appen för ESP32 iBeacon
- Programmerar ESP32 för att fungera som BLE iBeacon
ESP32 är verkligen en kraftfull IoT-enhet med inbyggt stöd för Bluetooth och WiFi. ESP32 är en avancerad version av sin föregångare ESP8266 med extra funktioner som RAM, ROM, GPIO Pins etc. ESP32-modulen stöder både klassisk Bluetooth och Bluetooth Low Energy (BLE), den klassiska Bluetooth kan användas för att överföra låtar eller filer och BLE Alternativet kan användas för batterioptimerade applikationer som Bluetooth-fyrar, fitnessband, närhet osv. Det är också möjligt att använda ESP32 som en seriell Bluetooth som HC-05- eller HC-06-modulerna för enkla mikroprojektprojekt.
Som vi vet kan BLE fungera i två olika lägen - serverläge och klientläge. Båda lägena har diskuterats i våra tidigare ESP32-handledning:
- ESP32 BLE-server - GATT-tjänst för indikering av batterinivå
- ESP32 BLE-klient - Anslutning till Fitness Band för att utlösa en glödlampa
I den här handledningen kommer vi att bygga en BLE iBeacon med hjälp av ESP32 där ESP32 fungerar som en server och smartphone fungerar som en klient. Jag antar att du redan är bekant med hur du använder ESP32-kortet med Arduino IDE, om inte falla tillbaka till att komma igång med ESP32-handledning.
Du kan också veta mer om vad som är Beacon / iBeacon Technology genom att gå igenom våra tidigare Bluetooth iBeacon-projekt med Raspberry Pi och HM-10 BLE iBeacon.
Komponenter krävs
Hårdvara:
- ESP32 Development Board
- Micro USB-kabel
Programvara:
- Arduino IDE
- Android-app: nRF Connect för mobil (av Nordic Semiconductor)
Det finns många BLE-skannerappar, en av dem vi har använt i vårt tidigare projekt om hur man använder HM-10 BLE-modul med Arduino. Denna BLE-scanner-app ger bra grafiskt gränssnitt (GUI) men saknar dessutom information så i detta projekt använder vi NRF Connect for Mobile-appen.
Använda nRF Connect Android-appen för ESP32 iBeacon
1. Ladda ner nRF Connect-appen från Google Play Store och öppna den.
2. Skärmen ser ut som nedan. De användbara alternativen för detta projekt är "Scan", "Scanner" och "Info" när enheter hittas.
Den 'Sök' alternativet kommer att användas för att se alla tillgängliga iBeacons. För att börja söka efter iBeacon, antingen dra ner skärmen eller gå till alternativet "Skanna" längst upp till höger på skärmen. Detta börjar söka efter tillgängliga iBeacons.
3. Efter att ha sökt i iBeacon kommer du att kunna se RSSI, UUID, Major och Minor för iBeacon. RSSI ändras om du tar bort mobilen eller iBeacon från varandra. Här på den här skärmen är RSSI (-37). Annat än detta finns det några detaljer som Dummy Company Name, Device Type, Bytes Length, The Local Name of ESP32. Här är det “ ESP32 som iBeacon ”. Du kan ändra lokalt namn i skissen.
4. Efter att ha tagit bort smarttelefonen från iBeacon ändras RSSI-värdet från -37 till -58. Dessa värden kommer att förändras om du flyttar någon av enheterna.
RSSI-signalens acceptabla värden är som följer:
Signalstyrka | TL; DR | Krävs för | |
---|---|---|---|
-30 dBm | Fantastisk | Max uppnåelig signalstyrka. Klienten kan bara vara några meter från AP för att uppnå detta. Inte typiskt eller önskvärt i den verkliga världen. | Ej tillämpligt |
-67 dBm | Mycket bra | Lägsta signalstyrka för applikationer som kräver mycket tillförlitlig leverans av datapaket i tid. | VoIP / VoWiFi, strömmande video |
-70 dBm | Okej | Minsta signalstyrka för pålitlig paketleverans. | E-post, webb |
-80 dBm | Inte bra | Lägsta signalstyrka för grundläggande anslutning. Paketleverans kan vara opålitlig. | Ej tillämpligt |
-90 dBm | Oanvändbar | Närmar sig eller drunknar i bullergolvet. Någon funktionalitet är mycket osannolikt. | Ej tillämpligt |
Programmerar ESP32 för att fungera som BLE iBeacon
Det finns ett exempelprogram för ESP32 BLE iBeacon tillgängligt när du installerar ESP32-kortet i Arduino IDE. Men vi har lite redigerat denna skiss i denna handledning, den fullständiga redigerade versionen av exempelprogrammet ges i slutet av denna handledning.
Följ steg för att öppna provprogrammet för ESP32 BLE_iBeacon.
- Öppna Arduino IDE och välj “ESP32 Dev Module”. (Om du inte hittar det här kortet, kontrollera om du har installerat ESP32-kortpaketet)
- Gå till Arkiv > Exempel > ESP32 BLE Arduino > BLE_iBeacon
- Öppna “BLE_iBeacon” -skiss.
Nu finns det en liten modifiering av koden som görs i denna handledning. ESP32-namnet kommer också att uppdateras i denna skiss. Så börja med att inkludera nödvändiga bibliotek som kommer att användas för att skapa BLE Server och iBeacon.
#include "sys / time.h"
Detta är ett tidsbibliotek för att få aktuell systemtid. Detta innehåller funktioner som tv_sec, gettimeofday () etc. För mer information kan du besöka officiell UNIX-utgåva av ' sys / time.h'.
Därefter ingår ESP32 BLE-biblioteken som innehåller många funktioner som används för att skapa ESP32 i olika konfigurationer som BLE Client eller BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Den iBeacon bibliotek ingår som sätter ESP32 som iBeacon. Tillsammans med detta ingår det djupa sömnbiblioteket för ESP32. Biblioteket kommer att användas för att skicka ESP32 i djupt viloläge under en definierad tidsperiod.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definiera sömntiden för ESP32. Här kommer ESP32 att ligga i djup sömn under 10 sekunder och den kommer att annonsera och sedan återgå till djup sömn i 10 sekunder.
#define GPIO_DEEP_SLEEP_DURATION 10
Här definieras RTC_DATA_ATTR. Observera att om du definierar en global variabel med RTC_DATA_ATTR-attribut, kommer variabeln att placeras i RTC_SLOW_MEM-minne. Så strukturen deklareras som RTC_DATA_ATTR och kopierar det dynamiska minnet till denna struktur innan en djup sömn hjälper till att återställa detta till dynamiskt minne efter uppvaknandet. Med enkla ord sparar vi tiden i det statiska minnet från det dynamiska minnet för att återställa det igen efter en djup sömn. Här definieras de två variablerna. Den " sista " används för att få sista gången när ESP32 gick i djup sömn och bootcount används antal återställningar.
RTC_DATA_ATTR statisk tid_t senast; RTC_DATA_ATTR statisk uint32_t bootcount;
Sedan definierar BLE Advertising Type. Definitionen görs enligt följande.
BLEAdvertising * pAdvertising;
Den TimeVal definieras som strukturen för att komma åt den aktuella tiden.
struct tidsplan nu;
Även UUID definieras. UUID: erna kan genereras från den här länken .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Skapa nu en funktion som kommer att innehålla iBeacon-attribut som UUID, Major, Minor, Etc. I den här funktionen skapar du en instans för BLE som iBeacon och ställer in ett falskt tillverkar-ID, UUID, major och minor för ESP32 som iBeacon.
ogiltig setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Ställ in flaggan som 0x04 så att den matar ut BrEdrNotSupport i skannern.
oData.setFlags (0x04);
Ställ in reklamdata för publicering.
std:: string strServiceData = "";
Lägg till strängen efter varandra för att annonsera.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Skriv strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Börja reklam genom att publicera data.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Börja den seriella bildskärmen med 115200 baudhastighet och få tiden. Också öka den bootcount att lagra antalet återställs.
Serial.begin (115200); gettimeofday (& nu, NULL); Serial.printf ("start ESP32% d \ n", bootcount ++);
Spara aktuell tid i det statiska minnet.
senaste = now.tv_sec;
Skapa en BLE-enhet och namnge den som du vill. Här heter ESP32 som “ ESP2 som iBeacon ”. Observera att namnen kan vara långa men den här versionen av kod har startat stöd för långa namn.
BLEDevice:: init ("ESP32 som iBeacon");
Skapa BLE-server för att annonsera och starta.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Ställ sedan ESP32 i iBeacon-läge.
setBeacon ();
Börja annonsera och sluta sedan annonsera och lägg dig i djup sömn i 10 sekunder.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Slutligen anslut ESP32 Development Board med din bärbara dator med en Micro USB-kabel och ladda upp koden till ESP32 med Arduino IDE. Öppna sedan NRF Connect Android App i din smartphone och starta skanningen. Du hittar ESP32 som iBeacon- sändning enligt bilden nedan:
Så här kan ESP32 användas som BLE Beacon för att marknadsföra UUID, Major och Minor. Om du vill veta mer om iBeacon följ sedan vår tidigare handledning om HM10 som iBeacon. Även om du är osäker kan du kommentera nedan eller ställa frågor i forum.
Komplett kod med en fungerande video ges nedan.
/>