- Необходими компоненти
- Използване на приложението nRF Connect Android за ESP32 iBeacon
- Програмиране на ESP32 да работи като BLE iBeacon
ESP32 е наистина мощно IoT устройство с вградена поддръжка за Bluetooth и WiFi. ESP32 е усъвършенствана версия на своя предшественик ESP8266 с допълнителни функции като RAM, ROM, GPIO Pins и др. Модулът ESP32 поддържа както класически Bluetooth, така и Bluetooth Low Energy (BLE), класическият Bluetooth може да се използва за прехвърляне на песни или файлове и BLE опцията може да се използва за оптимизирани за батерия приложения като Bluetooth маяци, фитнес ленти, близост и др. Възможно е също така да се използва ESP32 като сериен Bluetooth като модулите HC-05 или HC-06 за прости проекти на микроконтролер.
Както знаем, BLE може да работи в два различни режима - сървър и клиент. И двата режима са обсъдени в предишните ни уроци за ESP32:
- ESP32 BLE сървър - GATT услуга за индикация за нивото на батерията
- ESP32 BLE клиент - Свързване към фитнес лента за задействане на крушка
В този урок ще изградим BLE iBeacon, използвайки ESP32, където ESP32 ще действа като сървър, а смартфонът ще действа като клиент. Предполагам, че вече сте запознати с това как да използвате платката ESP32 с Arduino IDE, ако не се върнете към началото на обучението с ESP32.
Можете също така да научите повече за това какво представлява технологията Beacon / iBeacon, като преминете през предишните ни проекти iBeacon за Bluetooth, използвайки Raspberry Pi и HM-10 BLE iBeacon.
Необходими компоненти
Хардуер:
- Съвет за разработка на ESP32
- Микро USB кабел
Софтуер:
- IDE на Arduino
- Приложение за Android: nRF Connect за мобилни устройства (от Nordic Semiconductor)
Има много приложения за BLE скенер, едно от тях сме използвали в предишния ни проект Как да използваме модула HM-10 BLE с Arduino. Това приложение за скенер BLE осигурява добър графичен интерфейс (GUI), но липсва допълнителна информация, така че в този проект използваме приложението NRF Connect for Mobile.
Използване на приложението nRF Connect Android за ESP32 iBeacon
1. Изтеглете приложението nRF Connect от Google Play Store и го отворете.
2. Екранът изглежда по-долу. Полезните опции за този проект ще бъдат „Сканиране“, „Скенер“ и „Информация“, когато устройствата бъдат намерени.
Опцията „Сканиране“ ще се използва, за да видите всички налични iBeacons. За да започнете да търсите iBeacon, или издърпайте екрана надолу, или отидете на опцията „Сканиране“ в горния десен ъгъл на екрана. Това ще започне да търси наличните iBeacons.
3. След търсене в iBeacon, ще можете да видите RSSI, UUID, Major и Minor на iBeacon. RSSI ще се промени, ако вземете мобилния телефон или iBeacon един от друг. Тук на този екран RSSI е (-37). Освен това има някои подробности като фиктивно име на фирма, тип устройство, дължина на байтовете, местно име на ESP32. Тук е „ ESP32 като iBeacon “. Можете да промените местното име в скицата.
4. След отнемане на смартфона от iBeacon, стойността на RSSI се променя от -37 на -58. Тези стойности ще се променят, ако преместите някое от устройствата.
Допустимите стойности на RSSI сигнала са както следва:
Сила на сигнала | TL; DR | Необходим за | |
---|---|---|---|
-30 dBm | Удивително | Максимално постижима сила на сигнала. Клиентът може да бъде само на няколко метра от AP, за да постигне това. Не е типично или желано в реалния свят. | Неприложимо |
-67 dBm | Много добре | Минимална сила на сигнала за приложения, които изискват много надеждна, навременна доставка на пакети данни. | VoIP / VoWiFi, стрийминг на видео |
-70 dBm | добре | Минимална сила на сигнала за надеждна доставка на пакети. | Имейл, уеб |
-80 dBm | Не е добре | Минимална сила на сигнала за основна свързаност. Доставката на пакети може да е ненадеждна. | Неприложимо |
-90 dBm | Неизползваем | Приближаване или удавяне в шумовия под. Всяка функционалност е много малко вероятно. | Неприложимо |
Програмиране на ESP32 да работи като BLE iBeacon
Налична е примерна програма на ESP32 BLE iBeacon, когато инсталирате ESP32 Board в Arduino IDE. Но ние леко сме редактирали тази скица в този урок, пълната редактирана версия на примерната програма е дадена в края на този урок.
За да отворите примерната програма на ESP32 BLE_iBeacon, просто следвайте стъпките по-долу.
- Отворете Arduino IDE и изберете „ESP32 Dev Module“. (Ако не намерите тази платка, моля, проверете дали сте инсталирали ESP32 Board Board)
- Отидете на Файл > Примери > ESP32 BLE Arduino > BLE_iBeacon
- Отворете скицата „BLE_iBeacon“.
Сега има малка модификация в кода, която е направена в този урок. Името на ESP32 също ще бъде актуализирано в тази скица. Затова започнете с включването на необходимите библиотеки, които ще се използват при създаването на BLE Server и iBeacon.
#include "sys / time.h"
Това е библиотека за време, за да получите текущото системно време. Това съдържа функции като tv_sec, gettimeofday () и др. За повече информация можете да посетите официалното издание на UNIX на ' sys / time.h'.
След това са включени ESP32 BLE библиотеките, които съдържат много функции, използвани за създаване на ESP32 в различни конфигурации като BLE клиент или BLE сървър.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
В библиотеката iBeacon е включена с който се определя като ESP32 iBeacon. Заедно с това, библиотеката за дълбок сън е включена за ESP32. Библиотеката ще се използва за изпращане на ESP32 в режим на дълбок сън за определен период от време.
#include "BLEBeacon.h" #include "esp_sleep.h"
Определете продължителността на съня за ESP32. Тук ESP32 ще бъде в дълбок сън за продължителност от 10 секунди и ще рекламира и след това отново ще премине в дълбок сън за 10 секунди.
#define GPIO_DEEP_SLEEP_DURATION 10
Тук е дефиниран RTC_DATA_ATTR. Имайте предвид, че ако дефинирате глобална променлива с атрибут RTC_DATA_ATTR, променливата ще бъде поставена в паметта RTC_SLOW_MEM. Така структурата, декларирана като RTC_DATA_ATTR, и копирането на динамичната памет в тази структура преди дълбок сън помага да се възстанови това в динамична памет след събуждане. С прости думи спестяваме времето в статична памет от динамична памет, за да го възстановим отново след дълбок сън. Тук са дефинирани двете променливи. В " последната " се използва, за да получите последния път, когато ESP32 отиде в дълбок сън и bootcount се използва преброяване брой нулира.
RTC_DATA_ATTR статично time_t последно; RTC_DATA_ATTR статичен брой зареждания uint32_t;
След това дефинирайте типа BLE Advertising. Определението се прави по следния начин.
BLEAdvertising * pРекламиране;
В timeval се определя като структура за достъп до текущото време.
struct timeval сега;
Също така се дефинира UUID. UUID могат да бъдат генерирани от тази връзка .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Сега създайте функция, която ще съдържа атрибути на iBeacon като UUID, Major, Minor и т.н. В тази функция създайте екземпляр за BLE като iBeacon и задайте фалшив идентификатор на производител, UUID, major и minor за ESP32 като iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((брой зареждане & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Задайте флага като 0x04, така че да извежда BrEdrNotSupported в скенера.
oData.setFlags (0x04);
Задайте рекламни данни за публикуване.
std:: string strServiceData = "";
Добавете низа един след друг, за да рекламирате.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Въведете strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Започнете рекламата, като публикувате данни.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Започнете серийния монитор със скорост от 115200 бода и вземете време. Също така увеличете броя на зарежданията, за да съхраните броя на нулиранията.
Serial.begin (115200); gettimeofday (& сега, NULL); Serial.printf ("стартиране на ESP32% d \ n", зареждане ++);
Съхранявайте текущото време в статичната памет.
последно = сега.tv_sec;
Създайте BLE устройство и го кръстете, както искате. Тук ESP32 е наречен „ ESP2 като iBeacon “. Имайте предвид, че имената могат да бъдат дълги, но тази версия на кода е стартирала поддръжката за дълги имена.
BLEDevice:: init ("ESP32 като iBeacon");
Създайте BLE сървър за реклама и стартиране.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
След това настройте ESP32 в режим iBeacon.
setBeacon ();
Започнете рекламата, след това спрете рекламата и отидете на дълбок сън за 10 секунди.
pРекламиране-> старт (); pРекламиране-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Накрая включете борда за разработка на ESP32 с вашия лаптоп с помощта на Micro USB кабел и качете кода в ESP32 с помощта на Arduino IDE. След това отворете приложението nRF Connect Android на вашия смартфон и започнете да сканирате. Ще намерите ESP32 като iBeacon излъчване, както е показано на снимката по-долу:
Ето как ESP32 може да се използва като BLE маяк за реклама на UUID, Major и Minor. Ако искате да научите повече за iBeacon, следвайте предишния ни урок за HM10 като iBeacon. Също така, ако имате някакви съмнения, коментирайте по-долу или задавайте въпроси във форуми.
Пълният код с работещо видео е даден по-долу.
/>