ESP32 在 BLE 扫描期间丢失名称

问题描述 投票:0回答:1

我正在运行 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
bluetooth arduino bluetooth-lowenergy esp32
1个回答
0
投票

BLE 外设可以使用“广告”或“扫描响应”数据包中的“长名称”或“短名称”记录来广告其名称。外设需要从四种可能的组合中选择一种。例如,基于 Arduino BLE 33 板的外设通常在“扫描响应”数据包中使用“长名称”记录。

如果您使用 ESP32 BLE Arduino 库为中央设备开发代码,可能会出现三个潜在问题:

1.该库不支持“短名称”记录

这意味着任何通过“短名称”记录宣传其名称的外设都将以空名称出现。

在团队(@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

2.您忘记使用 setActiveScan(true)

BLEDevice::getScan()->setActiveScan(true)
告诉库向外围设备请求“扫描响应”数据包。如果您不调用此函数,任何通过“扫描响应”数据包公布其名称的外设(例如 Arduino BLE 33)都将显示为空名称。

3.您正在使用默认的扫描间隔和窗口

在这个库中,默认的扫描间隔和窗口都是10ms。这似乎太小,无法请求(或接收)“扫描响应”数据包。至少使用:

BLEDevice::getScan()->setInterval(40);
BLEDevice::getScan()->setWindow(40);

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.