From e9b13889b1917b7569f3a406560fe80438307bec Mon Sep 17 00:00:00 2001 From: Darrell Date: Tue, 27 Dec 2022 18:05:56 -0500 Subject: [PATCH] Enable calibrating internal iBeacon ref rssi (#767) --- lib/BleFingerprint/BleFingerprint.cpp | 50 +++++++++---------- .../BleFingerprintCollection.cpp | 2 +- lib/BleFingerprint/BleFingerprintCollection.h | 3 +- src/Enrollment.cpp | 2 +- src/defaults.h | 3 +- src/main.cpp | 5 +- 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/lib/BleFingerprint/BleFingerprint.cpp b/lib/BleFingerprint/BleFingerprint.cpp index 6f14d28..f6e57bf 100644 --- a/lib/BleFingerprint/BleFingerprint.cpp +++ b/lib/BleFingerprint/BleFingerprint.cpp @@ -71,7 +71,7 @@ int BleFingerprint::get1mRssi() const if (calRssi != NO_RSSI) return calRssi; if (mdRssi != NO_RSSI) return mdRssi; if (asRssi != NO_RSSI) return asRssi; - return BleFingerprintCollection::refRssi + DEFAULT_TX; + return BleFingerprintCollection::rxRefRssi + DEFAULT_TX; } BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff) : oneEuro{OneEuroFilter(1, fcmin, beta, dcutoff)} @@ -202,7 +202,7 @@ void BleFingerprint::fingerprintServiceAdvertisements(NimBLEAdvertisedDevice *ad #endif if (uuid == roomAssistantService) { - asRssi = BleFingerprintCollection::refRssi + RM_ASST_TX; + asRssi = BleFingerprintCollection::rxRefRssi + RM_ASST_TX; if (!rmAsst) { rmAsst = true; @@ -217,56 +217,56 @@ void BleFingerprint::fingerprintServiceAdvertisements(NimBLEAdvertisedDevice *ad } else if (uuid == tileUUID) { - asRssi = BleFingerprintCollection::refRssi + TILE_TX; + asRssi = BleFingerprintCollection::rxRefRssi + TILE_TX; setId("tile:" + getMac(), ID_TYPE_TILE); return; } else if (uuid == sonosUUID) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("sonos:" + getMac(), ID_TYPE_SONOS); return; } else if (uuid == itagUUID) { - asRssi = BleFingerprintCollection::refRssi + (haveTxPower ? txPower : ITAG_TX); + asRssi = BleFingerprintCollection::rxRefRssi + (haveTxPower ? txPower : ITAG_TX); setId("itag:" + getMac(), ID_TYPE_ITAG); return; } else if (uuid == trackrUUID) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("trackr:" + getMac(), ID_TYPE_TRACKR); return; } else if (uuid == tractiveUUID) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("tractive:" + getMac(), ID_TYPE_TRACTIVE); return; } else if (uuid == vanmoofUUID) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("vanmoof:" + getMac(), ID_TYPE_VANMOOF); return; } else if (uuid == (meaterService)) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("meater:" + getMac(), ID_TYPE_MEATER); return; } else if (uuid == nutUUID) { - asRssi = BleFingerprintCollection::refRssi + (haveTxPower ? txPower : NUT_TX); + asRssi = BleFingerprintCollection::rxRefRssi + (haveTxPower ? txPower : NUT_TX); setId("nut:" + getMac(), ID_TYPE_NUT); return; } } String fingerprint = "ad:"; - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; for (int i = 0; i < serviceAdvCount; i++) { std::string sid = advertisedDevice->getServiceUUID(i).toString(); @@ -278,7 +278,7 @@ void BleFingerprint::fingerprintServiceAdvertisements(NimBLEAdvertisedDevice *ad void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDevice, size_t serviceDataCount, bool haveTxPower, int8_t txPower) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; String fingerprint = ""; for (int i = 0; i < serviceDataCount; i++) { @@ -290,18 +290,18 @@ void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDe if (uuid == exposureUUID) { // found COVID-19 exposure tracker - calRssi = BleFingerprintCollection::refRssi + EXPOSURE_TX; + calRssi = BleFingerprintCollection::rxRefRssi + EXPOSURE_TX; setId("exp:" + String(strServiceData.length()), ID_TYPE_EXPOSURE); //disc = hexStr(strServiceData).c_str(); } else if (uuid == smartTagUUID) { // found Samsung smart tag - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("smarttag:" + String(strServiceData.length()), ID_TYPE_SMARTTAG); } else if (uuid == miThermUUID) { - asRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + asRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; if (strServiceData.length() == 15) { // custom format auto serviceData = strServiceData.c_str(); @@ -397,45 +397,45 @@ void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertis if (haveTxPower) pid += -txPower; setId(pid, ID_TYPE_APPLE_NEARBY); disc = hexStr(strManufacturerData.substr(4)).c_str(); - mdRssi = BleFingerprintCollection::refRssi + APPLE_TX; + mdRssi = BleFingerprintCollection::rxRefRssi + APPLE_TX; } else if (strManufacturerData.length() >= 4 && strManufacturerData[2] == 0x12 && strManufacturerData.length() == 29) { String pid = "apple:findmy"; setId(pid, ID_TYPE_FINDMY); - mdRssi = BleFingerprintCollection::refRssi + APPLE_TX; + mdRssi = BleFingerprintCollection::rxRefRssi + APPLE_TX; } else if (strManufacturerData.length() >= 4) { String pid = Sprintf("apple:%02x%02x:%u", strManufacturerData[2], strManufacturerData[3], strManufacturerData.length()); if (haveTxPower) pid += -txPower; setId(pid, ID_TYPE_MISC_APPLE); - mdRssi = BleFingerprintCollection::refRssi + APPLE_TX; + mdRssi = BleFingerprintCollection::rxRefRssi + APPLE_TX; } } else if (manuf == "05a7") // Sonos { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("sonos:" + getMac(), ID_TYPE_SONOS); } else if (manuf == "0087") // Garmin { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("garmin:" + getMac(), ID_TYPE_GARMIN); } else if (manuf == "4d4b") // iTrack { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("iTrack:" + getMac(), ID_TYPE_ITRACK); } else if (manuf == "0157") // Mi-fit { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("mifit:" + getMac(), ID_TYPE_MIFIT); } else if (manuf == "0006" && strManufacturerData.length() == 29) // microsoft { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId(Sprintf("msft:cdp:%02x%02x", strManufacturerData[3], strManufacturerData[5]), ID_TYPE_MSFT); /*disc = Sprintf("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", strManufacturerData[6], strManufacturerData[7], strManufacturerData[8], strManufacturerData[9], strManufacturerData[10], @@ -446,7 +446,7 @@ void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertis } else if (manuf == "0075") // samsung { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; setId("samsung:" + getMac(), ID_TYPE_MISC); } else if (manuf == "beac" && strManufacturerData.length() == 26) @@ -458,7 +458,7 @@ void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertis } else if (manuf != "0000") { - mdRssi = haveTxPower ? BleFingerprintCollection::refRssi + txPower : NO_RSSI; + mdRssi = haveTxPower ? BleFingerprintCollection::rxRefRssi + txPower : NO_RSSI; String fingerprint = Sprintf("md:%s:%u", manuf.c_str(), strManufacturerData.length()); if (haveTxPower) fingerprint = fingerprint + String(-txPower); setId(fingerprint, ID_TYPE_MD); diff --git a/lib/BleFingerprint/BleFingerprintCollection.cpp b/lib/BleFingerprint/BleFingerprintCollection.cpp index bbe64bc..c09e51a 100644 --- a/lib/BleFingerprint/BleFingerprintCollection.cpp +++ b/lib/BleFingerprint/BleFingerprintCollection.cpp @@ -7,7 +7,7 @@ namespace BleFingerprintCollection { // Public (externed) String include{}, exclude{}, query{}, knownMacs{}, knownIrks{}, countIds{}; float skipDistance = 0.0f, maxDistance = 0.0f, absorption = 3.5f, countEnter = 2, countExit = 4; -int8_t refRssi = -65; +int8_t rxRefRssi = -65, txRefRssi = -59; int forgetMs = 0, skipMs = 0, countMs = 10000; std::vector deviceConfigs; std::vector irks; diff --git a/lib/BleFingerprint/BleFingerprintCollection.h b/lib/BleFingerprint/BleFingerprintCollection.h index e76fffd..cf5ebd7 100644 --- a/lib/BleFingerprint/BleFingerprintCollection.h +++ b/lib/BleFingerprint/BleFingerprintCollection.h @@ -46,10 +46,9 @@ extern TCallbackFingerprint onCountDel; extern String include, exclude, query, knownMacs, knownIrks, countIds; extern float skipDistance, maxDistance, absorption, countEnter, countExit; -extern int8_t refRssi; +extern int8_t rxRefRssi, txRefRssi; extern int forgetMs, skipMs, countMs; extern std::vector deviceConfigs; extern std::vector irks; extern std::vector fingerprints; - } // namespace BleFingerprintCollection diff --git a/src/Enrollment.cpp b/src/Enrollment.cpp index 0be4d34..91443a4 100644 --- a/src/Enrollment.cpp +++ b/src/Enrollment.cpp @@ -195,7 +195,7 @@ void Setup() { oBeacon.setProximityUUID(espresenseUUID); oBeacon.setMajor(major); oBeacon.setMinor(minor); - oBeacon.setSignalPower(-59); + oBeacon.setSignalPower(BleFingerprintCollection::txRefRssi); oAdvertisementData = new NimBLEAdvertisementData(); oAdvertisementData->setFlags(BLE_HS_ADV_F_BREDR_UNSUP); oAdvertisementData->setManufacturerData(oBeacon.getData()); diff --git a/src/defaults.h b/src/defaults.h index ca2e696..346a214 100644 --- a/src/defaults.h +++ b/src/defaults.h @@ -48,7 +48,8 @@ #define DEFAULT_INCLUDE "" #define DEFAULT_EXCLUDE "" -#define DEFAULT_REF_RSSI (-65) +#define DEFAULT_RX_REF_RSSI (-65) +#define DEFAULT_TX_REF_RSSI (-59) #define DEFAULT_ABSORPTION (3.5) #define DEFAULT_FORGET_MS 150000 // Ms to remove fingerprint after not seeing it diff --git a/src/main.cpp b/src/main.cpp index faa6217..9435625 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -158,9 +158,10 @@ void setupNetwork() { BleFingerprintCollection::skipMs = AsyncWiFiSettings.integer("skip_ms", 0, 3000000, DEFAULT_SKIP_MS, "Skip reporting if message age is less that this (in milliseconds)"); AsyncWiFiSettings.heading("Calibration ℹ️", false); - BleFingerprintCollection::refRssi = AsyncWiFiSettings.integer("ref_rssi", -100, 100, DEFAULT_REF_RSSI, "Rssi expected from a 0dBm transmitter at 1 meter (NOT used for iBeacons or Eddystone)"); + BleFingerprintCollection::rxRefRssi = AsyncWiFiSettings.integer("ref_rssi", -100, 100, DEFAULT_RX_REF_RSSI, "Rssi expected from a 0dBm transmitter at 1 meter (NOT used for iBeacons or Eddystone)"); BleFingerprintCollection::absorption = AsyncWiFiSettings.floating("absorption", -100, 100, DEFAULT_ABSORPTION, "Factor used to account for absorption, reflection, or diffraction"); BleFingerprintCollection::forgetMs = AsyncWiFiSettings.integer("forget_ms", 0, 3000000, DEFAULT_FORGET_MS, "Forget beacon if not seen for (in milliseconds)"); + BleFingerprintCollection::txRefRssi = AsyncWiFiSettings.integer("tx_ref_rssi", -100, 100, DEFAULT_TX_REF_RSSI, "Rssi expected from this tx power at 1m (used for node iBeacon)"); GUI::ConnectToWifi(); @@ -442,8 +443,6 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { void scanTask(void *parameter) { NimBLEDevice::init("ESPresense"); - for (esp_ble_power_type_t i = ESP_BLE_PWR_TYPE_CONN_HDL0; i <= ESP_BLE_PWR_TYPE_CONN_HDL8; i = esp_ble_power_type_t((int)i + 1)) - NimBLEDevice::setPower(ESP_PWR_LVL_P9, i); Enrollment::Setup(); NimBLEDevice::setMTU(23);