From b833b4084557cadc78a4163eaa2ef1cb324d54ba Mon Sep 17 00:00:00 2001 From: Roman Bazalevsky Date: Thu, 5 Nov 2020 12:36:52 +0300 Subject: [PATCH] ESP32 BLE beacons scan improvements: - Scan memory cleanup. - Device name (if broadcasted) handling (including MQTT messages and Web interface). - Implicit device state in MQTT messages. - Removed UUID/MAJOR/MINOR fields (always zeroes) in MQTT messages for MAC-identified beacons. --- tasmota/xsns_52_ibeacon.ino | 115 ++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 18 deletions(-) diff --git a/tasmota/xsns_52_ibeacon.ino b/tasmota/xsns_52_ibeacon.ino index 4ac971ede..9f31dc6c1 100755 --- a/tasmota/xsns_52_ibeacon.ino +++ b/tasmota/xsns_52_ibeacon.ino @@ -46,19 +46,10 @@ struct { union { struct { uint32_t init:1; - uint32_t autoScan:1; - uint32_t canScan:1; uint32_t runningScan:1; - uint32_t shallClearResults:1; // BLE scan results - uint32_t firstAutodiscoveryDone:1; - uint32_t activeBeacon; }; uint32_t all = 0; } mode; - struct { - uint8_t sensor; // points to to the number 0...255 - uint8_t beaconScanCounter; // countdown timer in seconds - } state; } ESP32BLE; #include @@ -111,6 +102,9 @@ struct IBEACON { char PWR[2]; char MAC[12]; char RSSI[4]; +#ifdef USE_IBEACON_ESP32 + char NAME[16]; +#endif }; #ifdef USE_IBEACON_ESP32 @@ -129,6 +123,7 @@ struct IBEACON_UID { uint8_t TIME; #ifdef USE_IBEACON_ESP32 uint8_t REPTIME; + char NAME[16]; #endif } ibeacons[MAX_IBEACONS]; @@ -192,7 +187,8 @@ class ESP32BLEScanCallback : public BLEAdvertisedDeviceCallbacks uint8_t PWR = oBeacon.getSignalPower(); - AddLog_P2(LOG_LEVEL_DEBUG, PSTR("MAC: %s Major: %d Minor: %d UUID: %s Power: %d RSSI: %d"), + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("%s: MAC: %s Major: %d Minor: %d UUID: %s Power: %d RSSI: %d"), + "BLE", advertisedDevice->getAddress().toString().c_str(), Major, Minor, oBeacon.getProximityUUID().toString().c_str(), @@ -204,9 +200,10 @@ class ESP32BLEScanCallback : public BLEAdvertisedDeviceCallbacks DumpHex((const unsigned char*)&PWR,1,ib.PWR); DumpHex((const unsigned char*)&MAC,6,ib.MAC); memcpy(ib.RSSI,sRSSI,4); + memset(ib.NAME,0x0,16); if (ibeacon_add(&ib)==2) { - ibeacon_mqtt(ib.MAC,ib.RSSI,ib.UID,ib.MAJOR,ib.MINOR); + ibeacon_mqtt(ib.MAC,ib.RSSI,ib.UID,ib.MAJOR,ib.MINOR,ib.NAME); } } else { @@ -218,8 +215,14 @@ class ESP32BLEScanCallback : public BLEAdvertisedDeviceCallbacks DumpHex((const unsigned char*)&MAC,6,ib.MAC); memcpy(ib.RSSI,sRSSI,4); + if (advertisedDevice->haveName()) { + strncpy(ib.NAME,advertisedDevice->getName().c_str(),16); + } else { + memset(ib.NAME,0x0,16); + } + if (ibeacon_add(&ib)==2) { - ibeacon_mqtt(ib.MAC,ib.RSSI,ib.UID,ib.MAJOR,ib.MINOR); + ibeacon_mqtt(ib.MAC,ib.RSSI,ib.UID,ib.MAJOR,ib.MINOR,ib.NAME); } } } @@ -236,7 +239,7 @@ void ESP32StartScanTask(){ 0, /* Priority of the task */ NULL, /* Task handle. */ 0); /* Core where the task should run */ - AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Start scanning"),"IBEACON_ESP32"); + AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Start scanning"),"BLE"); } void ESP32scanEndedCB(NimBLEScanResults results); @@ -249,14 +252,30 @@ void ESP32ScanTask(void *pvParameters){ ESP32BLEScan->setActiveScan(false); ESP32BLEScan->setDuplicateFilter(false); + ESP32BLEScan->start(0, ESP32scanEndedCB, false); + for (;;) { - ESP32BLEScan->start(0, ESP32scanEndedCB, false); + vTaskDelay(10000/ portTICK_PERIOD_MS); + ESP32BLEScan->clearResults(); + AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Clear scanning results"),"BLE"); } } void ESP32scanEndedCB(NimBLEScanResults results) { ESP32BLE.mode.runningScan = 0; + AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Stop scanning"),"BLE"); +} + +void ESP32StopScanTask() { + ESP32BLEScan->stop(); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("%s: Pausing scanner task"),"BLE"); +} + +void ESP32ResumeScanTask() { + ESP32BLE.mode.runningScan = 1; + ESP32BLEScan->start(0, ESP32scanEndedCB, false); + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("%s: Resumed scanner task"),"BLE"); } #endif @@ -269,7 +288,6 @@ void IBEACON_Init() { if (!ESP32BLE.mode.init) { NimBLEDevice::init(""); - ESP32BLE.mode.canScan = 1; ESP32BLE.mode.init = 1; ESP32StartScanTask(); // Let's get started !! @@ -304,13 +322,26 @@ void IBEACON_Init() { #ifdef USE_IBEACON_ESP32 void esp32_every_second(void) { + + if (TasmotaGlobal.ota_state_flag) { + if (ESP32BLE.mode.runningScan) { + AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Upgrade procedure started"),"BLE"); + ESP32StopScanTask(); + } + } else { + if (!ESP32BLE.mode.runningScan) { + AddLog_P2(LOG_LEVEL_DEBUG,PSTR("%s: Resuming scan"),"BLE"); + ESP32ResumeScanTask(); + } + } + for (uint32_t cnt=0;cntIB_TIMEOUT_TIME) { ibeacons[cnt].FLAGS=0; - ibeacon_mqtt(ibeacons[cnt].MAC,"0000",ibeacons[cnt].UID,ibeacons[cnt].MAJOR,ibeacons[cnt].MINOR); + ibeacon_mqtt(ibeacons[cnt].MAC,"0000",ibeacons[cnt].UID,ibeacons[cnt].MAJOR,ibeacons[cnt].MINOR,ibeacons[cnt].NAME); } } } @@ -453,6 +484,7 @@ uint32_t ibeacon_add(struct IBEACON *ib) { ibeacons[cnt].FLAGS=1; ibeacons[cnt].TIME=0; #ifdef USE_IBEACON_ESP32 + memcpy(ibeacons[cnt].NAME,ib->NAME,16); ibeacons[cnt].REPTIME = 0; #endif return 1; @@ -703,11 +735,17 @@ const char HTTP_IBEACON_mac[] PROGMEM = "{s}IBEACON-MAC : %s" " - RSSI : %s" "{m}{e}"; const char HTTP_IBEACON_uid[] PROGMEM = "{s}IBEACON-UID : %s" " - RSSI : %s" "{m}{e}"; - +#ifdef USE_IBEACON_ESP32 +const char HTTP_IBEACON_name[] PROGMEM = + "{s}IBEACON-NAME : %s (%s)" " - RSSI : %s" "{m}{e}"; +#endif void IBEACON_Show(void) { char mac[14]; char rssi[6]; char uid[34]; +#ifdef USE_IBEACON_ESP32 +char name[18]; +#endif for (uint32_t cnt=0;cnt