- Components necessaris
- Ús de l’aplicació Android nRF Connect per a ESP32 iBeacon
- Programació ESP32 per funcionar com a BLE iBeacon
ESP32 és realment un potent dispositiu IoT amb compatibilitat integrada per a Bluetooth i WiFi. L'ESP32 és la versió avançada del seu predecessor ESP8266 amb funcions addicionals com RAM, ROM, pins GPIO, etc. L'opció es pot utilitzar per a aplicacions optimitzades per bateries, com ara balises Bluetooth, bandes de condicionament físic, proximitat, etc. També és possible utilitzar ESP32 com a Bluetooth en sèrie com els mòduls HC-05 o HC-06 per a projectes senzills de microcontroladors.
Com sabem, el BLE pot funcionar en dos modes diferents: el mode servidor i el mode client. Ambdós modes s’han comentat en els nostres anteriors tutorials ESP32:
- Servidor ESP32 BLE: servei GATT per a la indicació del nivell de bateria
- Client ESP32 BLE: connectar-se a una banda de fitness per activar una bombeta
En aquest tutorial crearem un iBeacon BLE mitjançant ESP32 on ESP32 actuarà com a servidor i el telèfon intel·ligent actuarà com a client. Suposo que ja esteu familiaritzats amb la manera d’utilitzar la placa ESP32 amb Arduino IDE, si no, torneu al principi d’inici amb el tutorial ESP32.
També podeu obtenir més informació sobre què és la tecnologia Beacon / iBeacon mitjançant els nostres anteriors projectes Bluetooth iBeacon mitjançant Raspberry Pi i HM-10 BLE iBeacon.
Components necessaris
Maquinari:
- Junta de desenvolupament ESP32
- Cable micro USB
Programari:
- IDE Arduino
- Aplicació per a Android: nRF Connect per a mòbils (per Nordic Semiconductor)
Hi ha moltes aplicacions d’escàner BLE, una d’elles que hem utilitzat en el nostre projecte anterior de Com utilitzar el mòdul BLE HM-10 amb Arduino. Aquesta aplicació d’escàner BLE proporciona una bona interfície gràfica (GUI) però no té informació addicional, de manera que en aquest projecte estem utilitzant l’aplicació NRF Connect for Mobile.
Ús de l’aplicació Android nRF Connect per a ESP32 iBeacon
1. Baixeu l'aplicació nRF Connect de Google Play Store i obriu-la.
![]()
2. La pantalla es veu a continuació. Les opcions útils per a aquest projecte seran "Escaneja", "Escàner" i "Informació" quan es trobin dispositius.
L' opció "Escanejar" s'utilitzarà per veure tots els iBeacons disponibles. Per començar a cercar l'iBeacon, tireu cap avall de la pantalla o aneu a l'opció "Escaneja" a l'extrem superior dret de la pantalla. Això començarà a cercar els iBeacons disponibles.
![]()
3. Després de buscar a l’iBeacon, podreu veure els RSSI, UUID, Major i Minor d’iBeacon. El RSSI canviarà si us traieu el mòbil o l'iBeacon. Aquí, en aquesta pantalla, el RSSI és (-37). A part d’això, hi ha alguns detalls com ara el nom de l’empresa fictícia, el tipus de dispositiu, la longitud dels bytes i el nom local de l’ESP32. Aquí es troba “ ESP32 com a iBeacon ”. Podeu canviar el nom local a l'esbós.
![]()
4. Després de treure el telèfon intel·ligent a iBeacon, el valor RSSI canvia de -37 a -58. Aquests valors continuaran canviant si moveu un dels dispositius.
![]()
Els valors acceptables del senyal RSSI són els següents:
| Força del senyal | TL; DR | Obligatori per | |
|---|---|---|---|
| -30 dBm | Increïble | Intensitat màxima del senyal assolible. El client només pot estar a pocs metres de l’AP per aconseguir-ho. No és típic ni desitjable en el món real. | N / A |
| -67 dBm | Molt bé | Intensitat mínima del senyal per a aplicacions que requereixen un lliurament de paquets de dades molt fiable i oportú. | VoIP / VoWiFi, transmissió de vídeo |
| -70 dBm | Bé | Potència mínima del senyal per a un lliurament fiable de paquets. | Correu electrònic, web |
| -80 dBm | No és bó | Intensitat mínima del senyal per a la connectivitat bàsica. El lliurament de paquets pot no ser fiable. | N / A |
| -90 dBm | Inutilitzable | Aproximació o ofegament al terra de soroll. Qualsevol funcionalitat és molt poc probable. | N / A |
Programació ESP32 per funcionar com a BLE iBeacon
Hi ha un programa d'exemple d'ESP32 BLE iBeacon disponible quan instal·leu la placa ESP32 a Arduino IDE. Però hem esbossat lleugerament aquest esbós en aquest tutorial, la versió completa editada del programa de mostra es dóna al final d’aquest tutorial.
Per obrir el programa de mostra d'ESP32 BLE_iBeacon, seguiu els passos següents.
- Obriu Arduino IDE i seleccioneu "ESP32 Dev Module". (Si no trobeu aquest tauler, comproveu si heu instal·lat el paquet ESP32 Board)
- Aneu a Fitxer > Exemples > ESP32 BLE Arduino > BLE_iBeacon
- Obriu l’esbós “BLE_iBeacon”.
Ara hi ha una lleugera modificació en el codi que es fa en aquest tutorial. El nom ESP32 també s'actualitzarà en aquest esbós. Comenceu, doncs, amb la inclusió de les biblioteques necessàries que s’utilitzaran a Creació de servidor BLE i iBeacon.
#include "sys / time.h"
Es tracta d’una biblioteca de temps per obtenir l’hora actual del sistema. Conté funcions com tv_sec, gettimeofday (), etc. Per obtenir més informació, podeu visitar la versió oficial de UNIX de ' sys / time.h'.
A continuació, s’inclouen les biblioteques ESP32 BLE que contenen moltes funcions que s’utilitzen per crear ESP32 en diferents configuracions, com ara Client BLE o Servidor BLE.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
La biblioteca s'inclou IBeacon que estableix l'ESP32 com IBeacon. Juntament amb això, s’inclou la biblioteca de son profund per a ESP32. La biblioteca s'utilitzarà per enviar ESP32 en mode de son profund durant un període de temps definit.
#include "BLEBeacon.h" #include "esp_sleep.h"
Definiu la durada del son per a ESP32. Aquí, l'ESP32 estarà en son profund durant 10 segons i es publicitarà i tornarà a dormir profundament durant 10 segons.
#define GPIO_DEEP_SLEEP_DURATION 10
Aquí es defineix RTC_DATA_ATTR. Tingueu en compte que si definiu una variable global amb l'atribut RTC_DATA_ATTR, la variable es col·locarà a la memòria RTC_SLOW_MEM. Per tant, l’estructura declarada com a RTC_DATA_ATTR i la còpia de la memòria dinàmica a aquesta estructura abans d’un son profund ajuda a recuperar-la en memòria dinàmica després del despertar. En paraules simples, estalviem temps a la memòria estàtica de la memòria dinàmica per recuperar-la de nou després d’un somni profund. Aquí es defineixen les dues variables. El " darrer " s'utilitza per obtenir l'última vegada que l'ESP32 va dormir profundament i s'utilitza el compte d' arrencada .
RTC_DATA_ATTR temps estàtic_t darrer; RTC_DATA_ATTR static uint32_t nombre d'arrencades;
A continuació, definiu el tipus de publicitat BLE. La definició es fa de la següent manera.
BLEAdvertising * pPublicitat;
La temporalitat es defineix com a estructura per accedir a l’hora actual.
struct timeval ara;
També es defineix la UUID. Els UUID es poden generar des d’aquest enllaç .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Ara creeu una funció que contindrà atributs d'iBeacon com UUID, Major, Minor, etc. En aquesta funció, creeu una instància per a BLE com a iBeacon i configureu un identificador de fabricant fals, UUID, major i menor per a ESP32 com a iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Establiu el senyalador com a 0x04 de manera que sortirà BrEdrNotSupported a l'escàner.
oData.setFlags (0x04);
Definiu les dades publicitàries per publicar.
std:: string strServiceData = "";
Afegiu la cadena una rere l’altra per anunciar-vos.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Escriviu strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Comenceu la publicitat publicant dades.
pPublicitat-> setData (oData); pPublicitat-> setScanResponseData (oScanResponseData);
Comenceu el monitor sèrie a una velocitat de 115200 baud i obteniu el temps. Incrementeu també el compte d’ arrencada per emmagatzemar el nombre de restabliments.
Serial.begin (115200); gettimeofday (& ara, NULL); Serial.printf ("iniciar ESP32% d \ n", bootcount ++);
Emmagatzemeu l'hora actual a la memòria estàtica.
last = now.tv_sec;
Creeu un dispositiu BLE i anomeneu-lo com vulgueu. Aquí l’ESP32 s’anomena “ ESP2 com a iBeacon ”. Tingueu en compte que els noms poden ser llargs, però aquesta versió del codi ha iniciat la compatibilitat amb noms llargs.
BLEDevice:: init ("ESP32 com a iBeacon");
Creeu un servidor BLE per anunciar-vos i començar.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
A continuació, configureu l'ESP32 en mode iBeacon.
setBeacon ();
Comenceu a anunciar-vos i deixeu de publicitar-vos i dormiu profundament durant 10 segons.
pPublicitat-> start (); pPublicitat-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Finalment, connecteu la placa de desenvolupament ESP32 amb el vostre ordinador portàtil mitjançant un cable Micro USB i pengeu el codi a ESP32 mitjançant Arduino IDE. A continuació, obriu l' aplicació Android nRF Connect al telèfon intel·ligent i comenceu a escanejar. Trobareu ESP32 com a emissió iBeacon tal com es mostra a la imatge següent:
![]()
Així es pot utilitzar ESP32 com a BLE Beacon per anunciar UUID, Major i Minor. Si voleu obtenir més informació sobre iBeacon, seguiu el nostre tutorial anterior sobre HM10 com a iBeacon. A més, si teniu cap dubte, comenteu-ho a continuació o feu preguntes als fòrums.
A continuació es mostra el codi complet amb un vídeo de treball.
/>