Use BLE scan callbacks for device discovery

This commit is contained in:
2026-06-04 02:31:03 -06:00
parent 25d9152fe0
commit bff7e2922b
+64 -40
View File
@@ -68,6 +68,58 @@ static void handleNotify(
} }
class BleScanCallbacks : public NimBLEScanCallbacks {
void onResult(const NimBLEAdvertisedDevice* device) override {
if (bleScanResultCount >= MAX_BLE_SCAN_RESULTS) {
return;
}
String address = device->getAddress().toString().c_str();
for (int i = 0; i < bleScanResultCount; i++) {
if (bleScanResults[i].address == address) {
bleScanResults[i].rssi = device->getRSSI();
if (bleScanResults[i].name.length() == 0 && device->haveName()) {
bleScanResults[i].name = device->getName().c_str();
}
return;
}
}
String name = "";
if (device->haveName()) {
name = device->getName().c_str();
}
bleScanResults[bleScanResultCount].address = address;
bleScanResults[bleScanResultCount].name = name;
bleScanResults[bleScanResultCount].rssi = device->getRSSI();
Serial.print(logTimestamp());
Serial.print(" BLE: found ");
Serial.print(bleScanResultCount + 1);
Serial.print(") ");
if (name.length() > 0) {
Serial.print(name);
} else {
Serial.print("(no name)");
}
Serial.print(" | ");
Serial.print(address);
Serial.print(" | RSSI ");
Serial.println(device->getRSSI());
bleScanResultCount++;
}
};
static BleScanCallbacks bleScanCallbacks;
void pauseBmsReconnect(uint32_t pauseMs) { void pauseBmsReconnect(uint32_t pauseMs) {
bmsReconnectPausedUntil = millis() + pauseMs; bmsReconnectPausedUntil = millis() + pauseMs;
} }
@@ -103,17 +155,24 @@ int scanBleDevices(uint32_t scanSeconds) {
bleScanResultCount = 0; bleScanResultCount = 0;
NimBLEScan* scan = NimBLEDevice::getScan(); NimBLEScan* scan = NimBLEDevice::getScan();
scan->setScanCallbacks(&bleScanCallbacks, false);
scan->setActiveScan(true); scan->setActiveScan(true);
scan->setInterval(100); scan->setInterval(100);
scan->setWindow(99); scan->setWindow(99);
scan->clearResults(); scan->clearResults();
Serial.print(logTimestamp()); Serial.print(logTimestamp());
Serial.print(" BLE: Starting continuous scan for "); Serial.print(" BLE: Scanning for ");
Serial.print(scanSeconds); Serial.print(scanSeconds);
Serial.println(" seconds..."); Serial.println(" seconds...");
scan->start(scanSeconds, false, false); bool started = scan->start(scanSeconds, false, false);
if (!started) {
Serial.print(logTimestamp());
Serial.println(" BLE: scan failed to start");
return 0;
}
unsigned long startMs = millis(); unsigned long startMs = millis();
unsigned long durationMs = scanSeconds * 1000UL; unsigned long durationMs = scanSeconds * 1000UL;
@@ -130,50 +189,14 @@ int scanBleDevices(uint32_t scanSeconds) {
Serial.print(elapsed / 1000); Serial.print(elapsed / 1000);
Serial.print("/"); Serial.print("/");
Serial.print(scanSeconds); Serial.print(scanSeconds);
Serial.println(" sec"); Serial.print(" sec, devices ");
Serial.println(bleScanResultCount);
} }
delay(50); delay(50);
} }
scan->stop(); scan->stop();
NimBLEScanResults results = scan->getResults();
int resultCount = results.getCount();
Serial.print(logTimestamp());
Serial.print(" BLE: Raw devices seen: ");
Serial.println(resultCount);
for (int i = 0; i < resultCount && bleScanResultCount < MAX_BLE_SCAN_RESULTS; i++) {
const NimBLEAdvertisedDevice* device = results.getDevice(i);
String address = device->getAddress().toString().c_str();
bool alreadySeen = false;
for (int existing = 0; existing < bleScanResultCount; existing++) {
if (bleScanResults[existing].address == address) {
alreadySeen = true;
break;
}
}
if (alreadySeen) {
continue;
}
String name = "";
if (device->haveName()) {
name = device->getName().c_str();
}
bleScanResults[bleScanResultCount].address = address;
bleScanResults[bleScanResultCount].name = name;
bleScanResults[bleScanResultCount].rssi = device->getRSSI();
bleScanResultCount++;
}
scan->clearResults(); scan->clearResults();
Serial.print(logTimestamp()); Serial.print(logTimestamp());
@@ -181,6 +204,7 @@ int scanBleDevices(uint32_t scanSeconds) {
Serial.println(bleScanResultCount); Serial.println(bleScanResultCount);
if (bleScanResultCount == 0) { if (bleScanResultCount == 0) {
Serial.println("No BLE devices found.");
return bleScanResultCount; return bleScanResultCount;
} }