From ddd649683599ab29d66baf0f10c9c4f949ed4b4f Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 3 Feb 2023 15:56:34 +0100 Subject: [PATCH 01/15] Changed data type of temperature --- .../BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino index b46baa7c84e..88e200e49be 100644 --- a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino +++ b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino @@ -115,7 +115,7 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks foundEddyURL.setData(eddyContent); Serial.printf("Reported battery voltage: %dmV\n", foundEddyURL.getVolt()); Serial.printf("Reported temperature from TLM class: %.2fC\n", (double)foundEddyURL.getTemp()); - int temp = (int)payLoad[16] + (int)(payLoad[15] << 8); + int16_t temp = (int16_t)payLoad[16] + (int16_t)(payLoad[15] << 8); float calcTemp = temp / 256.0f; Serial.printf("Reported temperature from data: %.2fC\n", calcTemp); Serial.printf("Reported advertise count: %d\n", foundEddyURL.getCount()); From 1f3a9414ee13341f80bd6d51cdbd57254aadfe97 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 3 Feb 2023 17:58:56 +0100 Subject: [PATCH 02/15] Changed data type in EddystoneTLM class and example --- .../BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino | 2 +- libraries/BLE/src/BLEEddystoneTLM.cpp | 2 +- libraries/BLE/src/BLEEddystoneTLM.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino index 96be28cd588..a3d890ea512 100644 --- a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino +++ b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino @@ -50,7 +50,7 @@ void setBeacon() uint16_t volt = random(2800, 3700); // 3300mV = 3.3V float tempFloat = random(2000, 3100) / 100.0f; Serial.printf("Random temperature is %.2fC\n", tempFloat); - int temp = (int)(tempFloat * 256); //(uint16_t)((float)23.00); + int16_t temp = (int16_t)(tempFloat * 256); Serial.printf("Converted to 8.8 format %0X%0X\n", (temp >> 8), (temp & 0xFF)); BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index 10cc657a23c..d363c5c8fdf 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -132,7 +132,7 @@ void BLEEddystoneTLM::setVolt(uint16_t volt) { } // setVolt void BLEEddystoneTLM::setTemp(float temp) { - m_eddystoneData.temp = (uint16_t)temp; + m_eddystoneData.temp = (int16_t)temp; } // setTemp void BLEEddystoneTLM::setCount(uint32_t advCount) { diff --git a/libraries/BLE/src/BLEEddystoneTLM.h b/libraries/BLE/src/BLEEddystoneTLM.h index a93e224fdf0..40b2806e7fd 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.h +++ b/libraries/BLE/src/BLEEddystoneTLM.h @@ -41,7 +41,7 @@ class BLEEddystoneTLM { uint8_t frameType; uint8_t version; uint16_t volt; - uint16_t temp; + int16_t temp; uint32_t advCount; uint32_t tmil; } __attribute__((packed)) m_eddystoneData; From cc893d5cfc92ce33bef62e330d5c6969f41a4448 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Wed, 8 Feb 2023 08:57:44 +0100 Subject: [PATCH 03/15] Revert "Changed data type in EddystoneTLM class and example" This reverts commit 1f3a9414ee13341f80bd6d51cdbd57254aadfe97. --- .../BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino | 2 +- libraries/BLE/src/BLEEddystoneTLM.cpp | 2 +- libraries/BLE/src/BLEEddystoneTLM.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino index a3d890ea512..96be28cd588 100644 --- a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino +++ b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino @@ -50,7 +50,7 @@ void setBeacon() uint16_t volt = random(2800, 3700); // 3300mV = 3.3V float tempFloat = random(2000, 3100) / 100.0f; Serial.printf("Random temperature is %.2fC\n", tempFloat); - int16_t temp = (int16_t)(tempFloat * 256); + int temp = (int)(tempFloat * 256); //(uint16_t)((float)23.00); Serial.printf("Converted to 8.8 format %0X%0X\n", (temp >> 8), (temp & 0xFF)); BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index d363c5c8fdf..10cc657a23c 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -132,7 +132,7 @@ void BLEEddystoneTLM::setVolt(uint16_t volt) { } // setVolt void BLEEddystoneTLM::setTemp(float temp) { - m_eddystoneData.temp = (int16_t)temp; + m_eddystoneData.temp = (uint16_t)temp; } // setTemp void BLEEddystoneTLM::setCount(uint32_t advCount) { diff --git a/libraries/BLE/src/BLEEddystoneTLM.h b/libraries/BLE/src/BLEEddystoneTLM.h index 40b2806e7fd..a93e224fdf0 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.h +++ b/libraries/BLE/src/BLEEddystoneTLM.h @@ -41,7 +41,7 @@ class BLEEddystoneTLM { uint8_t frameType; uint8_t version; uint16_t volt; - int16_t temp; + uint16_t temp; uint32_t advCount; uint32_t tmil; } __attribute__((packed)) m_eddystoneData; From f67758044c8a51eaa5d2f85123a21407e494b288 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Thu, 9 Feb 2023 15:06:35 +0100 Subject: [PATCH 04/15] Draft of Eddystone TLM example --- .../BLE_EddystoneTLM_Client.ino | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino new file mode 100644 index 00000000000..29613fc7dff --- /dev/null +++ b/libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino @@ -0,0 +1,48 @@ +// Use this with example BLE_EddystoneTLM_Beacon (flash on second ESP) +// Eddystone TLM Beacon client never actually connects - it only listens to the advertisement + +#include +#include +#include + +BLEUUID SERVICE_UUID("FEAA"); + +BLEScan* pBLEScan; + +class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { + void onResult(BLEAdvertisedDevice advertisedDevice) { + Serial.println(); + Serial.print("Advertised Device: "); + Serial.println(advertisedDevice.toString().c_str()); + + Serial.printf("advertisedDevice.haveServiceUUID() = %d; advertisedDevice.getServiceUUID()=%s, SERVICE_UUID=%s)\n", advertisedDevice.haveServiceUUID(), advertisedDevice.getServiceUUID().toString().c_str(), SERVICE_UUID.toString().c_str()); + if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(SERVICE_UUID)) { + uint8_t *payload = advertisedDevice.getPayload(); + + size_t len =advertisedDevice.getPayloadLength(); + for(int i =0; i < len; ++i){ + Serial.printf("payload[%d]=%x%s\n", i, payload[i], i==26 || i==27 ? " < temp" : (i==22 ? " < expecting 0x20 for TLM" : "")); + } + Serial.printf("Temp: payload[26]=%x; payload[27]=%x\n", payload[26], payload[27]); + float temp = payload[26]+payload[27]/259.0; + Serial.printf("Float Temp: %f\n", temp); + }else{ + //Serial.printf("advertised Device does not have UUID, or it is not equal to expected 0xFEAA\n"); + } + //BLEDevice::getScan()->stop(); + //Serial.printf("Scanning stopped\n"); + } +}; + +void setup() { + Serial.begin(115200); + BLEDevice::init(""); + pBLEScan = BLEDevice::getScan(); + pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); + pBLEScan->setActiveScan(true); +} + +void loop() { + pBLEScan->start(-1); + BLEDevice::getScan()->start(0); +} From 50e1c7eaa95a9488abea8399ec2432137113dc4d Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sun, 12 Feb 2023 22:38:14 -0300 Subject: [PATCH 05/15] Adds MACROs to convert beacon temperature 2 Macros EDDYSTONE_TEMP_U16_TO_FLOAT(tempU16) - takes the TLM BigEndian 8.8 fixed point representation and returns its float value EDDYSTONE_TEMP_FLOAT_TO_U16(tempFloat) - takes a float (temperature) and returns its BigEndian 8.8 fixed point representation --- libraries/BLE/src/BLEEddystoneTLM.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index 10cc657a23c..13a88eebb17 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -19,6 +19,8 @@ static const char LOG_TAG[] = "BLEEddystoneTLM"; #define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00)>>8) + (((x)&0xFF)<<8)) #define ENDIAN_CHANGE_U32(x) ((((x)&0xFF000000)>>24) + (((x)&0x00FF0000)>>8)) + ((((x)&0xFF00)<<8) + (((x)&0xFF)<<24)) +#define EDDYSTONE_TEMP_U16_TO_FLOAT(tempU16) (((int16_t)ENDIAN_CHANGE_U16(tempU16)) / 256.0f) +#define EDDYSTONE_TEMP_FLOAT_TO_U16(tempFloat) (ENDIAN_CHANGE_U16(((int)(tempFloat * 256)))) BLEEddystoneTLM::BLEEddystoneTLM() { beaconUUID = 0xFEAA; From 3ee9d5364e2a62cb5d4ad46d3213460fc25bbd00 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Mon, 13 Feb 2023 14:43:05 +0100 Subject: [PATCH 06/15] Fixed temp --- .../BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino | 33 ++++------- .../BLE_EddystoneTLM_Beacon.ino | 22 ++++---- .../BLE_EddystoneTLM_Client.ino | 48 ---------------- libraries/BLE/src/BLEAdvertising.cpp | 5 ++ libraries/BLE/src/BLEEddystoneTLM.cpp | 17 +++--- libraries/BLE/src/BLEEddystoneTLM.h | 55 ++++++++++--------- 6 files changed, 65 insertions(+), 115 deletions(-) delete mode 100644 libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino diff --git a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino index 88e200e49be..e8ddc5c4620 100644 --- a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino +++ b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino @@ -99,30 +99,17 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks Serial.printf("TX power %d\n", foundEddyURL.getPower()); Serial.println("\n"); } - else if (payLoad[11] == 0x20) + if (advertisedDevice.getPayloadLength() >= 22 && payLoad[22] == 0x20) { - Serial.println("Found an EddystoneTLM beacon!"); - BLEEddystoneTLM foundEddyURL = BLEEddystoneTLM(); - std::string eddyContent((char *)&payLoad[11]); // incomplete EddystoneURL struct! - - eddyContent = "01234567890123"; - - for (int idx = 0; idx < 14; idx++) - { - eddyContent[idx] = payLoad[idx + 11]; - } - - foundEddyURL.setData(eddyContent); - Serial.printf("Reported battery voltage: %dmV\n", foundEddyURL.getVolt()); - Serial.printf("Reported temperature from TLM class: %.2fC\n", (double)foundEddyURL.getTemp()); - int16_t temp = (int16_t)payLoad[16] + (int16_t)(payLoad[15] << 8); - float calcTemp = temp / 256.0f; - Serial.printf("Reported temperature from data: %.2fC\n", calcTemp); - Serial.printf("Reported advertise count: %d\n", foundEddyURL.getCount()); - Serial.printf("Reported time since last reboot: %ds\n", foundEddyURL.getTime()); - Serial.println("\n"); - Serial.print(foundEddyURL.toString().c_str()); - Serial.println("\n"); + Serial.printf("Found an EddystoneTLM beacon! payload length = %d B; minus 22 = %d\n", advertisedDevice.getPayloadLength(), advertisedDevice.getPayloadLength() - 22); + BLEEddystoneTLM eddystoneTLM; + //std::string TLMframe(payLoad[22], advertisedDevice.getPayloadLength() - 22); + //eddystoneTLM.setData(TLMFrame); + eddystoneTLM.setData(std::string((char*)payLoad+22, advertisedDevice.getPayloadLength() - 22)); + Serial.printf("Reported battery voltage: %dmV\n", eddystoneTLM.getVolt()); + Serial.printf("Reported temperature: %.2f°C (raw data=0x%04X)\n", eddystoneTLM.getFloatTemp(), eddystoneTLM.getTemp()); + Serial.printf("Reported advertise count: %d\n", eddystoneTLM.getCount()); + Serial.printf("Reported time since last reboot: %ds\n", eddystoneTLM.getTime()); } } } diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino index 96be28cd588..adcbd2071f3 100644 --- a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino +++ b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino @@ -13,6 +13,7 @@ 5. Stop advertising. 6. deep sleep + To read data advertised by this beacon use second ESP with example sketch BLE_Beacon_Scanner */ #include "sys/time.h" @@ -22,7 +23,7 @@ #include "BLEUtils.h" #include "BLEBeacon.h" #include "BLEAdvertising.h" -#include "BLEEddystoneURL.h" +#include "BLEEddystoneTLM.h" #include "esp_sleep.h" @@ -48,10 +49,10 @@ void setBeacon() char beacon_data[25]; uint16_t beconUUID = 0xFEAA; uint16_t volt = random(2800, 3700); // 3300mV = 3.3V - float tempFloat = random(2000, 3100) / 100.0f; - Serial.printf("Random temperature is %.2fC\n", tempFloat); - int temp = (int)(tempFloat * 256); //(uint16_t)((float)23.00); - Serial.printf("Converted to 8.8 format %0X%0X\n", (temp >> 8), (temp & 0xFF)); + float tempFloat = random(-3000, 3000) / 100.0f; + Serial.printf("Random temperature is %.2f°C\n", tempFloat); + int temp = EDDYSTONE_TEMP_FLOAT_TO_U16(tempFloat); + Serial.printf("Converted to 8.8 format 0x%04X\n", temp); BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); BLEAdvertisementData oScanResponseData = BLEAdvertisementData(); @@ -82,13 +83,11 @@ void setBeacon() void setup() { - Serial.begin(115200); gettimeofday(&nowTimeStruct, NULL); - Serial.printf("start ESP32 %d\n", bootcount++); - - Serial.printf("deep sleep (%lds since last reset, %lds since last boot)\n", nowTimeStruct.tv_sec, nowTimeStruct.tv_sec - last); + Serial.printf("Starting ESP32. Bootcount = %d\n", bootcount++); + Serial.printf("Deep sleep (%lds since last reset, %lds since last boot)\n", nowTimeStruct.tv_sec, nowTimeStruct.tv_sec - last); last = nowTimeStruct.tv_sec; lastTenth = nowTimeStruct.tv_sec * 10; // Time since last reset as 0.1 second resolution counter @@ -103,12 +102,11 @@ void setup() setBeacon(); // Start advertising pAdvertising->start(); - Serial.println("Advertizing started for 10s ..."); + Serial.println("Advertising started for 10s ..."); delay(10000); pAdvertising->stop(); - Serial.printf("enter deep sleep for 10s\n"); + Serial.printf("Enter deep sleep for 10s\n"); esp_deep_sleep(1000000LL * GPIO_DEEP_SLEEP_DURATION); - Serial.printf("in deep sleep\n"); } void loop() diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino deleted file mode 100644 index 29613fc7dff..00000000000 --- a/libraries/BLE/examples/BLE_EddystoneTLM_Client/BLE_EddystoneTLM_Client.ino +++ /dev/null @@ -1,48 +0,0 @@ -// Use this with example BLE_EddystoneTLM_Beacon (flash on second ESP) -// Eddystone TLM Beacon client never actually connects - it only listens to the advertisement - -#include -#include -#include - -BLEUUID SERVICE_UUID("FEAA"); - -BLEScan* pBLEScan; - -class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { - void onResult(BLEAdvertisedDevice advertisedDevice) { - Serial.println(); - Serial.print("Advertised Device: "); - Serial.println(advertisedDevice.toString().c_str()); - - Serial.printf("advertisedDevice.haveServiceUUID() = %d; advertisedDevice.getServiceUUID()=%s, SERVICE_UUID=%s)\n", advertisedDevice.haveServiceUUID(), advertisedDevice.getServiceUUID().toString().c_str(), SERVICE_UUID.toString().c_str()); - if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(SERVICE_UUID)) { - uint8_t *payload = advertisedDevice.getPayload(); - - size_t len =advertisedDevice.getPayloadLength(); - for(int i =0; i < len; ++i){ - Serial.printf("payload[%d]=%x%s\n", i, payload[i], i==26 || i==27 ? " < temp" : (i==22 ? " < expecting 0x20 for TLM" : "")); - } - Serial.printf("Temp: payload[26]=%x; payload[27]=%x\n", payload[26], payload[27]); - float temp = payload[26]+payload[27]/259.0; - Serial.printf("Float Temp: %f\n", temp); - }else{ - //Serial.printf("advertised Device does not have UUID, or it is not equal to expected 0xFEAA\n"); - } - //BLEDevice::getScan()->stop(); - //Serial.printf("Scanning stopped\n"); - } -}; - -void setup() { - Serial.begin(115200); - BLEDevice::init(""); - pBLEScan = BLEDevice::getScan(); - pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); - pBLEScan->setActiveScan(true); -} - -void loop() { - pBLEScan->start(-1); - BLEDevice::getScan()->start(0); -} diff --git a/libraries/BLE/src/BLEAdvertising.cpp b/libraries/BLE/src/BLEAdvertising.cpp index 3dcd99b77c3..796abc7eb67 100644 --- a/libraries/BLE/src/BLEAdvertising.cpp +++ b/libraries/BLE/src/BLEAdvertising.cpp @@ -443,6 +443,11 @@ void BLEAdvertisementData::setPartialServices(BLEUUID uuid) { * @brief Set the service data (UUID + data) * @param [in] uuid The UUID to set with the service data. Size of UUID will be used. * @param [in] data The data to be associated with the service data advert. + * Data frame: + * | Field || Len | Type | UUID | EddyStone Frame | + * | Offset || 0 | 1 | 2 | 4 | + * | Len || 1 | 1 | 2 | up to 20 | + * | Data || ?? | ?? | 0xAA | 0xFE | ??? | */ void BLEAdvertisementData::setServiceData(BLEUUID uuid, std::string data) { char cdata[2]; diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index 13a88eebb17..738273b6f51 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -17,10 +17,6 @@ #include "BLEEddystoneTLM.h" static const char LOG_TAG[] = "BLEEddystoneTLM"; -#define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00)>>8) + (((x)&0xFF)<<8)) -#define ENDIAN_CHANGE_U32(x) ((((x)&0xFF000000)>>24) + (((x)&0x00FF0000)>>8)) + ((((x)&0xFF00)<<8) + (((x)&0xFF)<<24)) -#define EDDYSTONE_TEMP_U16_TO_FLOAT(tempU16) (((int16_t)ENDIAN_CHANGE_U16(tempU16)) / 256.0f) -#define EDDYSTONE_TEMP_FLOAT_TO_U16(tempFloat) (ENDIAN_CHANGE_U16(((int)(tempFloat * 256)))) BLEEddystoneTLM::BLEEddystoneTLM() { beaconUUID = 0xFEAA; @@ -48,10 +44,14 @@ uint16_t BLEEddystoneTLM::getVolt() { return ENDIAN_CHANGE_U16(m_eddystoneData.volt); } // getVolt -float BLEEddystoneTLM::getTemp() { - return ENDIAN_CHANGE_U16(m_eddystoneData.temp) / 256.0f; +uint16_t BLEEddystoneTLM::getTemp() { + return ENDIAN_CHANGE_U16(m_eddystoneData.temp); } // getTemp +float BLEEddystoneTLM::getFloatTemp() { + return EDDYSTONE_TEMP_U16_TO_FLOAT(ENDIAN_CHANGE_U16(m_eddystoneData.temp)); +} // getFloatTemp + uint32_t BLEEddystoneTLM::getCount() { return ENDIAN_CHANGE_U32(m_eddystoneData.advCount); } // getCount @@ -112,6 +112,9 @@ std::string BLEEddystoneTLM::toString() { /** * Set the raw data for the beacon record. + * Example: + * uint8_t *payLoad = advertisedDevice.getPayload(); + * eddystoneTLM.setData(std::string((char*)payLoad+22, advertisedDevice.getPayloadLength() - 22)); */ void BLEEddystoneTLM::setData(std::string data) { if (data.length() != sizeof(m_eddystoneData)) { @@ -134,7 +137,7 @@ void BLEEddystoneTLM::setVolt(uint16_t volt) { } // setVolt void BLEEddystoneTLM::setTemp(float temp) { - m_eddystoneData.temp = (uint16_t)temp; + m_eddystoneData.temp = EDDYSTONE_TEMP_FLOAT_TO_U16(temp); } // setTemp void BLEEddystoneTLM::setCount(uint32_t advCount) { diff --git a/libraries/BLE/src/BLEEddystoneTLM.h b/libraries/BLE/src/BLEEddystoneTLM.h index a93e224fdf0..ce996e64b0b 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.h +++ b/libraries/BLE/src/BLEEddystoneTLM.h @@ -10,6 +10,10 @@ #include "BLEUUID.h" #define EDDYSTONE_TLM_FRAME_TYPE 0x20 +#define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00)>>8) + (((x)&0xFF)<<8)) +#define ENDIAN_CHANGE_U32(x) ((((x)&0xFF000000)>>24) + (((x)&0x00FF0000)>>8)) + ((((x)&0xFF00)<<8) + (((x)&0xFF)<<24)) +#define EDDYSTONE_TEMP_U16_TO_FLOAT(tempU16) (((int16_t)ENDIAN_CHANGE_U16(tempU16)) / 256.0f) +#define EDDYSTONE_TEMP_FLOAT_TO_U16(tempFloat) (ENDIAN_CHANGE_U16(((int)((tempFloat) * 256)))) /** * @brief Representation of a beacon. @@ -18,33 +22,34 @@ */ class BLEEddystoneTLM { public: - BLEEddystoneTLM(); - std::string getData(); - BLEUUID getUUID(); - uint8_t getVersion(); - uint16_t getVolt(); - float getTemp(); - uint32_t getCount(); - uint32_t getTime(); - std::string toString(); - void setData(std::string data); - void setUUID(BLEUUID l_uuid); - void setVersion(uint8_t version); - void setVolt(uint16_t volt); - void setTemp(float temp); - void setCount(uint32_t advCount); - void setTime(uint32_t tmil); + BLEEddystoneTLM(); + std::string getData(); + BLEUUID getUUID(); + uint8_t getVersion(); + uint16_t getVolt(); + uint16_t getTemp(); + float getFloatTemp(); + uint32_t getCount(); + uint32_t getTime(); + std::string toString(); + void setData(std::string data); + void setUUID(BLEUUID l_uuid); + void setVersion(uint8_t version); + void setVolt(uint16_t volt); + void setTemp(float temp); + void setCount(uint32_t advCount); + void setTime(uint32_t tmil); private: - uint16_t beaconUUID; - struct { - uint8_t frameType; - uint8_t version; - uint16_t volt; - uint16_t temp; - uint32_t advCount; - uint32_t tmil; - } __attribute__((packed)) m_eddystoneData; + uint16_t beaconUUID; + struct { + uint8_t frameType; + uint8_t version; + uint16_t volt; + uint16_t temp; + uint32_t advCount; + uint32_t tmil; + } __attribute__((packed)) m_eddystoneData; }; // BLEEddystoneTLM From 96faa77d8fa9f70d16123c3b1572184f288d3b2f Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 17 Feb 2023 14:14:38 +0100 Subject: [PATCH 07/15] Changed to conform with PR comments --- .../BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino | 6 ++--- .../BLE_EddystoneTLM_Beacon.ino | 2 +- libraries/BLE/src/BLEAdvertising.cpp | 5 ----- libraries/BLE/src/BLEEddystoneTLM.cpp | 22 ++++++++++++++----- libraries/BLE/src/BLEEddystoneTLM.h | 4 ++-- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino index e8ddc5c4620..7f9166f4e13 100644 --- a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino +++ b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino @@ -101,13 +101,11 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks } if (advertisedDevice.getPayloadLength() >= 22 && payLoad[22] == 0x20) { - Serial.printf("Found an EddystoneTLM beacon! payload length = %d B; minus 22 = %d\n", advertisedDevice.getPayloadLength(), advertisedDevice.getPayloadLength() - 22); + Serial.println("Found an EddystoneTLM beacon!"); BLEEddystoneTLM eddystoneTLM; - //std::string TLMframe(payLoad[22], advertisedDevice.getPayloadLength() - 22); - //eddystoneTLM.setData(TLMFrame); eddystoneTLM.setData(std::string((char*)payLoad+22, advertisedDevice.getPayloadLength() - 22)); Serial.printf("Reported battery voltage: %dmV\n", eddystoneTLM.getVolt()); - Serial.printf("Reported temperature: %.2f°C (raw data=0x%04X)\n", eddystoneTLM.getFloatTemp(), eddystoneTLM.getTemp()); + Serial.printf("Reported temperature: %.2f°C (raw data=0x%04X)\n", eddystoneTLM.getTemp(), eddystoneTLM.getRawTemp()); Serial.printf("Reported advertise count: %d\n", eddystoneTLM.getCount()); Serial.printf("Reported time since last reboot: %ds\n", eddystoneTLM.getTime()); } diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino index adcbd2071f3..f6332864400 100644 --- a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino +++ b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino @@ -51,7 +51,7 @@ void setBeacon() uint16_t volt = random(2800, 3700); // 3300mV = 3.3V float tempFloat = random(-3000, 3000) / 100.0f; Serial.printf("Random temperature is %.2f°C\n", tempFloat); - int temp = EDDYSTONE_TEMP_FLOAT_TO_U16(tempFloat); + int temp = (int)(tempFloat * 256); Serial.printf("Converted to 8.8 format 0x%04X\n", temp); BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); diff --git a/libraries/BLE/src/BLEAdvertising.cpp b/libraries/BLE/src/BLEAdvertising.cpp index 796abc7eb67..3dcd99b77c3 100644 --- a/libraries/BLE/src/BLEAdvertising.cpp +++ b/libraries/BLE/src/BLEAdvertising.cpp @@ -443,11 +443,6 @@ void BLEAdvertisementData::setPartialServices(BLEUUID uuid) { * @brief Set the service data (UUID + data) * @param [in] uuid The UUID to set with the service data. Size of UUID will be used. * @param [in] data The data to be associated with the service data advert. - * Data frame: - * | Field || Len | Type | UUID | EddyStone Frame | - * | Offset || 0 | 1 | 2 | 4 | - * | Len || 1 | 1 | 2 | up to 20 | - * | Data || ?? | ?? | 0xAA | 0xFE | ??? | */ void BLEAdvertisementData::setServiceData(BLEUUID uuid, std::string data) { char cdata[2]; diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index 738273b6f51..e64f8f72329 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -44,14 +44,14 @@ uint16_t BLEEddystoneTLM::getVolt() { return ENDIAN_CHANGE_U16(m_eddystoneData.volt); } // getVolt -uint16_t BLEEddystoneTLM::getTemp() { +float BLEEddystoneTLM::getTemp() { + return EDDYSTONE_TEMP_U16_TO_FLOAT(m_eddystoneData.temp); +} // getFloatTemp + +uint16_t BLEEddystoneTLM::getRawTemp() { return ENDIAN_CHANGE_U16(m_eddystoneData.temp); } // getTemp -float BLEEddystoneTLM::getFloatTemp() { - return EDDYSTONE_TEMP_U16_TO_FLOAT(ENDIAN_CHANGE_U16(m_eddystoneData.temp)); -} // getFloatTemp - uint32_t BLEEddystoneTLM::getCount() { return ENDIAN_CHANGE_U32(m_eddystoneData.advCount); } // getCount @@ -115,6 +115,18 @@ std::string BLEEddystoneTLM::toString() { * Example: * uint8_t *payLoad = advertisedDevice.getPayload(); * eddystoneTLM.setData(std::string((char*)payLoad+22, advertisedDevice.getPayloadLength() - 22)); + * Note: the offset 22 works for current implementation of example BLE_EddystoneTLM Beacon.ino, however it is not static and will be reimplemented + * Data frame: + * | Field || Len | Type | UUID | EddyStone TLM | + * | Offset || 0 | 1 | 2 | 4 | + * | Len || 1 B | 1 B | 2 B | 14 B | + * | Data || ?? | ?? | 0xAA | 0xFE | ??? | + * + * EddyStone TLM frame: + * | Field || Type | Version | Batt mV | Beacon temp | Cnt since boot | Time since boot | + * | Offset || 0 | 1 | 2 | 4 | 6 | 10 | + * | Len || 1 B | 1 B | 2 B | 2 B | 4 B | 4 B | + * | Data || 0x20 | ?? | ?? | ?? | ?? | ?? | | | | | | | | | */ void BLEEddystoneTLM::setData(std::string data) { if (data.length() != sizeof(m_eddystoneData)) { diff --git a/libraries/BLE/src/BLEEddystoneTLM.h b/libraries/BLE/src/BLEEddystoneTLM.h index ce996e64b0b..72dec318072 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.h +++ b/libraries/BLE/src/BLEEddystoneTLM.h @@ -27,8 +27,8 @@ class BLEEddystoneTLM { BLEUUID getUUID(); uint8_t getVersion(); uint16_t getVolt(); - uint16_t getTemp(); - float getFloatTemp(); + float getTemp(); + uint16_t getRawTemp(); uint32_t getCount(); uint32_t getTime(); std::string toString(); From 0980a21b0d63142a8a5f21d6ca06cdd6818fa1bb Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 17 Feb 2023 14:46:45 +0100 Subject: [PATCH 08/15] Fixed comment on closing bracket --- libraries/BLE/src/BLEEddystoneTLM.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index e64f8f72329..1c8851f7a7e 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -46,11 +46,11 @@ uint16_t BLEEddystoneTLM::getVolt() { float BLEEddystoneTLM::getTemp() { return EDDYSTONE_TEMP_U16_TO_FLOAT(m_eddystoneData.temp); -} // getFloatTemp +} // getTemp uint16_t BLEEddystoneTLM::getRawTemp() { return ENDIAN_CHANGE_U16(m_eddystoneData.temp); -} // getTemp +} // getRawTemp uint32_t BLEEddystoneTLM::getCount() { return ENDIAN_CHANGE_U32(m_eddystoneData.advCount); From a42a5133e5af88e85b28285a6dd3706474e4eab7 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sat, 18 Feb 2023 17:45:37 -0300 Subject: [PATCH 09/15] Prints negative TEMP big endian as just 2 bytes --- .../BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino index f6332864400..ddb1d859353 100644 --- a/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino +++ b/libraries/BLE/examples/BLE_EddystoneTLM_Beacon/BLE_EddystoneTLM_Beacon.ino @@ -52,7 +52,7 @@ void setBeacon() float tempFloat = random(-3000, 3000) / 100.0f; Serial.printf("Random temperature is %.2f°C\n", tempFloat); int temp = (int)(tempFloat * 256); - Serial.printf("Converted to 8.8 format 0x%04X\n", temp); + Serial.printf("Converted to 8.8 format %0X%0X\n", (temp >> 8) & 0xFF, (temp & 0xFF)); BLEAdvertisementData oAdvertisementData = BLEAdvertisementData(); BLEAdvertisementData oScanResponseData = BLEAdvertisementData(); From 1f406c6340cb0781e7094d6cdcbb3af375c2f3dd Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sat, 18 Feb 2023 18:54:00 -0300 Subject: [PATCH 10/15] Extacts correct Eddyston Service Data --- .../BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino index 7f9166f4e13..aed6a38ffe3 100644 --- a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino +++ b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino @@ -14,8 +14,6 @@ #include #include -#define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00) >> 8) + (((x)&0xFF) << 8)) - int scanTime = 5; //In seconds BLEScan *pBLEScan; @@ -69,23 +67,35 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks } uint8_t *payLoad = advertisedDevice.getPayload(); + // search for Eddystone Service Data in the advertising payload + // *payload shall point to eddystone data or to its end when not found + const uint8_t serviceDataEddystone[3] = {0x16, 0xAA, 0xFE}; // it has Eddystone BLE UUID + const size_t payLoadLen = advertisedDevice.getPayloadLength(); + uint8_t *payLoadEnd = payLoad + payLoadLen - 1; // address of the end of payLoad space + while (payLoad < payLoadEnd) { + if (payLoad[1] == serviceDataEddystone[0] && payLoad[2] == serviceDataEddystone[1] && payLoad[3] == serviceDataEddystone[2]) { + // found! + payLoad += 4; + break; + } + payLoad += *payLoad + 1; // payLoad[0] has the field Length + } - BLEUUID checkUrlUUID = (uint16_t)0xfeaa; - - if (advertisedDevice.getServiceUUID().equals(checkUrlUUID)) + if (payLoad < payLoadEnd) // Eddystone Service Data and respective BLE UUID were found { - if (payLoad[11] == 0x10) + if (*payLoad == 0x10) { Serial.println("Found an EddystoneURL beacon!"); BLEEddystoneURL foundEddyURL = BLEEddystoneURL(); - std::string eddyContent((char *)&payLoad[11]); // incomplete EddystoneURL struct! + std::string eddyContent((char *)payLoad); // incomplete EddystoneURL struct! foundEddyURL.setData(eddyContent); std::string bareURL = foundEddyURL.getURL(); if (bareURL[0] == 0x00) { - size_t payLoadLen = advertisedDevice.getPayloadLength(); + // dumps all bytes in advertising payload Serial.println("DATA-->"); + uint8_t *payLoad = advertisedDevice.getPayload(); for (int idx = 0; idx < payLoadLen; idx++) { Serial.printf("0x%08X ", payLoad[idx]); @@ -98,16 +108,20 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks Serial.printf("Decoded URL: %s\n", foundEddyURL.getDecodedURL().c_str()); Serial.printf("TX power %d\n", foundEddyURL.getPower()); Serial.println("\n"); - } - if (advertisedDevice.getPayloadLength() >= 22 && payLoad[22] == 0x20) + } + else if (*payLoad == 0x20) { Serial.println("Found an EddystoneTLM beacon!"); + BLEEddystoneTLM eddystoneTLM; - eddystoneTLM.setData(std::string((char*)payLoad+22, advertisedDevice.getPayloadLength() - 22)); + eddystoneTLM.setData(std::string((char*)payLoad, 14)); Serial.printf("Reported battery voltage: %dmV\n", eddystoneTLM.getVolt()); Serial.printf("Reported temperature: %.2f°C (raw data=0x%04X)\n", eddystoneTLM.getTemp(), eddystoneTLM.getRawTemp()); Serial.printf("Reported advertise count: %d\n", eddystoneTLM.getCount()); Serial.printf("Reported time since last reboot: %ds\n", eddystoneTLM.getTime()); + Serial.println("\n"); + Serial.print(eddystoneTLM.toString().c_str()); + Serial.println("\n"); } } } From f638759a883fa912adfee94a9ca4206aa47c712d Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sat, 18 Feb 2023 19:29:37 -0300 Subject: [PATCH 11/15] Fixes BLEEddystoneTLM::toString() negative temp --- libraries/BLE/src/BLEEddystoneTLM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/BLE/src/BLEEddystoneTLM.cpp b/libraries/BLE/src/BLEEddystoneTLM.cpp index 1c8851f7a7e..a902209faa3 100644 --- a/libraries/BLE/src/BLEEddystoneTLM.cpp +++ b/libraries/BLE/src/BLEEddystoneTLM.cpp @@ -75,7 +75,7 @@ std::string BLEEddystoneTLM::toString() { out += " mV\n"; out += "Temperature "; - snprintf(val, sizeof(val), "%.2f", ENDIAN_CHANGE_U16(m_eddystoneData.temp) / 256.0f); + snprintf(val, sizeof(val), "%.2f", ((int16_t)ENDIAN_CHANGE_U16(m_eddystoneData.temp)) / 256.0f); out += val; out += " C\n"; From c9bf68db22de41bdc0452fac4829663e86d7a4be Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sat, 18 Feb 2023 20:36:59 -0300 Subject: [PATCH 12/15] Fixes URL field length --- libraries/BLE/src/BLEEddystoneURL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/BLE/src/BLEEddystoneURL.h b/libraries/BLE/src/BLEEddystoneURL.h index 0b538c07d00..adb1335e6bb 100644 --- a/libraries/BLE/src/BLEEddystoneURL.h +++ b/libraries/BLE/src/BLEEddystoneURL.h @@ -35,7 +35,7 @@ class BLEEddystoneURL { struct { uint8_t frameType; int8_t advertisedTxPower; - uint8_t url[16]; + uint8_t url[18]; // 18 bytes: 1 byte for URL scheme + up to 17 bytes of URL } __attribute__((packed)) m_eddystoneData; }; // BLEEddystoneURL From aa5486bad19daa71ef5706a9bb277b6305df2149 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sat, 18 Feb 2023 20:45:41 -0300 Subject: [PATCH 13/15] Fixes Eddystone URL decoding --- .../BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino index aed6a38ffe3..8a69cbebc64 100644 --- a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino +++ b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino @@ -87,9 +87,8 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { Serial.println("Found an EddystoneURL beacon!"); BLEEddystoneURL foundEddyURL = BLEEddystoneURL(); - std::string eddyContent((char *)payLoad); // incomplete EddystoneURL struct! - - foundEddyURL.setData(eddyContent); + uint8_t URLLen = *(payLoad - 4) - 3; // Get Field Length less 3 bytes (type and UUID) + foundEddyURL.setData(std::string((char*)payLoad, URLLen)); std::string bareURL = foundEddyURL.getURL(); if (bareURL[0] == 0x00) { @@ -98,7 +97,7 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks uint8_t *payLoad = advertisedDevice.getPayload(); for (int idx = 0; idx < payLoadLen; idx++) { - Serial.printf("0x%08X ", payLoad[idx]); + Serial.printf("0x%02X ", payLoad[idx]); } Serial.println("\nInvalid Data"); return; From a64613d3a32bfb9b32811eee09ab688064dadc5a Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sat, 18 Feb 2023 22:30:04 -0300 Subject: [PATCH 14/15] Fixes MSB for iBeacon UUID iBeacons use big endian BLE fields. --- libraries/BLE/src/BLEBeacon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/BLE/src/BLEBeacon.cpp b/libraries/BLE/src/BLEBeacon.cpp index 9f3519b8a19..177926d9ea8 100644 --- a/libraries/BLE/src/BLEBeacon.cpp +++ b/libraries/BLE/src/BLEBeacon.cpp @@ -40,7 +40,7 @@ uint16_t BLEBeacon::getMinor() { } BLEUUID BLEBeacon::getProximityUUID() { - return BLEUUID(m_beaconData.proximityUUID, 16, false); + return BLEUUID(m_beaconData.proximityUUID, 16, true); } int8_t BLEBeacon::getSignalPower() { From 5529457c202ee6c8ad279dd08fe3b2420901c058 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Sun, 19 Feb 2023 16:58:53 -0300 Subject: [PATCH 15/15] Fix to detect iBeacon that also has Service UUID This fix makes the BLE_iBeacon.ino to work correctly with the BLE_Beacon_Scanner.ino example --- .../BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino index 8a69cbebc64..26d0e880f8b 100644 --- a/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino +++ b/libraries/BLE/examples/BLE_Beacon_Scanner/BLE_Beacon_Scanner.ino @@ -35,35 +35,32 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks Serial.println(devUUID.toString().c_str()); Serial.println(""); } - else + + if (advertisedDevice.haveManufacturerData() == true) { - if (advertisedDevice.haveManufacturerData() == true) - { - std::string strManufacturerData = advertisedDevice.getManufacturerData(); + std::string strManufacturerData = advertisedDevice.getManufacturerData(); - uint8_t cManufacturerData[100]; - strManufacturerData.copy((char *)cManufacturerData, strManufacturerData.length(), 0); + uint8_t cManufacturerData[100]; + strManufacturerData.copy((char *)cManufacturerData, strManufacturerData.length(), 0); - if (strManufacturerData.length() == 25 && cManufacturerData[0] == 0x4C && cManufacturerData[1] == 0x00) - { - Serial.println("Found an iBeacon!"); - BLEBeacon oBeacon = BLEBeacon(); - oBeacon.setData(strManufacturerData); - Serial.printf("iBeacon Frame\n"); - Serial.printf("ID: %04X Major: %d Minor: %d UUID: %s Power: %d\n", oBeacon.getManufacturerId(), ENDIAN_CHANGE_U16(oBeacon.getMajor()), ENDIAN_CHANGE_U16(oBeacon.getMinor()), oBeacon.getProximityUUID().toString().c_str(), oBeacon.getSignalPower()); - } - else + if (strManufacturerData.length() == 25 && cManufacturerData[0] == 0x4C && cManufacturerData[1] == 0x00) + { + Serial.println("Found an iBeacon!"); + BLEBeacon oBeacon = BLEBeacon(); + oBeacon.setData(strManufacturerData); + Serial.printf("iBeacon Frame\n"); + Serial.printf("ID: %04X Major: %d Minor: %d UUID: %s Power: %d\n", oBeacon.getManufacturerId(), ENDIAN_CHANGE_U16(oBeacon.getMajor()), ENDIAN_CHANGE_U16(oBeacon.getMinor()), oBeacon.getProximityUUID().toString().c_str(), oBeacon.getSignalPower()); + } + else + { + Serial.println("Found another manufacturers beacon!"); + Serial.printf("strManufacturerData: %d ", strManufacturerData.length()); + for (int i = 0; i < strManufacturerData.length(); i++) { - Serial.println("Found another manufacturers beacon!"); - Serial.printf("strManufacturerData: %d ", strManufacturerData.length()); - for (int i = 0; i < strManufacturerData.length(); i++) - { - Serial.printf("[%X]", cManufacturerData[i]); - } - Serial.printf("\n"); + Serial.printf("[%X]", cManufacturerData[i]); } + Serial.printf("\n"); } - return; } uint8_t *payLoad = advertisedDevice.getPayload();