You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-C3 Super Mini BLE异常:仅服务内首个定义特征可被nRF识别

ESP32 BLE特征仅首个可见问题排查与解决

问题描述

我用Platform IO开发ESP32 BLE项目时遇到异常:定义BLE服务的多个特征后,nRF工具里始终只能显示第一个被添加到服务的特征。我试过交换两个特征的定义顺序,每个特征单独工作都正常,但只要是第二个添加的特征,就无法在工具中被识别。

原代码示例

void setup() 
{
    Serial.begin(115200);
    pinMode(BUTTON_PIN, INPUT);
    Serial.println("START");

    // 初始化BLE设备
    BLEDevice::init("ESP32_BLE");

    // 创建BLE服务器
    BLEServer *pServer = BLEDevice::createServer();
    pServer->setCallbacks(new MyServerCallbacks());

    // 创建BLE服务
    BLEService *pService = pServer->createService(SERVICE_UUID);

    // 创建用于接收数据的特征(Write属性)
    pReceiveCharacteristic = pService->createCharacteristic(RECEIVE_UUID, BLECharacteristic::PROPERTY_WRITE);
    pReceiveCharacteristic->setCallbacks(new MyCallbacks());

    // 创建用于按钮的特征(Notify属性)
    pButtonCharacteristic = pService->createCharacteristic(BUTTON_UUID,BLECharacteristic::PROPERTY_NOTIFY);

    // 启动BLE服务
    pService->start();
    BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
    pAdvertising->addServiceUUID(SERVICE_UUID);
    pAdvertising->start();

    Serial.println("BLE ready, waiting for connections...");
}

解决方法

  • 检查UUID合法性:确保RECEIVE_UUID和BUTTON_UUID是符合BLE规范的16位或128位UUID,且两个UUID不重复。
  • 为Notify特征添加CCCD描述符:Notify类型的特征必须搭配Client Characteristic Configuration Descriptor(CCCD),否则部分BLE工具无法正确识别该特征。在创建Notify特征后添加以下代码:
    pButtonCharacteristic->addDescriptor(new BLE2902());
    
  • 确保服务启动前完成所有特征配置:所有特征的创建和配置操作必须在pService->start()调用前完成,服务启动后无法再添加新特征。
  • 清除nRF工具缓存:部分情况下工具会缓存旧的服务数据,断开连接后清除工具缓存,再重新扫描连接即可。

修改后代码示例

void setup() 
{
    Serial.begin(115200);
    pinMode(BUTTON_PIN, INPUT);
    Serial.println("START");

    // 初始化BLE设备
    BLEDevice::init("ESP32_BLE");

    // 创建BLE服务器
    BLEServer *pServer = BLEDevice::createServer();
    pServer->setCallbacks(new MyServerCallbacks());

    // 创建BLE服务
    BLEService *pService = pServer->createService(SERVICE_UUID);

    // 创建用于接收数据的特征(Write属性)
    pReceiveCharacteristic = pService->createCharacteristic(RECEIVE_UUID, BLECharacteristic::PROPERTY_WRITE);
    pReceiveCharacteristic->setCallbacks(new MyCallbacks());

    // 创建用于按钮的特征(Notify属性)
    pButtonCharacteristic = pService->createCharacteristic(BUTTON_UUID, BLECharacteristic::PROPERTY_NOTIFY);
    // 添加CCCD描述符,使Notify特征可被识别
    pButtonCharacteristic->addDescriptor(new BLE2902());

    // 启动BLE服务
    pService->start();
    BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
    pAdvertising->addServiceUUID(SERVICE_UUID);
    pAdvertising->start();

    Serial.println("BLE ready, waiting for connections...");
}

内容的提问来源于stack exchange,提问作者Matteo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:31:13