From 27d1e9e257023b90980d8ec22db7b9aae4d3f296 Mon Sep 17 00:00:00 2001
From: Darrell
Date: Fri, 24 Jun 2022 16:39:43 -0400
Subject: [PATCH] Add support for apple:findmy packets (only useful for
counting) (#498)
---
lib/BleFingerprint/BleFingerprint.cpp | 19 ++++++++++++-------
lib/BleFingerprint/BleFingerprint.h | 1 +
lib/BleFingerprint/GUI.cpp | 2 --
src/main.cpp | 2 +-
4 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/lib/BleFingerprint/BleFingerprint.cpp b/lib/BleFingerprint/BleFingerprint.cpp
index 128c0bd..7a684bf 100644
--- a/lib/BleFingerprint/BleFingerprint.cpp
+++ b/lib/BleFingerprint/BleFingerprint.cpp
@@ -33,7 +33,7 @@ bool BleFingerprint::setId(const String& newId, short newIdType, const String& n
{
allowQuery = true;
qryAttempts = 0;
- if (rssi < -60)
+ if (rssi < -70)
{
qryDelayMillis = 5000;
lastQryMillis = millis();
@@ -105,7 +105,7 @@ void BleFingerprint::fingerprintServiceAdvertisements(NimBLEAdvertisedDevice *ad
{
auto uuid = advertisedDevice->getServiceUUID(i);
#ifdef VERBOSE
- Serial.printf("Verbose | %-58sAD: %s\n", getId().c_str(), advertisedDevice->getServiceUUID(i).toString().c_str());
+ Serial.printf("Verbose | MAC: %s, ID: %-58sAD: %s\n", getMac().c_str(), getId().c_str(), advertisedDevice->getServiceUUID(i).toString().c_str());
#endif
if (uuid == roomAssistantService)
{
@@ -192,7 +192,7 @@ void BleFingerprint::fingerprintServiceData(NimBLEAdvertisedDevice *advertisedDe
BLEUUID uuid = advertisedDevice->getServiceDataUUID(i);
std::string strServiceData = advertisedDevice->getServiceData(i);
#ifdef VERBOSE
- Serial.printf("Verbose | %-58sSD: %s/%s\n", getId().c_str(), uuid.toString().c_str(), hexStr(strServiceData).c_str());
+ Serial.printf("Verbose | MAC: %s, ID: %-58sSD: %s/%s\n", getMac().c_str(), getId().c_str(), uuid.toString().c_str(), hexStr(strServiceData).c_str());
#endif
if (uuid == exposureUUID)
@@ -281,7 +281,7 @@ void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertis
{
std::string strManufacturerData = advertisedDevice->getManufacturerData();
#ifdef VERBOSE
- Serial.printf("Verbose | %-58sMD: %s\n", getId().c_str(), hexStr(strManufacturerData).c_str());
+ Serial.printf("Verbose | MAC: %s, ID: %-58sMD: %s\n", getMac().c_str(), getId().c_str(), hexStr(strManufacturerData).c_str());
#endif
if (strManufacturerData.length() >= 2)
{
@@ -304,6 +304,12 @@ void BleFingerprint::fingerprintManufactureData(NimBLEAdvertisedDevice *advertis
disc = hexStr(strManufacturerData.substr(4)).c_str();
mdRssi = BleFingerprintCollection::refRssi + 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;
+ }
else if (strManufacturerData.length() >= 4)
{
String pid = Sprintf("apple:%02x%02x:%u", strManufacturerData[2], strManufacturerData[3], strManufacturerData.length());
@@ -380,6 +386,8 @@ bool BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice)
seenCount++;
+ fingerprint(advertisedDevice);
+
if (ignore) return false;
oldest = recent;
@@ -387,9 +395,6 @@ bool BleFingerprint::seen(BLEAdvertisedDevice *advertisedDevice)
newest = advertisedDevice->getRSSI();
rssi = median_of_3(oldest, recent, newest);
- fingerprint(advertisedDevice);
-
- if (ignore) return false;
float ratio = (get1mRssi() - rssi) / (10.0f * BleFingerprintCollection::absorption);
raw = pow(10, ratio);
diff --git a/lib/BleFingerprint/BleFingerprint.h b/lib/BleFingerprint/BleFingerprint.h
index a23104b..35b55ec 100644
--- a/lib/BleFingerprint/BleFingerprint.h
+++ b/lib/BleFingerprint/BleFingerprint.h
@@ -22,6 +22,7 @@
#define ID_TYPE_SD short(15)
#define ID_TYPE_MD short(20)
#define ID_TYPE_MISC short(30)
+#define ID_TYPE_FINDMY short(32)
#define ID_TYPE_NAME short(35)
#define ID_TYPE_PUBLIC_MAC short(50)
#define ID_TYPE_MSFT short(100)
diff --git a/lib/BleFingerprint/GUI.cpp b/lib/BleFingerprint/GUI.cpp
index d9d6370..3a36ae9 100644
--- a/lib/BleFingerprint/GUI.cpp
+++ b/lib/BleFingerprint/GUI.cpp
@@ -108,14 +108,12 @@ void GUI::minusOne(BleFingerprint *f)
void GUI::close(BleFingerprint *f)
{
- if (f->getIgnore()) return;
Serial.printf("\u001b[32m%u Close | MAC: %s, ID: %-60s (%.2fm) %ddBm\u001b[0m\n", xPortGetCoreID(), f->getMac().c_str(), f->getId().c_str(), f->getDistance(), f->getNewestRssi());
status("C:%s", f->getId().c_str());
}
void GUI::left(BleFingerprint *f)
{
- if (f->getIgnore()) return;
Serial.printf("\u001b[33m%u Left | MAC: %s, ID: %-60s (%.2fm) %ddBm\u001b[0m\n", xPortGetCoreID(), f->getMac().c_str(), f->getId().c_str(), f->getDistance(), f->getNewestRssi());
status("L:%s", f->getId().c_str());
}
diff --git a/src/main.cpp b/src/main.cpp
index 9e999de..28bc306 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -191,7 +191,7 @@ void setupNetwork()
BleFingerprintCollection::skipMs = WiFiSettings.integer("skip_ms", 0, 3000000, DEFAULT_SKIP_MS, "Skip reporting if message age is less that this (in milliseconds)");
WiFiSettings.heading("Calibration ℹ️", false);
- BleFingerprintCollection::refRssi = WiFiSettings.integer("ref_rssi", -100, 100, DEFAULT_REF_RSSI, "Rssi expected from a 0dBm transmitter at 1 meter");
+ BleFingerprintCollection::refRssi = WiFiSettings.integer("ref_rssi", -100, 100, DEFAULT_REF_RSSI, "Rssi expected from a 0dBm transmitter at 1 meter (NOT used for iBecons or Eddystone)");
BleFingerprintCollection::absorption = WiFiSettings.floating("absorption", -100, 100, DEFAULT_ABSORPTION, "Factor used to account for absorption, reflection, or diffraction");
BleFingerprintCollection::forgetMs = WiFiSettings.integer("forget_ms", 0, 3000000, DEFAULT_FORGET_MS, "Forget beacon if not seen for (in milliseconds)");