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
相关产品推荐
相关产品推荐

