- Komponenter, der kræves
- Brug af nRF Connect Android-appen til ESP32 iBeacon
- Programmering af ESP32 til at fungere som BLE iBeacon
ESP32 er virkelig en kraftfuld IoT-enhed med indbygget support til Bluetooth og WiFi. ESP32 er en avanceret version af sin forgænger ESP8266 med ekstra funktioner som RAM, ROM, GPIO Pins osv. ESP32-modulet understøtter både klassisk Bluetooth og Bluetooth Low Energy (BLE), den klassiske Bluetooth kan bruges til at overføre sange eller filer og BLE option kan bruges til batterioptimerede applikationer som Bluetooth-beacons, fitnessbånd, nærhed osv. Det er også muligt at bruge ESP32 som en seriel Bluetooth som HC-05 eller HC-06-modulerne til enkle mikrocontrollerprojekter.
Som vi ved, kan BLE fungere i to forskellige tilstande - Servertilstand og klienttilstand. Begge tilstande er blevet diskuteret i vores tidligere ESP32-vejledninger:
- ESP32 BLE Server - GATT-service til indikation af batteriniveau
- ESP32 BLE-klient - Tilslutning til fitnessbånd for at udløse en pære
I denne vejledning bygger vi en BLE iBeacon ved hjælp af ESP32, hvor ESP32 fungerer som en server, og smartphone fungerer som en klient. Jeg antager, at du allerede er bekendt med, hvordan du bruger ESP32-kortet med Arduino IDE, hvis ikke falder tilbage til at komme i gang med ESP32-tutorial.
Du kan også vide mere om, hvad der er Beacon / iBeacon Technology ved at gennemgå vores tidligere Bluetooth iBeacon-projekter ved hjælp af Raspberry Pi og HM-10 BLE iBeacon.
Komponenter, der kræves
Hardware:
- ESP32 Development Board
- Micro USB-kabel
Software:
- Arduino IDE
- Android-app: nRF Connect til mobil (af Nordic Semiconductor)
Der er mange BLE-scanner-apps, en af dem har vi brugt i vores tidligere projekt om, hvordan man bruger HM-10 BLE-modul med Arduino. Denne BLE-scanner-app giver god grafisk grænseflade (GUI), men mangler yderligere information, så i dette projekt bruger vi NRF Connect til mobil-appen.
Brug af nRF Connect Android-appen til ESP32 iBeacon
1. Download nRF Connect-appen fra Google Play Butik, og åbn den.
2. Skærmen ser ud som nedenfor. De nyttige muligheder for dette projekt er 'Scan', 'Scanner' og 'Info', når enheder bliver fundet.
Indstillingen 'Scan' bruges til at se alle de tilgængelige iBeacons. For at begynde at søge efter iBeacon skal du enten trække skærmen ned eller gå til indstillingen 'Scan' øverst til højre på skærmen. Dette begynder at søge efter de tilgængelige iBeacons.
3.Efter søgning i iBeacon vil du være i stand til at se RSSI, UUID, Major og Minor i iBeacon. RSSI ændres, hvis du tager mobilen eller iBeacon væk fra hinanden. Her på dette skærmbillede er RSSI (-37). Bortset fra dette er der nogle detaljer såsom Dummy Firmanavn, Enhedstype, Bytes længde, ESP32's lokale navn. Her er det “ ESP32 som iBeacon ”. Du kan ændre det lokale navn i skitsen.
4. Efter at have taget smartphonen fra iBeacon, ændres RSSI-værdien fra -37 til -58. Disse værdier bliver ved med at ændre sig, hvis du flytter en af enhederne.
RSSI-signalets acceptable værdier er som følger:
Signalstyrke | TL; DR | Påkrævet for | |
---|---|---|---|
-30 dBm | Fantastiske | Maks. Opnåelig signalstyrke. Klienten kan kun være et par meter fra AP for at opnå dette. Ikke typisk eller ønskeligt i den virkelige verden. | Ikke relevant |
-67 dBm | Meget godt | Minimum signalstyrke til applikationer, der kræver meget pålidelig og rettidig levering af datapakker. | VoIP / VoWiFi, streaming video |
-70 dBm | okay | Minimum signalstyrke for pålidelig pakkelevering. | E-mail, internet |
-80 dBm | Ikke godt | Minimum signalstyrke for grundlæggende tilslutning. Pakkelevering kan være upålidelig. | Ikke relevant |
-90 dBm | Ubrugelig | Nærmer sig eller drukner i støjgulvet. Enhver funktionalitet er meget usandsynlig. | Ikke relevant |
Programmering af ESP32 til at fungere som BLE iBeacon
Der er et eksempelprogram med ESP32 BLE iBeacon tilgængeligt, når du installerer ESP32 Board i Arduino IDE. Men vi har let redigeret denne skitse i denne tutorial, den komplette redigerede version af prøveprogrammet er givet i slutningen af denne tutorial.
For at åbne prøveprogrammet for ESP32 BLE_iBeacon skal du blot følge nedenstående trin.
- Åbn Arduino IDE, og vælg “ESP32 Dev Module”. (Hvis du ikke finder dette kort, skal du kontrollere, om du har installeret ESP32 Board Package)
- Gå til Fil > Eksempler > ESP32 BLE Arduino > BLE_iBeacon
- Åbn "BLE_iBeacon" skitse.
Nu er der en lille ændring i koden, som udføres i denne vejledning. ESP32-navnet opdateres også i denne skitse. Så start med medtagelse af nødvendige biblioteker, som vil blive brugt til Oprettelse af BLE Server og iBeacon.
# inkluderer "sys / time.h"
Dette er et tidsbibliotek for at få den aktuelle systemtid. Dette indeholder funktioner som tv_sec, gettimeofday () osv. For mere information kan du besøge officiel UNIX-udgivelse af ' sys / time.h'.
Derefter inkluderes ESP32 BLE-biblioteker, som indeholder mange funktioner, der bruges til at fremstille ESP32 i forskellige konfigurationer, såsom BLE Client eller BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Den iBeacon Biblioteket er inkluderet som sætter ESP32 som iBeacon. Sammen med dette er det dybe søvnbibliotek inkluderet til ESP32. Biblioteket vil blive brugt til at sende ESP32 i dyb dvaletilstand i en defineret periode.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definer søvnvarighed for ESP32. Her vil ESP32 være i dyb søvn i en varighed på 10 sekunder, og den vil annoncere og derefter igen gå i dyb søvn i 10 sekunder.
#definer GPIO_DEEP_SLEEP_DURATION 10
Her er RTC_DATA_ATTR defineret. Bemærk, at hvis du definerer en global variabel med RTC_DATA_ATTR-attribut, placeres variablen i RTC_SLOW_MEM-hukommelsen. Så strukturen erklæret som RTC_DATA_ATTR og kopiering af den dynamiske hukommelse til denne struktur før en dyb søvn hjælper med at gendanne dette til dynamisk hukommelse efter vågne op. Med enkle ord sparer vi tiden i statisk hukommelse fra dynamisk hukommelse for at gendanne den igen efter en dyb søvn. Her er de to variabler defineret. Den ' sidste ' bruges til at få sidste gang, hvor ESP32 gik i dyb søvn, og bootcount bruges antal antal nulstillinger.
RTC_DATA_ATTR statisk tid_t sidste; RTC_DATA_ATTR statisk uint32_t bootcount;
Så definere BLE Advertising type. Definitionen udføres som følger.
BLEAdvertising * pAdvertising;
Den timeval defineres som struktur til adgang til den aktuelle tid.
struct timeval nu;
UUID er også defineret. UUID'erne kan genereres fra dette link .
#definer BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Opret nu en funktion, der indeholder iBeacon-attributter som UUID, Major, Minor, Etc. I denne funktion skal du oprette en instans for BLE som iBeacon, og indstille en falsk producent-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);
Sæt flaget som 0x04, så det vil sende BrEdrNotSupported i scanneren.
oData.setFlags (0x04);
Indstil reklamedata til udgivelse.
std:: string strServiceData = "";
Tilføj strengen efter hinanden for at annoncere.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Skriv strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Start reklamen ved at offentliggøre data.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Start den serielle skærm med 115200 baudhastighed, og få tiden. Forøg også bootcount for at gemme antallet af nulstillinger.
Serial.begin (115200); gettimeofday (& nu, NULL); Serial.printf ("start ESP32% d \ n", bootcount ++);
Gem det aktuelle tidspunkt i den statiske hukommelse.
sidste = now.tv_sec;
Opret en BLE-enhed, og navngiv den, som du vil. Her hedder ESP32 som “ ESP2 som iBeacon ”. Bemærk, at navnene kan være lange, men denne version af kode har startet understøttelsen af lange navne.
BLEDevice:: init ("ESP32 som iBeacon");
Opret BLE-server for at annoncere og starte.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Indstil derefter ESP32 i iBeacon-tilstand.
setBeacon ();
Begynd at annoncere, stop derefter med at annoncere, og gå i dyb søvn i 10 sekunder.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Tilslut til sidst ESP32 Development Board med din bærbare computer ved hjælp af et Micro USB-kabel, og upload koden til ESP32 ved hjælp af Arduino IDE. Åbn derefter nRF Connect Android-appen på din smartphone, og start scanningen. Du finder ESP32 som iBeacon- udsendelse som vist på nedenstående billede:
Sådan kan ESP32 bruges som BLE Beacon til at reklamere for UUID, Major og Minor. Hvis du vil vide mere om iBeacon, skal du følge vores tidligere tutorial om HM10 som iBeacon. Også hvis du er i tvivl, så kommenter nedenfor eller still spørgsmål i fora.
Komplet kode med en fungerende video er angivet nedenfor.
/>