- Komponenter kreves
- Bruker nRF Connect Android-appen for ESP32 iBeacon
- Programmering av ESP32 til å fungere som BLE iBeacon
ESP32 er virkelig en kraftig IoT-enhet med innebygd støtte for Bluetooth og WiFi. ESP32 er en avansert versjon av forgjengeren ESP8266 med ekstra funksjoner som RAM, ROM, GPIO Pins etc. ESP32-modulen støtter både klassisk Bluetooth og Bluetooth Low Energy (BLE), den klassiske Bluetooth kan brukes til å overføre sanger eller filer og BLE alternativet kan brukes til batterioptimaliserte applikasjoner som Bluetooth-beacons, fitnessbånd, nærhet osv. Det er også mulig å bruke ESP32 som en seriell Bluetooth som HC-05- eller HC-06-modulene for enkle mikrocontrollerprosjekter.
Som vi vet kan BLE operere i to forskjellige moduser - servermodus og klientmodus. Begge modusene har blitt diskutert i de forrige ESP32-opplæringene:
- ESP32 BLE Server - GATT-tjeneste for indikering av batterinivå
- ESP32 BLE Client - Koble til Fitness Band for å utløse en pære
I denne opplæringen vil vi bygge en BLE iBeacon ved hjelp av ESP32 der ESP32 vil fungere som en server og smarttelefonen vil fungere som en klient. Jeg antar at du allerede er kjent med hvordan du bruker ESP32-kortet med Arduino IDE, hvis ikke falle tilbake til å komme i gang med ESP32-opplæringen.
Du kan også vite mer om hva som er Beacon / iBeacon Technology ved å gå gjennom våre forrige Bluetooth iBeacon-prosjekter ved hjelp av Raspberry Pi og HM-10 BLE iBeacon.
Komponenter kreves
Maskinvare:
- ESP32 Development Board
- Micro USB-kabel
Programvare:
- Arduino IDE
- Android-app: nRF Connect for Mobile (av Nordic Semiconductor)
Det er mange BLE-skannerapper, en av dem vi har brukt i vårt forrige prosjekt om hvordan du bruker HM-10 BLE-modul med Arduino. Denne BLE-skannerappen gir god grafisk grensesnitt (GUI), men mangler i tillegg informasjon, så i dette prosjektet bruker vi NRF Connect for Mobile-appen.
Bruker nRF Connect Android-appen for ESP32 iBeacon
1. Last ned nRF Connect-appen fra Google Play Store og åpne den.
2. Skjermen ser ut som nedenfor. De nyttige alternativene for dette prosjektet er 'Scan', 'Scanner' og 'Info' når enheter blir funnet.
Alternativet 'Skann' vil bli brukt til å se alle tilgjengelige iBeacons. For å begynne å søke etter iBeacon, enten trekk ned skjermen eller gå til alternativet 'Skann' øverst til høyre på skjermen. Dette begynner å søke etter tilgjengelige iBeacons.
3.Etter å ha søkt på iBeacon, vil du kunne se RSSI, UUID, Major og Minor of iBeacon. RSSI vil endres hvis du tar mobilen eller iBeacon fra hverandre. Her i dette skjermbildet er RSSI (-37). Annet enn dette er det noen detaljer som Dummy Company Name, Device Type, Bytes Length, The Local Name of ESP32. Her er det “ ESP32 som iBeacon ”. Du kan endre lokalt navn i skissen.
4. Etter å ha tatt bort smarttelefonen fra iBeacon, endres RSSI-verdien fra -37 til -58. Disse verdiene vil fortsette å endres hvis du flytter på en av enhetene.
RSSI-signal akseptable verdier er som følger:
Signalstyrke | TL; DR | Påkrevd for | |
---|---|---|---|
-30 dBm | Fantastisk | Maks oppnåelig signalstyrke. Klienten kan bare være noen få meter fra AP for å oppnå dette. Ikke typisk eller ønskelig i den virkelige verden. | Ikke relevant |
-67 dBm | Veldig bra | Minimum signalstyrke for applikasjoner som krever svært pålitelig og rettidig levering av datapakker. | VoIP / VoWiFi, streaming av video |
-70 dBm | Greit | Minimum signalstyrke for pålitelig pakkelevering. | E-post, nett |
-80 dBm | Ikke bra | Minimum signalstyrke for grunnleggende tilkobling. Levering av pakker kan være upålitelig. | Ikke relevant |
-90 dBm | Ubrukbar | Nærmer seg eller drukner i støygulvet. Enhver funksjonalitet er høyst usannsynlig. | Ikke relevant |
Programmering av ESP32 til å fungere som BLE iBeacon
Det er eksempelprogram med ESP32 BLE iBeacon tilgjengelig når du installerer ESP32 Board i Arduino IDE. Men vi har redigert denne skissen litt i denne opplæringen, den fullstendige redigerte versjonen av prøveprogrammet er gitt på slutten av denne opplæringen.
For å åpne prøveprogrammet til ESP32 BLE_iBeacon, følg trinnene nedenfor.
- Åpne Arduino IDE og velg “ESP32 Dev Module”. (Hvis du ikke finner dette kortet, så sjekk om du har installert ESP32 Board Package)
- Gå til Fil > Eksempler > ESP32 BLE Arduino > BLE_iBeacon
- Åpne "BLE_iBeacon" skisse.
Nå er det en liten endring i koden som gjøres i denne opplæringen. ESP32-navnet vil også bli oppdatert i denne skissen. Så begynn med å inkludere nødvendige biblioteker som vil bli brukt i Opprette BLE Server og iBeacon.
# inkluderer "sys / time.h"
Dette er et tidsbibliotek for å få dagens systemtid. Dette inneholder funksjoner som tv_sec, gettimeofday () osv. For mer informasjon, kan du besøke offisiell UNIX-utgivelse av ' sys / time.h'.
Deretter inkluderes ESP32 BLE-bibliotekene som inneholder mange funksjoner som brukes til å lage ESP32 i forskjellige konfigurasjoner, for eksempel BLE Client eller BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Den iBeacon Biblioteket er inkludert som setter ESP32 som iBeacon. Sammen med dette er dyp søvnbiblioteket inkludert for ESP32. Biblioteket vil bli brukt til å sende ESP32 i dyp hvilemodus i en definert tidsperiode.
# inkluderer "BLEBeacon.h" # inkluderer "esp_sleep.h"
Definer søvnvarigheten for ESP32. Her vil ESP32 være i dyp søvn i 10 sekunder, og den vil annonsere og deretter igjen gå i dyp søvn i 10 sekunder.
#define GPIO_DEEP_SLEEP_DURATION 10
Her er RTC_DATA_ATTR definert. Merk at hvis du definerer en global variabel med RTC_DATA_ATTR-attributt, blir variabelen plassert i RTC_SLOW_MEM-minne. Så strukturen erklært som RTC_DATA_ATTR og kopiering av det dynamiske minnet til denne strukturen før en dyp søvn hjelper deg med å gjenopprette dette til dynamisk minne etter oppvåkning. Med enkle ord sparer vi tiden i statisk minne fra dynamisk minne for å gjenopprette det igjen etter en dyp søvn. Her er de to variablene definert. Den ' siste ' brukes til å få siste gang da ESP32 sovnet dypt og bootcount brukes antall tilbakestillinger.
RTC_DATA_ATTR statisk tid_t sist; RTC_DATA_ATTR statisk uint32_t bootcount;
Deretter definerer BLE Advertising Type. Definisjonen gjøres som følger.
BLEAdvertising * pAdvertising;
Den timeval er definert som struktur for å få tilgang til den gjeldende tid.
struktur tidsperioden nå;
UUID er også definert. UUID-ene kan genereres fra denne lenken .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Opprett nå en funksjon som vil inneholde iBeacon-attributter som UUID, Major, Minor, Etc. I denne funksjonen oppretter du en forekomst for BLE som iBeacon, og setter en falsk produsent-ID, UUID, major og minor for ESP32 som iBeacon.
ugyldig setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Sett flagget som 0x04 slik at det sendes ut BrEdrNotSupported i skanneren.
oData.setFlags (0x04);
Angi annonseringsdata for publisering.
std:: string strServiceData = "";
Legg til strengen etter hverandre for å annonsere.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Skriv strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Start annonseringen ved å publisere data.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Begynn den serielle skjermen med 115200 baudrate og få tiden. Øk også bootcount for å lagre antall tilbakestillinger.
Serial.begin (115200); gettimeofday (& nå, NULL); Serial.printf ("start ESP32% d \ n", bootcount ++);
Lagre gjeldende tid i det statiske minnet.
siste = now.tv_sec;
Lag en BLE-enhet og navngi den slik du vil. Her heter ESP32 som “ ESP2 som iBeacon ”. Merk at navnene kan være lange, men denne versjonen av koden har startet støtten for lange navn.
BLEDevice:: init ("ESP32 som iBeacon");
Lag BLE-server for å annonsere og starte.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Sett deretter ESP32 i iBeacon-modus.
setBeacon ();
Begynn å annonsere, og deretter slutte å annonsere og sov i dyp søvn i 10 sekunder.
pAdvertising-> start (); pAdvertising-> stopp (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Til slutt kobler du ESP32 Development Board med din bærbare datamaskin ved hjelp av en Micro USB-kabel og laster opp koden til ESP32 ved hjelp av Arduino IDE. Åpne deretter nRF Connect Android-appen på smarttelefonen din og begynn å skanne. Du finner ESP32 som iBeacon- kringkasting som vist på bildet nedenfor:
Slik kan ESP32 brukes som BLE Beacon for å annonsere UUID, Major og Minor. Hvis du vil vite mer om iBeacon, kan du følge vår forrige opplæring om HM10 som iBeacon. Også hvis du er i tvil, kan du kommentere nedenfor eller stille spørsmål i forumet.
Fullstendig kode med en arbeidsvideo er gitt nedenfor.
/>