From 4a89e338de36cc22f630d38af5e72c4abd83159c Mon Sep 17 00:00:00 2001
From: DTTerastar
Date: Mon, 29 Mar 2021 21:56:23 -0400
Subject: [PATCH] Major refactor, continous scanning
---
lib/BleFingerprint/BleFingerprint.cpp | 8 +-
src/main.cpp | 112 +++++++++++++-------------
2 files changed, 62 insertions(+), 58 deletions(-)
diff --git a/lib/BleFingerprint/BleFingerprint.cpp b/lib/BleFingerprint/BleFingerprint.cpp
index 3fb815d..390ea46 100644
--- a/lib/BleFingerprint/BleFingerprint.cpp
+++ b/lib/BleFingerprint/BleFingerprint.cpp
@@ -40,7 +40,7 @@ static String getProximityUUIDString(BLEBeacon beacon)
BleFingerprint::~BleFingerprint()
{
- Serial.printf("Del | MAC: %s, ID: %s\n", SMacf(address).c_str(), id.c_str());
+ Serial.printf("%d Del | MAC: %s, ID: %s\n", xPortGetCoreID(), SMacf(address).c_str(), id.c_str());
}
BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice)
@@ -50,7 +50,7 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice)
String mac_address = SMacf(address);
- Serial.printf("New | MAC: %s", mac_address.c_str());
+ Serial.printf("%d New | MAC: %s", xPortGetCoreID(), mac_address.c_str());
if (advertisedDevice->haveName())
name = String(advertisedDevice->getName().c_str());
@@ -209,13 +209,13 @@ bool BleFingerprint::report(JsonDocument *doc)
{
if (!enroll)
{
- Serial.printf("Enter | MAC: %s, ID: %-50s %lu %5.1f %5.1f %5.1f\n", mac.c_str(), id.c_str(), output.timestamp, output.value.position, output.value.speed * 1e6, output.value.acceleration * 1e12);
+ Serial.printf("%d Enter | MAC: %s, ID: %-50s %lu %5.1f %5.1f %5.1f\n", xPortGetCoreID(), mac.c_str(), id.c_str(), output.timestamp, output.value.position, output.value.speed * 1e6, output.value.acceleration * 1e12);
enroll = true;
}
}
else if (enroll && output.value.position > 1.5)
{
- Serial.printf("Left | MAC: %s, ID: %-50s %lu %5.1f %5.1f %5.1f\n", mac.c_str(), id.c_str(), output.timestamp, output.value.position, output.value.speed * 1e6, output.value.acceleration * 1e12);
+ Serial.printf("%d Left | MAC: %s, ID: %-50s %lu %5.1f %5.1f %5.1f\n", xPortGetCoreID(), mac.c_str(), id.c_str(), output.timestamp, output.value.position, output.value.speed * 1e6, output.value.acceleration * 1e12);
enroll = false;
}
diff --git a/src/main.cpp b/src/main.cpp
index 7f98249..56897d0 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -42,6 +42,8 @@ extern "C"
#include "NimBLEEddystoneTLM.h"
#include "NimBLEBeacon.h"
+#include
+
#include "Settings.h"
#include "BleFingerprint.h"
@@ -55,16 +57,16 @@ extern "C"
#endif
#define MAX_MAC_ADDRESSES 50
-#define CHECK_FOR_UPDATES_INTERVAL 5 * 60
+#define CHECK_FOR_UPDATES_INTERVAL 300
-WiFiClient espClient;
AsyncMqttClient mqttClient;
TimerHandle_t reconnectTimer;
+TaskHandle_t scannerTask;
+
bool updateInProgress = false;
String localIp;
-byte retryAttempts = 0;
-BLEScan *pBLEScan;
-TaskHandle_t thBLEScan;
+int retryAttempts = 0;
+int sendFailures = 0;
String mqttHost;
int mqttPort;
@@ -137,9 +139,9 @@ unsigned long CalculateUptimeSeconds(void)
return (0xFFFFFFFF / 1000) * _rolloverCount + (_lastMillis / 1000);
}
-bool sendTelemetry(int deviceCount = -1, int reportCount = -1)
+bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts = -1)
{
- StaticJsonDocument<256> tele;
+ StaticJsonDocument<512> tele;
tele["room"] = room;
tele["ip"] = localIp;
tele["hostname"] = WiFi.getHostname();
@@ -148,21 +150,25 @@ bool sendTelemetry(int deviceCount = -1, int reportCount = -1)
tele["uptime"] = CalculateUptimeSeconds();
tele["firm"] = String(FIRMWARE);
- tele["free_heap"] = ESP.getFreeHeap();
- tele["min_free_heap"] = ESP.getMinFreeHeap();
- tele["heap_size"] = ESP.getHeapSize();
- tele["max_alloc_heap"] = ESP.getMaxAllocHeap();
#ifdef VERSION
tele["ver"] = String(VERSION);
#endif
- if (deviceCount > -1)
- tele["disc_ct"] = deviceCount;
+ if (totalSeen > 0)
+ tele["seen"] = totalSeen;
+ if (totalReported > 0)
+ tele["reported"] = totalReported;
+ if (totalAdverts > 0)
+ tele["adverts"] = totalAdverts;
+ if (sendFailures > 0)
+ tele["sendFails"] = sendFailures;
- if (reportCount > -1)
- tele["rept_ct"] = reportCount;
+ tele["free_heap"] = ESP.getFreeHeap();
+ tele["min_free_heap"] = ESP.getMinFreeHeap();
+ tele["heap_size"] = ESP.getHeapSize();
+ tele["max_alloc_heap"] = ESP.getMaxAllocHeap();
- char teleMessageBuffer[258];
+ char teleMessageBuffer[512];
serializeJson(tele, teleMessageBuffer);
if (mqttClient.publish((TELEMETRY_TOPIC).c_str(), 0, 0, teleMessageBuffer) == true)
@@ -171,6 +177,7 @@ bool sendTelemetry(int deviceCount = -1, int reportCount = -1)
}
else
{
+ sendFailures++;
log_e("Error sending telemetry");
return false;
}
@@ -284,18 +291,27 @@ void connectToMqtt()
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
+public:
+ int getTotalAdverts() { return totalSeen; }
+ std::set getSeen() { return seen; }
+
+private:
+ int totalSeen = 0;
+ std::set seen;
+
void onResult(BLEAdvertisedDevice *advertisedDevice)
{
+ totalSeen++;
digitalWrite(LED_BUILTIN, LED_BUILTIN_ON);
BleFingerprint *f = getFingerprint(advertisedDevice);
f->seen(advertisedDevice);
+ seen.insert(f);
digitalWrite(LED_BUILTIN, !LED_BUILTIN_ON);
}
};
-bool reportDevice(BLEAdvertisedDevice advertisedDevice)
+bool reportDevice(BleFingerprint *f)
{
- BleFingerprint *f = getFingerprint(&advertisedDevice);
StaticJsonDocument<512> doc;
if (!f->report(&doc))
@@ -320,6 +336,7 @@ bool reportDevice(BLEAdvertisedDevice advertisedDevice)
}
else
{
+ sendFailures++;
Serial.print("Error sending message: ");
Serial.println(publishTopic);
Serial.print("Message: ");
@@ -338,49 +355,37 @@ bool reportDevice(BLEAdvertisedDevice advertisedDevice)
void scanForDevices(void *parameter)
{
+ auto scan = MyAdvertisedDeviceCallbacks();
BLEDevice::init("");
- pBLEScan = BLEDevice::getScan(); //create new scan
- pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(), true);
- pBLEScan->setActiveScan(BLE_ACTIVE_SCAN);
+ auto pBLEScan = BLEDevice::getScan();
pBLEScan->setInterval(BLE_SCAN_INTERVAL);
pBLEScan->setWindow(BLE_SCAN_WINDOW);
+ pBLEScan->setAdvertisedDeviceCallbacks(&scan, true);
+ pBLEScan->setActiveScan(BLE_ACTIVE_SCAN);
+ pBLEScan->setMaxResults(0);
+ if (!pBLEScan->start(0, nullptr, false))
+ log_e("Error starting continuous ble scan");
- int i = 0;
while (1)
{
- delay(0);
- if (updateInProgress)
+ delay(1000);
+
+ if (updateInProgress || !mqttClient.connected())
continue;
- if (mqttClient.connected())
+ auto results = scan;
+ pBLEScan->setAdvertisedDeviceCallbacks(&(scan = MyAdvertisedDeviceCallbacks()), true);
+
+ int totalSeen = 0;
+ int totalReported = 0;
+ auto seen = results.getSeen();
+ for (auto it = seen.begin(); it != seen.end(); ++it)
{
- pBLEScan->setActiveScan(i++ % 10 == 0 ? BLE_ACTIVE_SCAN : false);
- pBLEScan->clearResults();
- BLEScanResults foundDevices = pBLEScan->start(BLE_SCAN_DURATION);
- int devicesCount = foundDevices.getCount();
-
-#ifdef M5STICK
- M5.Lcd.setCursor(0, 0);
- M5.Lcd.fillScreen(TFT_BLACK);
-
-#endif
-
- int devicesReported = 0;
- for (uint32_t j = 0; j < devicesCount; j++)
- {
- bool included = reportDevice(foundDevices.getDevice(j));
- if (included)
- {
- devicesReported++;
- }
- }
- sendTelemetry(devicesCount, devicesReported);
- }
- else
- {
- log_e("Cannot report; mqtt disconnected");
- delay(1000);
+ totalSeen++;
+ if (reportDevice(*it))
+ totalReported++;
}
+ sendTelemetry(totalSeen, totalReported, results.getTotalAdverts());
}
}
@@ -389,7 +394,6 @@ void configureOTA()
ArduinoOTA
.onStart([]() {
Serial.println("OTA Start");
- pBLEScan->stop();
updateInProgress = true;
mqttClient.disconnect(true);
})
@@ -442,7 +446,7 @@ void setClock()
void firmwareUpdate()
{
#ifdef VERSION
- static long lastFirmwareCheck;
+ static long lastFirmwareCheck = 0;
long uptime = CalculateUptimeSeconds();
if (uptime - lastFirmwareCheck < CHECK_FOR_UPDATES_INTERVAL)
return;
@@ -543,7 +547,7 @@ void setup()
connectToWifi();
setClock();
connectToMqtt();
- xTaskCreatePinnedToCore(scanForDevices, "BLE Scan", 4096, pBLEScan, 1, &thBLEScan, 1);
+ xTaskCreatePinnedToCore(scanForDevices, "BLE Scan", 4096, nullptr, 1, &scannerTask, 1);
#ifdef M5STICK
M5.begin();