From 9f4ce708b16c3e38f4822dbbff79fb676560e17e Mon Sep 17 00:00:00 2001 From: DTTerastar Date: Mon, 29 Mar 2021 18:12:59 -0400 Subject: [PATCH] Set initial distance from previous item with same id --- lib/BleFingerprint/BleFingerprint.cpp | 80 ++++++++++++++------------- lib/BleFingerprint/BleFingerprint.h | 12 ++-- src/main.cpp | 22 +++++--- 3 files changed, 64 insertions(+), 50 deletions(-) diff --git a/lib/BleFingerprint/BleFingerprint.cpp b/lib/BleFingerprint/BleFingerprint.cpp index 90e03f0..3fb815d 100644 --- a/lib/BleFingerprint/BleFingerprint.cpp +++ b/lib/BleFingerprint/BleFingerprint.cpp @@ -38,16 +38,19 @@ static String getProximityUUIDString(BLEBeacon beacon) return returnedString; } -BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float initalDistance) +BleFingerprint::~BleFingerprint() +{ + Serial.printf("Del | MAC: %s, ID: %s\n", SMacf(address).c_str(), id.c_str()); +} + +BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice) { firstSeen = time(nullptr); address = advertisedDevice->getAddress(); - auto nativeAddress = address.getNative(); - String mac_address = Sprintf("%02x%02x%02x%02x%02x%02x", nativeAddress[5], nativeAddress[4], nativeAddress[3], nativeAddress[2], nativeAddress[1], nativeAddress[0]); + String mac_address = SMacf(address); - Serial.print("New | MAC: "); - Serial.print(mac_address); + Serial.printf("New | MAC: %s", mac_address.c_str()); if (advertisedDevice->haveName()) name = String(advertisedDevice->getName().c_str()); @@ -60,13 +63,13 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float init { id = "tile:" + mac_address; Serial.printf(", ID: %s", id.c_str()); - setCalRssi(advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0); + calRssi = advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0; } else if (advertisedDevice->haveServiceUUID() && advertisedDevice->getServiceDataUUID().equals(BLEUUID(exposureUUID)) == true) { // found covid exposure tracker id = "exp:" + String(strServiceData.length()); Serial.printf(", ID: %s", id.c_str()); - setCalRssi(advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0); + calRssi = advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0; //char *sdHex = NimBLEUtils::buildHexData(nullptr, (uint8_t *)strServiceData.data(), strServiceData.length()); //doc["tek"] = String(sdHex).substring(4, 20); @@ -75,16 +78,15 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float init else if (advertisedDevice->haveServiceUUID() && advertisedDevice->getServiceDataUUID().equals(BLEUUID(beaconUUID)) == true) { // found Eddystone UUID Serial.print(", Eddystone"); - // Update distance v ariable for Eddystone BLE devices if (cServiceData[0] == 0x10) { BLEEddystoneURL oBeacon = BLEEddystoneURL(); oBeacon.setData(strServiceData); // Serial.printf("Eddystone Frame Type (Eddystone-URL) "); - // Serial.printf(oBeacon.getDecodedURL().c_str()); + url = String(oBeacon.getDecodedURL().c_str()); Serial.print(" URL: "); - Serial.print(oBeacon.getDecodedURL().c_str()); - setCalRssi(oBeacon.getPower()); + Serial.print(url.c_str()); + calRssi = oBeacon.getPower(); } else if (cServiceData[0] == 0x20) { @@ -126,7 +128,7 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float init id = "iBeacon:" + proximityUUID + "-" + String(major) + "-" + String(minor); Serial.printf(", ID: %s", id.c_str()); - setCalRssi(oBeacon.getSignalPower()); + calRssi = oBeacon.getSignalPower(); } else { @@ -137,7 +139,7 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float init id = fingerprint; Serial.printf(", ID: %s", id.c_str()); - setCalRssi(advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0); + calRssi = advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0; } } else @@ -151,13 +153,13 @@ BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float init Serial.printf(", ID: %s", id.c_str()); } - setCalRssi(advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0); + calRssi = advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0; } free(mdHex); } else { - setCalRssi(advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0); + calRssi = (advertisedDevice->haveTXPower() ? (-advertisedDevice->getTXPower()) - 41 : 0); } } Serial.println(); @@ -172,9 +174,12 @@ void BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice) calRssi = defaultTxPower; float ratio = (calRssi - rssi) / 35.0f; - float distFl = pow(10, ratio); - raw = distFl; + raw = pow(10, ratio); + setDistance(raw); +} +void BleFingerprint::setDistance(float distFl) +{ Reading inter1, inter2; if (tsFilter.push(&distFl, &inter1)) @@ -186,7 +191,12 @@ void BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice) } } -bool BleFingerprint::shouldReport() +float BleFingerprint::getDistance() +{ + return output.value.position; +} + +bool BleFingerprint::report(JsonDocument *doc) { if (id == nullptr && name == nullptr) return false; @@ -194,40 +204,36 @@ bool BleFingerprint::shouldReport() if (!hasValue) return false; - return true; -} - -StaticJsonDocument<512> BleFingerprint::report() -{ - StaticJsonDocument<512> doc; + String mac = SMacf(address); if (output.value.position < 0.5) { if (!enroll) { - Serial.printf("Enter | %-50s %lu %5.1f %5.1f %5.1f\n", id.c_str(), output.timestamp, output.value.position, output.value.speed * 1e6, output.value.acceleration * 1e12); + 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); enroll = true; } } else if (enroll && output.value.position > 1.5) { - Serial.printf("Left | %-50s %lu %5.1f %5.1f %5.1f\n", id.c_str(), output.timestamp, output.value.position, output.value.speed * 1e6, output.value.acceleration * 1e12); + 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); enroll = false; } if (id != nullptr) - doc[F("id")] = id; + (*doc)[F("id")] = id; if (name != nullptr) - doc[F("name")] = name; + (*doc)[F("name")] = name; - doc[F("rssi@1m")] = calRssi; - doc[F("rssi")] = rssi; + (*doc)[F("rssi@1m")] = calRssi; + (*doc)[F("rssi")] = rssi; - doc[F("mac")] = SMacf(address); - doc[F("raw")] = round(raw * 100.0f) / 100.0f; - doc[F("distance")] = round(output.value.position * 100.0f) / 100.0f; - doc[F("speed")] = round(output.value.speed * 1e7f) / 10.0f; + (*doc)[F("mac")] = mac; + (*doc)[F("raw")] = round(raw * 100.0f) / 100.0f; + (*doc)[F("distance")] = round(output.value.position * 100.0f) / 100.0f; + (*doc)[F("speed")] = round(output.value.speed * 1e7f) / 10.0f; - doc[F("first")] = SDateTimef(firstSeen); - doc[F("last")] = SDateTimef(lastSeen); - return doc; + (*doc)[F("first")] = SDateTimef(firstSeen); + (*doc)[F("last")] = SDateTimef(lastSeen); + + return true; } diff --git a/lib/BleFingerprint/BleFingerprint.h b/lib/BleFingerprint/BleFingerprint.h index c44fb9e..4c67abf 100644 --- a/lib/BleFingerprint/BleFingerprint.h +++ b/lib/BleFingerprint/BleFingerprint.h @@ -13,15 +13,19 @@ class BleFingerprint { public: - BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float initalDistance); + BleFingerprint(BLEAdvertisedDevice *advertisedDevice); + ~BleFingerprint(); void seen(BLEAdvertisedDevice *advertisedDevice); - bool shouldReport(); - StaticJsonDocument<512> report(); + bool report(JsonDocument *doc); - void setCalRssi(int rssi) { calRssi = rssi; } + String getId() { return id; } + + float getDistance(); + void setDistance(float distFl); NimBLEAddress getAddress() { return address; } + void setAddress(NimBLEAddress newAddr) { address = newAddr; } private: bool hasValue = false, enroll = false; diff --git a/src/main.cpp b/src/main.cpp index ca00912..56e089b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,21 +79,26 @@ BleFingerprint *getFingerprint(BLEAdvertisedDevice *advertisedDevice) { auto mac = advertisedDevice->getAddress(); - auto is_even = [mac](BleFingerprint *f) { return f->getAddress() == mac; }; - - auto it = std::find_if(fingerprints.begin(), fingerprints.end(), is_even); + auto it = std::find_if(fingerprints.begin(), fingerprints.end(), [mac](BleFingerprint *f) { return f->getAddress() == mac; }); if (it != fingerprints.end()) { return *it; } - if (fingerprints.size() > MAX_MAC_ADDRESSES) + if (fingerprints.size() >= MAX_MAC_ADDRESSES) { delete fingerprints.back(); fingerprints.pop_back(); } - auto created = new BleFingerprint(advertisedDevice, MAX_DISTANCE); + auto created = new BleFingerprint(advertisedDevice); + auto it2 = std::find_if(fingerprints.begin(), fingerprints.end(), [created](BleFingerprint *f) { return f->getId() == created->getId(); }); + if (it2 != fingerprints.end()) + { + auto found = *it2; + created->setDistance(found->getDistance()); + } + fingerprints.push_front(created); return created; } @@ -257,7 +262,6 @@ void reconnect(TimerHandle_t xTimer) { retryAttempts++; } - if (!WiFi.isConnected()) if (!WiFiSettings.connect(true, 60)) ESP.restart(); @@ -292,11 +296,11 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks bool reportDevice(BLEAdvertisedDevice advertisedDevice) { BleFingerprint *f = getFingerprint(&advertisedDevice); + StaticJsonDocument<512> doc; - if (!f->shouldReport()) + if (!f->report(&doc)) return false; - auto doc = f->report(); char JSONmessageBuffer[512]; serializeJson(doc, JSONmessageBuffer); String id = doc["id"]; @@ -439,7 +443,7 @@ void firmwareUpdate(void) { #ifdef VERSION static long lastFirmwareCheck; - if (millis() - lastFirmwareCheck < CHECK_FOR_UPDATES_MILI || WiFi.status() != WL_CONNECTED) + if (millis() - lastFirmwareCheck < CHECK_FOR_UPDATES_MILI) return; lastFirmwareCheck = millis();