如何在nrfcloud扩展显示位数,实现0-32000整数数据上传?
解决nrf52 DK向nrfcloud上传16位整数的方案
你现在要解决的核心问题是把原来8位无符号整数(0-255,对应0xFF)的传输逻辑,改成支持16位无符号整数(0-65535)的传输,需要从GATT特征定义、代码数据打包、nrfcloud解析规则三个方面调整,具体步骤如下:
1. 修改GATT特征的数据长度定义
首先要调整你用来发送通知的GATT特征,把原来的1字节存储改成2字节:
- 找到项目中定义特征值的变量,原来的
uint8_t m_char_value = 0;要改成uint16_t m_char_value = 0;,这样就能容纳0-65535的数值了。 - 接着在添加特征的代码段里,把特征属性的长度参数更新为2字节:
这里要确保ble_gatts_attr_t attr_char_value = { .p_uuid = &YOUR_CHARACTERISTIC_UUID, // 替换成你实际使用的特征UUID .p_attr_md = &attr_md, .init_len = sizeof(m_char_value), // 现在是2字节 .max_len = sizeof(m_char_value), .p_value = (uint8_t *)&m_char_value };max_len不小于2,否则发送超过1字节的数据会触发错误。
2. 调整数据上传的字节打包逻辑
蓝牙GATT传输是按字节流发送的,16位整数需要拆成两个字节(nrfcloud默认用小端字节序解析):
- 假设你要发送的数值是
uint16_t sensor_val = 32000;,可以这样打包:uint8_t tx_data[2]; tx_data[0] = sensor_val & 0xFF; // 低字节 tx_data[1] = (sensor_val >> 8) & 0xFF; // 高字节 - 然后在调用
ble_gatts_hvx发送通知时,把hvx_params里的p_data指向tx_data,len设置为2:
如果你用的是nrfconnect SDK的封装函数,也要确保发送的字节数设置为2。ble_gatts_hvx_params_t hvx_params = { .handle = m_char_handles.value_handle, .type = BLE_GATT_HVX_NOTIFICATION, .offset = 0, .p_data = tx_data, .len = sizeof(tx_data) }; ret_code_t err_code = ble_gatts_hvx(m_conn_handle, &hvx_params, &len);
3. 更新nrfcloud的Payload解析器
最后要让nrfcloud正确解析收到的2字节数据:
- 登录nrfcloud后台,找到你的设备,进入Payload Formatters页面。
- 原来的解析代码是把单字节转成uint8,现在要改成解析双字节的uint16,小端序的解析代码如下:
保存后,nrfcloud就能正确显示0-65535的数值了。function decodeUplink(input) { // 小端字节序转16位无符号整数 const sensorValue = (input.bytes[1] << 8) | input.bytes[0]; return { data: { value: sensorValue }, warnings: [], errors: [] }; }
4. 测试验证
烧录修改后的代码到nrf52 DK,尝试发送几个测试值(比如0、256、32000、65535),查看nrfcloud上的显示是否和你发送的一致,确认不会再出现到0xFF就重置的问题。
内容的提问来源于stack exchange,提问作者M. Suarez
相关产品推荐
相关产品推荐

