Skip to content

Commit 2e34cb7

Browse files
committed
fix(nimble): Fix scan
1 parent 34284b8 commit 2e34cb7

File tree

4 files changed

+90
-107
lines changed

4 files changed

+90
-107
lines changed

libraries/BLE/src/BLEAdvertisedDevice.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -295,72 +295,72 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len)
295295
length--;
296296

297297
char *pHex = BLEUtils::buildHexData(nullptr, payload, length);
298-
log_d("Type: 0x%.2x (%s), length: %d, data: %s", ad_type, BLEUtils::advTypeToString(ad_type), length, pHex);
298+
log_d("Type: 0x%.2x (%s), length: %d, data: %s", ad_type, BLEUtils::advDataTypeToString(ad_type), length, pHex);
299299
free(pHex);
300300

301301
switch (ad_type) {
302-
case 0x09:
302+
case ESP_BLE_AD_TYPE_NAME_CMPL: // 0x09
303303
{ // Adv Data Type: ESP_BLE_AD_TYPE_NAME_CMPL
304304
setName(String(reinterpret_cast<char *>(payload), length));
305305
break;
306306
} // 0x09
307307

308-
case 0x0A:
308+
case ESP_BLE_AD_TYPE_TX_PWR: // 0x0A
309309
{ // Adv Data Type: ESP_BLE_AD_TYPE_TX_PWR
310310
setTXPower(*payload);
311311
break;
312312
} // 0x0A
313313

314-
case 0x19:
314+
case ESP_BLE_AD_TYPE_APPEARANCE: // 0x19
315315
{ // Adv Data Type: ESP_BLE_AD_TYPE_APPEARANCE
316316
setAppearance(*reinterpret_cast<uint16_t *>(payload));
317317
break;
318318
} // 0x19
319319

320-
case 0x01:
320+
case ESP_BLE_AD_TYPE_FLAG: // 0x01
321321
{ // Adv Data Type: ESP_BLE_AD_TYPE_FLAG
322322
setAdFlag(*payload);
323323
break;
324324
} // 0x01
325325

326-
case 0x02:
327-
case 0x03:
326+
case ESP_BLE_AD_TYPE_16SRV_PART: // 0x02
327+
case ESP_BLE_AD_TYPE_16SRV_CMPL: // 0x03
328328
{ // Adv Data Type: ESP_BLE_AD_TYPE_16SRV_PART/CMPL
329329
for (int var = 0; var < length / 2; ++var) {
330330
setServiceUUID(BLEUUID(*reinterpret_cast<uint16_t *>(payload + var * 2)));
331331
}
332332
break;
333333
} // 0x02, 0x03
334334

335-
case 0x04:
336-
case 0x05:
335+
case ESP_BLE_AD_TYPE_32SRV_PART: // 0x04
336+
case ESP_BLE_AD_TYPE_32SRV_CMPL: // 0x05
337337
{ // Adv Data Type: ESP_BLE_AD_TYPE_32SRV_PART/CMPL
338338
for (int var = 0; var < length / 4; ++var) {
339339
setServiceUUID(BLEUUID(*reinterpret_cast<uint32_t *>(payload + var * 4)));
340340
}
341341
break;
342342
} // 0x04, 0x05
343343

344-
case 0x07:
344+
case ESP_BLE_AD_TYPE_128SRV_CMPL: // 0x07
345345
{ // Adv Data Type: ESP_BLE_AD_TYPE_128SRV_CMPL
346346
setServiceUUID(BLEUUID(payload, 16, false));
347347
break;
348348
} // 0x07
349349

350-
case 0x06:
350+
case ESP_BLE_AD_TYPE_128SRV_PART: // 0x06
351351
{ // Adv Data Type: ESP_BLE_AD_TYPE_128SRV_PART
352352
setServiceUUID(BLEUUID(payload, 16, false));
353353
break;
354354
} // 0x06
355355

356356
// See CSS Part A 1.4 Manufacturer Specific Data
357-
case 0xFF:
357+
case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: // 0xFF
358358
{
359359
setManufacturerData(String(reinterpret_cast<char *>(payload), length));
360360
break;
361361
} // 0xFF
362362

363-
case 0x16:
363+
case ESP_BLE_AD_TYPE_SERVICE_DATA: // 0x16
364364
{ // Adv Data Type: ESP_BLE_AD_TYPE_SERVICE_DATA - 2 byte UUID
365365
if (length < 2) {
366366
log_e("Length too small for SERVICE_DATA");
@@ -374,7 +374,7 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len)
374374
break;
375375
} // 0x16
376376

377-
case 0x20:
377+
case ESP_BLE_AD_TYPE_32SERVICE_DATA: // 0x20
378378
{ // Adv Data Type: ESP_BLE_AD_TYPE_32SERVICE_DATA - 4 byte UUID
379379
if (length < 4) {
380380
log_e("Length too small for 32SERVICE_DATA");
@@ -388,7 +388,7 @@ void BLEAdvertisedDevice::parseAdvertisement(uint8_t *payload, size_t total_len)
388388
break;
389389
} // 0x20
390390

391-
case 0x21:
391+
case ESP_BLE_AD_TYPE_128SERVICE_DATA: // 0x21
392392
{ // Adv Data Type: ESP_BLE_AD_TYPE_128SERVICE_DATA - 16 byte UUID
393393
if (length < 16) {
394394
log_e("Length too small for 128SERVICE_DATA");

libraries/BLE/src/BLEScan.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,7 @@ int BLEScan::handleGAPEvent(ble_gap_event *event, void *arg) {
638638
}
639639
advertisedDevice = new BLEAdvertisedDevice();
640640
advertisedDevice->setAddress(advertisedAddress);
641+
advertisedDevice->setAddressType(event->disc.addr.type);
641642
advertisedDevice->setAdvType(event->disc.event_type);
642643
pScan->m_scanResults.m_vectorAdvertisedDevices.insert(std::pair<std::string, BLEAdvertisedDevice *>(advertisedAddress.toString().c_str(), advertisedDevice));
643644
log_i("New advertiser: %s", advertisedAddress.toString().c_str());
@@ -649,7 +650,14 @@ int BLEScan::handleGAPEvent(ble_gap_event *event, void *arg) {
649650
}
650651

651652
advertisedDevice->setRSSI(event->disc.rssi);
652-
advertisedDevice->setPayload((uint8_t *)event->disc.data, event->disc.length_data, event->disc.event_type == BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP);
653+
654+
if (pScan->m_shouldParse) {
655+
advertisedDevice->parseAdvertisement((uint8_t *)event->disc.data, event->disc.length_data);
656+
} else {
657+
advertisedDevice->setPayload((uint8_t *)event->disc.data, event->disc.length_data, event->disc.event_type == BLE_HCI_ADV_RPT_EVTYPE_SCAN_RSP);
658+
}
659+
660+
advertisedDevice->setScan(pScan);
653661

654662
if (pScan->m_pAdvertisedDeviceCallbacks) {
655663
// If not active scanning or scan response is not available

libraries/BLE/src/BLEUtils.cpp

Lines changed: 65 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,71 @@ char *BLEUtils::buildHexData(uint8_t *target, uint8_t *source, uint8_t length) {
678678
return startOfData;
679679
} // buildHexData
680680

681+
/**
682+
* @brief Given an advertising data type, return a string representation of the type.
683+
*
684+
* For details see ...
685+
* https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
686+
*
687+
* @return A string representation of the type.
688+
*/
689+
const char *BLEUtils::advDataTypeToString(uint8_t advType) {
690+
switch (advType) {
691+
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG
692+
case ESP_BLE_AD_TYPE_FLAG: // 0x01
693+
return "ESP_BLE_AD_TYPE_FLAG";
694+
case ESP_BLE_AD_TYPE_16SRV_PART: // 0x02
695+
return "ESP_BLE_AD_TYPE_16SRV_PART";
696+
case ESP_BLE_AD_TYPE_16SRV_CMPL: // 0x03
697+
return "ESP_BLE_AD_TYPE_16SRV_CMPL";
698+
case ESP_BLE_AD_TYPE_32SRV_PART: // 0x04
699+
return "ESP_BLE_AD_TYPE_32SRV_PART";
700+
case ESP_BLE_AD_TYPE_32SRV_CMPL: // 0x05
701+
return "ESP_BLE_AD_TYPE_32SRV_CMPL";
702+
case ESP_BLE_AD_TYPE_128SRV_PART: // 0x06
703+
return "ESP_BLE_AD_TYPE_128SRV_PART";
704+
case ESP_BLE_AD_TYPE_128SRV_CMPL: // 0x07
705+
return "ESP_BLE_AD_TYPE_128SRV_CMPL";
706+
case ESP_BLE_AD_TYPE_NAME_SHORT: // 0x08
707+
return "ESP_BLE_AD_TYPE_NAME_SHORT";
708+
case ESP_BLE_AD_TYPE_NAME_CMPL: // 0x09
709+
return "ESP_BLE_AD_TYPE_NAME_CMPL";
710+
case ESP_BLE_AD_TYPE_TX_PWR: // 0x0a
711+
return "ESP_BLE_AD_TYPE_TX_PWR";
712+
case ESP_BLE_AD_TYPE_DEV_CLASS: // 0x0b
713+
return "ESP_BLE_AD_TYPE_DEV_CLASS";
714+
case ESP_BLE_AD_TYPE_SM_TK: // 0x10
715+
return "ESP_BLE_AD_TYPE_SM_TK";
716+
case ESP_BLE_AD_TYPE_SM_OOB_FLAG: // 0x11
717+
return "ESP_BLE_AD_TYPE_SM_OOB_FLAG";
718+
case ESP_BLE_AD_TYPE_INT_RANGE: // 0x12
719+
return "ESP_BLE_AD_TYPE_INT_RANGE";
720+
case ESP_BLE_AD_TYPE_SOL_SRV_UUID: // 0x14
721+
return "ESP_BLE_AD_TYPE_SOL_SRV_UUID";
722+
case ESP_BLE_AD_TYPE_128SOL_SRV_UUID: // 0x15
723+
return "ESP_BLE_AD_TYPE_128SOL_SRV_UUID";
724+
case ESP_BLE_AD_TYPE_SERVICE_DATA: // 0x16
725+
return "ESP_BLE_AD_TYPE_SERVICE_DATA";
726+
case ESP_BLE_AD_TYPE_PUBLIC_TARGET: // 0x17
727+
return "ESP_BLE_AD_TYPE_PUBLIC_TARGET";
728+
case ESP_BLE_AD_TYPE_RANDOM_TARGET: // 0x18
729+
return "ESP_BLE_AD_TYPE_RANDOM_TARGET";
730+
case ESP_BLE_AD_TYPE_APPEARANCE: // 0x19
731+
return "ESP_BLE_AD_TYPE_APPEARANCE";
732+
case ESP_BLE_AD_TYPE_ADV_INT: // 0x1a
733+
return "ESP_BLE_AD_TYPE_ADV_INT";
734+
case ESP_BLE_AD_TYPE_32SOL_SRV_UUID: // 0x1f
735+
return "ESP_BLE_AD_TYPE_32SOL_SRV_UUID";
736+
case ESP_BLE_AD_TYPE_32SERVICE_DATA: // 0x20
737+
return "ESP_BLE_AD_TYPE_32SERVICE_DATA";
738+
case ESP_BLE_AD_TYPE_128SERVICE_DATA: // 0x21
739+
return "ESP_BLE_AD_TYPE_128SERVICE_DATA";
740+
case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: // 0xff
741+
return "ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE";
742+
#endif
743+
default: log_v(" adv data type: 0x%x", advType); return "";
744+
} // End switch
745+
} // advDataTypeToString
681746

682747
/*****************************************************************************
683748
* Bluedroid functions *
@@ -777,71 +842,6 @@ String BLEUtils::adFlagsToString(uint8_t adFlags) {
777842
return res;
778843
} // adFlagsToString
779844

780-
/**
781-
* @brief Given an advertising type, return a string representation of the type.
782-
*
783-
* For details see ...
784-
* https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
785-
*
786-
* @return A string representation of the type.
787-
*/
788-
const char *BLEUtils::advTypeToString(uint8_t advType) {
789-
switch (advType) {
790-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG
791-
case ESP_BLE_AD_TYPE_FLAG: // 0x01
792-
return "ESP_BLE_AD_TYPE_FLAG";
793-
case ESP_BLE_AD_TYPE_16SRV_PART: // 0x02
794-
return "ESP_BLE_AD_TYPE_16SRV_PART";
795-
case ESP_BLE_AD_TYPE_16SRV_CMPL: // 0x03
796-
return "ESP_BLE_AD_TYPE_16SRV_CMPL";
797-
case ESP_BLE_AD_TYPE_32SRV_PART: // 0x04
798-
return "ESP_BLE_AD_TYPE_32SRV_PART";
799-
case ESP_BLE_AD_TYPE_32SRV_CMPL: // 0x05
800-
return "ESP_BLE_AD_TYPE_32SRV_CMPL";
801-
case ESP_BLE_AD_TYPE_128SRV_PART: // 0x06
802-
return "ESP_BLE_AD_TYPE_128SRV_PART";
803-
case ESP_BLE_AD_TYPE_128SRV_CMPL: // 0x07
804-
return "ESP_BLE_AD_TYPE_128SRV_CMPL";
805-
case ESP_BLE_AD_TYPE_NAME_SHORT: // 0x08
806-
return "ESP_BLE_AD_TYPE_NAME_SHORT";
807-
case ESP_BLE_AD_TYPE_NAME_CMPL: // 0x09
808-
return "ESP_BLE_AD_TYPE_NAME_CMPL";
809-
case ESP_BLE_AD_TYPE_TX_PWR: // 0x0a
810-
return "ESP_BLE_AD_TYPE_TX_PWR";
811-
case ESP_BLE_AD_TYPE_DEV_CLASS: // 0x0b
812-
return "ESP_BLE_AD_TYPE_DEV_CLASS";
813-
case ESP_BLE_AD_TYPE_SM_TK: // 0x10
814-
return "ESP_BLE_AD_TYPE_SM_TK";
815-
case ESP_BLE_AD_TYPE_SM_OOB_FLAG: // 0x11
816-
return "ESP_BLE_AD_TYPE_SM_OOB_FLAG";
817-
case ESP_BLE_AD_TYPE_INT_RANGE: // 0x12
818-
return "ESP_BLE_AD_TYPE_INT_RANGE";
819-
case ESP_BLE_AD_TYPE_SOL_SRV_UUID: // 0x14
820-
return "ESP_BLE_AD_TYPE_SOL_SRV_UUID";
821-
case ESP_BLE_AD_TYPE_128SOL_SRV_UUID: // 0x15
822-
return "ESP_BLE_AD_TYPE_128SOL_SRV_UUID";
823-
case ESP_BLE_AD_TYPE_SERVICE_DATA: // 0x16
824-
return "ESP_BLE_AD_TYPE_SERVICE_DATA";
825-
case ESP_BLE_AD_TYPE_PUBLIC_TARGET: // 0x17
826-
return "ESP_BLE_AD_TYPE_PUBLIC_TARGET";
827-
case ESP_BLE_AD_TYPE_RANDOM_TARGET: // 0x18
828-
return "ESP_BLE_AD_TYPE_RANDOM_TARGET";
829-
case ESP_BLE_AD_TYPE_APPEARANCE: // 0x19
830-
return "ESP_BLE_AD_TYPE_APPEARANCE";
831-
case ESP_BLE_AD_TYPE_ADV_INT: // 0x1a
832-
return "ESP_BLE_AD_TYPE_ADV_INT";
833-
case ESP_BLE_AD_TYPE_32SOL_SRV_UUID: return "ESP_BLE_AD_TYPE_32SOL_SRV_UUID";
834-
case ESP_BLE_AD_TYPE_32SERVICE_DATA: // 0x20
835-
return "ESP_BLE_AD_TYPE_32SERVICE_DATA";
836-
case ESP_BLE_AD_TYPE_128SERVICE_DATA: // 0x21
837-
return "ESP_BLE_AD_TYPE_128SERVICE_DATA";
838-
case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: // 0xff
839-
return "ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE";
840-
#endif
841-
default: log_v(" adv data type: 0x%x", advType); return "";
842-
} // End switch
843-
} // advTypeToString
844-
845845
esp_gatt_id_t BLEUtils::buildGattId(esp_bt_uuid_t uuid, uint8_t inst_id) {
846846
esp_gatt_id_t retGattId;
847847
retGattId.uuid = uuid;
@@ -2076,31 +2076,6 @@ const char *BLEUtils::returnCodeToString(int rc) {
20762076
#endif // #if defined(CONFIG_NIMBLE_ENABLE_RETURN_CODE_TEXT)
20772077
}
20782078

2079-
/**
2080-
* @brief Convert the advertising type flag to a string.
2081-
* @param advType The type to convert.
2082-
* @return A string representation of the advertising flags.
2083-
*/
2084-
const char *BLEUtils::advTypeToString(uint8_t advType) {
2085-
#if defined(CONFIG_NIMBLE_ENABLE_ADVERTISMENT_TYPE_TEXT)
2086-
switch (advType) {
2087-
case BLE_HCI_ADV_TYPE_ADV_IND: //0
2088-
return "Undirected - Connectable / Scannable";
2089-
case BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_HD: //1
2090-
return "Directed High Duty - Connectable";
2091-
case BLE_HCI_ADV_TYPE_ADV_SCAN_IND: //2
2092-
return "Non-Connectable - Scan Response Available";
2093-
case BLE_HCI_ADV_TYPE_ADV_NONCONN_IND: //3
2094-
return "Non-Connectable - No Scan Response";
2095-
case BLE_HCI_ADV_TYPE_ADV_DIRECT_IND_LD: //4
2096-
return "Directed Low Duty - Connectable";
2097-
default: return "Unknown flag";
2098-
}
2099-
#else // #if defined(CONFIG_NIMBLE_ENABLE_ADVERTISMENT_TYPE_TEXT)
2100-
return "";
2101-
#endif // #if defined(CONFIG_NIMBLE_ENABLE_ADVERTISMENT_TYPE_TEXT)
2102-
} // adFlagsToString
2103-
21042079
/**
21052080
* @brief Utility function to log the gap event info.
21062081
* @param [in] event A pointer to the gap event structure.

libraries/BLE/src/BLEUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class BLEUtils {
6262

6363
static char *buildHexData(uint8_t *target, uint8_t *source, uint8_t length);
6464
static String buildPrintData(uint8_t *source, size_t length);
65-
static const char *advTypeToString(uint8_t advType);
65+
static const char *advDataTypeToString(uint8_t advType);
6666
static String characteristicPropertiesToString(uint8_t prop);
6767

6868
/***************************************************************************

0 commit comments

Comments
 (0)