Skip to content

Commit a4e3d43

Browse files
committed
Fix issue with parsing scan response #612
1 parent e8b5df4 commit a4e3d43

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

cpp_utils/BLEAdvertisedDevice.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -228,16 +228,16 @@ bool BLEAdvertisedDevice::haveTXPower() {
228228
*
229229
* https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
230230
*/
231-
void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
231+
void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload, size_t total_len) {
232232
uint8_t length;
233233
uint8_t ad_type;
234234
uint8_t sizeConsumed = 0;
235235
bool finished = false;
236236
setPayload(payload);
237237

238+
while(!finished) {
238239
length = *payload; // Retrieve the length of the record.
239240
payload++; // Skip to type
240-
while (!finished) {
241241
sizeConsumed += 1 + length; // increase the size consumed.
242242

243243
if (length != 0) { // A length of 0 indicates that we have reached the end.
@@ -250,7 +250,7 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
250250
ad_type, BLEUtils::advTypeToString(ad_type), length, pHex);
251251
free(pHex);
252252

253-
switch (ad_type) {
253+
switch(ad_type) {
254254
case ESP_BLE_AD_TYPE_NAME_CMPL: { // Adv Data Type: 0x09
255255
setName(std::string(reinterpret_cast<char*>(payload), length));
256256
break;
@@ -273,15 +273,15 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
273273

274274
case ESP_BLE_AD_TYPE_16SRV_CMPL:
275275
case ESP_BLE_AD_TYPE_16SRV_PART: { // Adv Data Type: 0x02
276-
for (int var = 0; var < length / 2; ++var) {
276+
for (int var = 0; var < length/2; ++var) {
277277
setServiceUUID(BLEUUID(*reinterpret_cast<uint16_t*>(payload + var * 2)));
278278
}
279279
break;
280280
} // ESP_BLE_AD_TYPE_16SRV_PART
281281

282282
case ESP_BLE_AD_TYPE_32SRV_CMPL:
283283
case ESP_BLE_AD_TYPE_32SRV_PART: { // Adv Data Type: 0x04
284-
for (int var = 0; var < length / 4; ++var) {
284+
for (int var = 0; var < length/4; ++var) {
285285
setServiceUUID(BLEUUID(*reinterpret_cast<uint32_t*>(payload + var * 4)));
286286
}
287287
break;
@@ -308,7 +308,7 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
308308
ESP_LOGE(LOG_TAG, "Length too small for ESP_BLE_AD_TYPE_SERVICE_DATA");
309309
break;
310310
}
311-
uint16_t uuid = *(uint16_t*) payload;
311+
uint16_t uuid = *(uint16_t*)payload;
312312
setServiceDataUUID(BLEUUID(uuid));
313313
if (length > 2) {
314314
setServiceData(std::string(reinterpret_cast<char*>(payload + 2), length - 2));
@@ -335,7 +335,7 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
335335
break;
336336
}
337337

338-
setServiceDataUUID(BLEUUID(payload, (size_t) 16, false));
338+
setServiceDataUUID(BLEUUID(payload, (size_t)16, false));
339339
if (length > 16) {
340340
setServiceData(std::string(reinterpret_cast<char*>(payload + 16), length - 16));
341341
}
@@ -351,7 +351,7 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
351351
} // Length <> 0
352352

353353

354-
if (sizeConsumed >= 31 || length == 0) {
354+
if (sizeConsumed >= total_len || length == 0) {
355355
finished = true;
356356
}
357357
} // !finished
@@ -514,5 +514,14 @@ void BLEAdvertisedDevice::setPayload(uint8_t* payload) {
514514
m_payload = payload;
515515
}
516516

517+
esp_ble_addr_type_t BLEAdvertisedDevice::getAddressType() {
518+
return m_addressType;
519+
}
520+
521+
void BLEAdvertisedDevice::setAddressType(esp_ble_addr_type_t type) {
522+
m_addressType = type;
523+
}
524+
517525

518526
#endif /* CONFIG_BT_ENABLED */
527+

cpp_utils/BLEAdvertisedDevice.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class BLEAdvertisedDevice {
4040
BLEUUID getServiceUUID();
4141
int8_t getTXPower();
4242
uint8_t* getPayload();
43+
esp_ble_addr_type_t getAddressType();
44+
void setAddressType(esp_ble_addr_type_t type);
4345

4446

4547
bool isAdvertisingService(BLEUUID uuid);
@@ -56,7 +58,7 @@ class BLEAdvertisedDevice {
5658
private:
5759
friend class BLEScan;
5860

59-
void parseAdvertisement(uint8_t* payload);
61+
void parseAdvertisement(uint8_t* payload, size_t total_len=62);
6062
void setAddress(BLEAddress address);
6163
void setAdFlag(uint8_t adFlag);
6264
void setAdvertizementResult(uint8_t* payload);
@@ -81,6 +83,7 @@ class BLEAdvertisedDevice {
8183
bool m_haveTXPower;
8284

8385

86+
BLEAddress m_address = BLEAddress((uint8_t*)"\0\0\0\0\0\0");
8487
uint8_t m_adFlag;
8588
uint16_t m_appearance;
8689
int m_deviceType;
@@ -93,7 +96,7 @@ class BLEAdvertisedDevice {
9396
std::string m_serviceData;
9497
BLEUUID m_serviceDataUUID;
9598
uint8_t* m_payload;
96-
BLEAddress m_address = BLEAddress((uint8_t*) "\0\0\0\0\0\0");
99+
esp_ble_addr_type_t m_addressType;
97100
};
98101

99102
/**

0 commit comments

Comments
 (0)