diff --git a/src/BleClientCallback.h b/src/BleClientCallback.h index e4216dd..463c452 100644 --- a/src/BleClientCallback.h +++ b/src/BleClientCallback.h @@ -5,7 +5,7 @@ class BleClientCallback { public: virtual ~BleClientCallback() = default; - virtual void onAdvertisementReceived(std::string address, std::string name, + virtual void onAdvertisementReceived(uint64_t address, std::string name, std::string data) = 0; }; diff --git a/src/NimBleClient.cpp b/src/NimBleClient.cpp index 3c8856d..839776a 100644 --- a/src/NimBleClient.cpp +++ b/src/NimBleClient.cpp @@ -1,8 +1,23 @@ #include "NimBleClient.h" +NimBleClient::NimBleClient() : _callback(nullptr) { + // CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE (2) + // Filter by address and data, advertisements from the same address will be + // reported only once, except if the data in the advertisement has changed, + // then it will be reported again. + NimBLEDevice::setScanFilterMode(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE); + NimBLEDevice::setScanDuplicateCacheSize(200); + NimBLEDevice::init(""); + _bleScan = NimBLEDevice::getScan(); + setupBleScans(); +} + +NimBleClient::~NimBleClient() { + _bleScan->stop(); +} + void NimBleClient::begin(BleClientCallback* callback) { _callback = callback; - setupBleScans(); startBleScans(); } @@ -15,18 +30,18 @@ void NimBleClient::keepAlive() { } } - void NimBleClient::onResult(NimBLEAdvertisedDevice* advertisedDevice) { if (!advertisedDevice->haveManufacturerData()) { return; } // MAC address contains 6 bytes of MAC address (in reversed order) - // (Note: advertisedDevice->getAddress().toString() seems broken) const uint8_t* bleMACAddress = advertisedDevice->getAddress().getNative(); - std::string address; - for (int i = 5; i >= 0; i--) { - address.push_back(static_cast(bleMACAddress[i])); + uint64_t address = 0; + size_t address_size = 6; + // reverse MAC address and store it as 64-bit unsigned int + for (int ix = 0; ix < address_size; ix++) { + address = (address << 8) | bleMACAddress[address_size - 1 - ix]; } std::string name = advertisedDevice->haveName() @@ -38,16 +53,6 @@ void NimBleClient::onResult(NimBLEAdvertisedDevice* advertisedDevice) { } void NimBleClient::setupBleScans() { - // CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE (2) - // Filter by address and data, advertisements from the same address will be - // reported only once, except if the data in the advertisement has changed, - // then it will be reported again. - NimBLEDevice::setScanFilterMode(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE); - NimBLEDevice::setScanDuplicateCacheSize(200); - NimBLEDevice::init(""); - - // create new scan - _bleScan = NimBLEDevice::getScan(); // Activate callback on advertisement update _bleScan->setAdvertisedDeviceCallbacks(this, true); // Set active scanning, this will get more data from the advertiser. diff --git a/src/NimBleClient.h b/src/NimBleClient.h index 61574c1..0de06cc 100644 --- a/src/NimBleClient.h +++ b/src/NimBleClient.h @@ -8,7 +8,8 @@ class __attribute__((unused)) NimBleClient : public BleClient, public NimBLEAdvertisedDeviceCallbacks { public: - NimBleClient() : _bleScan(nullptr), _callback(nullptr) {}; + NimBleClient(); + ~NimBleClient(); void begin(BleClientCallback* callback) override; void keepAlive() override; diff --git a/src/Sensirion_upt_ble_auto_detection.cpp b/src/Sensirion_upt_ble_auto_detection.cpp index 2dc734a..6eb4d65 100644 --- a/src/Sensirion_upt_ble_auto_detection.cpp +++ b/src/Sensirion_upt_ble_auto_detection.cpp @@ -1,4 +1,5 @@ #include "Sensirion_upt_ble_auto_detection.h" +#include "Arduino.h" #include "NimBleClient.h" const int COMPANY_ID_FILTER = 54534; @@ -20,19 +21,16 @@ __attribute__((unused)) void SensiScan::keepAlive() { _bleClient->keepAlive(); } -void SensiScan::onAdvertisementReceived(const std::string address, - std::string name, std::string data) { +void SensiScan::onAdvertisementReceived(uint64_t address, std::string name, + std::string data) { uint16_t companyId = (uint16_t)data[0] << 8 | (uint8_t)data[1]; if (companyId != COMPANY_ID_FILTER) { return; } - // Get MAC address as uint64_t - uint64_t deviceID = squashMACAddress(address); - // Build MetaData MetaData metaData; - metaData.deviceID = deviceID; + metaData.deviceID = address; metaData.deviceType.bleGadgetType = bleGadgetTypeFromCompleteLocalName(name.c_str()); metaData.platform = DevicePlatform::BLE; @@ -48,20 +46,6 @@ void SensiScan::onAdvertisementReceived(const std::string address, _sampleCache[getDeviceId(data)] = samples; } -/** - * @brief squash std::string address to a uint64_t - * @note MAC address is comprised of 6 bytes - */ -uint64_t SensiScan::squashMACAddress(const std::string& macAddressString) { - - uint64_t deviceID = static_cast(macAddressString[0]); - for (size_t i = 1; i < 6; i++) { - deviceID = (deviceID << 8) | macAddressString[i]; - } - - return deviceID; -} - /** * @brief last two digits of MAC address uniquely define a device */ diff --git a/src/Sensirion_upt_ble_auto_detection.h b/src/Sensirion_upt_ble_auto_detection.h index 054f125..c36cde5 100644 --- a/src/Sensirion_upt_ble_auto_detection.h +++ b/src/Sensirion_upt_ble_auto_detection.h @@ -20,9 +20,8 @@ class __attribute__((unused)) SensiScan: public BleClientCallback { private: BleClient* _bleClient; std::map> _sampleCache; - void onAdvertisementReceived(std::string address, std::string name, + void onAdvertisementReceived(uint64_t address, std::string name, std::string data) override; - static uint64_t squashMACAddress(const std::string& macAddressString); static uint16_t getDeviceId(const std::string& data); static uint8_t decodeData(const MetaData& metaData, const std::string& data, std::vector& samples);