Arduino ESP32中BLE体重测量特征0x2A9D无值输出求助
ESP32 BLE体重测量特征(0x2A9D)无输出问题排查方案
核心排查方向与解决步骤
检查0x2A9D特征的属性配置
体重测量特征需要支持读和通知属性,同时必须添加客户端配置描述符(0x2902)才能触发通知。确保创建特征的代码如下:BLECharacteristic *pWeightMeasChar = pWeightService->createCharacteristic( BLEUUID((uint16_t)0x2A9D), BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY ); pWeightMeasChar->addDescriptor(new BLE2902());严格匹配WSS/WSP文档的数据格式
0x2A9D的数据包结构为:1字节标志位 + 2字节(16位精度)体重数据,单位是0.05kg。你之前使用的{0x0A, 0xAA}不符合规范:- 标志位需设为
0x00(对应0x2A9E设置的0000:无时间戳、单用户、kg单位、16位精度) - 体重数据需按小端字节序拼接,比如50.0kg对应的计算:
50.0 / 0.05 = 1000,转成小端字节为0xE8, 0x03,完整数据包是{0x00, 0xE8, 0x03}
- 标志位需设为
确保字节序与数据发送逻辑正确
用代码实现正确的数据拼接与通知触发:// 示例:发送50.0kg的体重数据 uint16_t weightRaw = 1000; // 50.0kg / 0.05kg = 1000 uint8_t weightPacket[3] = {0x00}; // 标志位0x00 weightPacket[1] = weightRaw & 0xFF; // 低字节 weightPacket[2] = (weightRaw >> 8) & 0xFF; // 高字节 pWeightMeasChar->setValue(weightPacket, sizeof(weightPacket)); pWeightMeasChar->notify(); // 主动触发BLE通知验证0x2A9E的配置生效逻辑
在0x2A9E的写入回调中,确认客户端发送的配置命令被正确处理,比如收到0000时标记配置状态,后续体重数据输出匹配该配置:uint8_t weightConfig = 0x00; // 默认配置 class WeightConfigCallback : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string val = pCharacteristic->getValue(); if (val.size() == 2 && val[0] == 0x00 && val[1] == 0x00) { weightConfig = 0x00; Serial.println("已配置为无时间戳、单用户模式"); } } }; // 绑定回调到0x2A9E特征 pWeightConfigChar->setCallbacks(new WeightConfigCallback());调试验证
- 用nRF Connect等BLE工具直接读取0x2A9D特征,或监听通知通道
- 在代码中添加串口打印,输出待发送的数据包内容,确认格式正确:
Serial.print("体重数据包:"); for (int i=0; i<sizeof(weightPacket); i++) { Serial.print(weightPacket[i], HEX); Serial.print(" "); } Serial.println();
内容的提问来源于stack exchange,提问作者P_Master
相关产品推荐
相关产品推荐

