我正在运行 ESP32 示例中的示例代码,并且正在扫描可用的 BLE 设备。我可以看到设备 MAC 地址等。但对于少数设备,我看不到它们的名称。
我正在使用 ESP-WROOM-32,并直接从其 github 中查看硬件支持。
当我使用 LightBlue 应用程序发现 BLE 时设备 我能看到的设备名称比 ESP 能看到的设备多。我可以更改什么才能正确查看名称?或者我如何从我收到的数据中解析设备名称?
此回调代码
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
Serial.print(" RSSI: ");
Serial.println(advertisedDevice.getRSSI());
}
};
产生以下输出:
Advertised Device: Name: , Address: 1d:0c:c7:3a:fb:c6, manufacturer data: 4c0009060378c0a81f12, payload: 1073609632
RSSI: -75
BLE 外设可以使用“广告”或“扫描响应”数据包中的“长名称”或“短名称”记录来广告其名称。外设需要从四种可能的组合中选择一种。例如,基于 Arduino BLE 33 板的外设通常在“扫描响应”数据包中使用“长名称”记录。
如果您使用 ESP32 BLE Arduino 库为中央设备开发代码,可能会出现三个潜在问题:
这意味着任何通过“短名称”记录宣传其名称的外设都将以空名称出现。
在团队(@chegewara)修复此问题之前,您可以轻松地在本地库中自行修复它。找到文件
BLEAdvertisedDevice.cpp
并在第 296 行之前添加 case ESP_BLE_AD_TYPE_NAME_SHORT:
。
初始代码为:
switch(ad_type) {
case ESP_BLE_AD_TYPE_NAME_CMPL: { // Adv Data Type: 0x09
setName(std::string(reinterpret_cast<char*>(payload), length));
break;
} // ESP_BLE_AD_TYPE_NAME_CMPL
并且应该变成:
switch(ad_type) {
case ESP_BLE_AD_TYPE_NAME_SHORT:
case ESP_BLE_AD_TYPE_NAME_CMPL: { // Adv Data Type: 0x09
setName(std::string(reinterpret_cast<char*>(payload), length));
break;
} // ESP_BLE_AD_TYPE_NAME_CMPL
BLEDevice::getScan()->setActiveScan(true)
告诉库向外围设备请求“扫描响应”数据包。如果您不调用此函数,任何通过“扫描响应”数据包公布其名称的外设(例如 Arduino BLE 33)都将显示为空名称。
在这个库中,默认的扫描间隔和窗口都是10ms。这似乎太小,无法请求(或接收)“扫描响应”数据包。至少使用:
BLEDevice::getScan()->setInterval(40);
BLEDevice::getScan()->setWindow(40);
希望这有帮助。