Android App读取BLE温度计Indicate温度数据失败问题求助
排查BLE温度计Indicate数据无法接收的问题
优先排查设备与nRF Connect操作(nRF也收不到数据,说明问题可能不在App代码)
- 确认温度计触发逻辑:多数BLE温度计需要手动按下设备测量按键才会推送温度数据,并非自动持续发送,先按设备按键测试
- 检查设备电量:低电量会导致BLE模块工作异常,更换电池后重试
- 规范nRF Connect操作流程:
- 连接设备后,找到
温度测量特征(UUID: 00002A1C-0000-1000-8000-00805f9b34fb) - 点击特征右侧的
Indicate开关,进入特征详情页找到Client Characteristic Configuration Descriptor(UUID: 00002902-0000-1000-8000-00805f9b34fb) - 手动写入
0x0002(对应ENABLE_INDICATION_VALUE),确认日志显示写入成功 - 触发设备测量,查看nRF日志是否有数据接收
- 连接设备后,找到
Android App代码优化与排查
你的代码存在异步操作时序问题:BLE操作是异步执行的,直接连续调用setCharacteristicNotification和writeDescriptor可能导致配置失效,且未确认Descriptor写入结果。
优化后代码示例
private final UUID temperatureServiceUuid = UUID.fromString("00001809-0000-1000-8000-00805f9b34fb"); private final UUID temperatureMeasureUuid = UUID.fromString("00002A1C-0000-1000-8000-00805f9b34fb"); private final UUID temperatureDescriptorUuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); public void enableTemperatureIndication() { // 获取温度服务 BluetoothGattService service = mBluetoothGatt.getService(temperatureServiceUuid); if (service == null) return; // 获取温度测量特征 BluetoothGattCharacteristic characteristic = service.getCharacteristic(temperatureMeasureUuid); if (characteristic == null) return; // 第一步:开启通知开关 boolean notificationSet = mBluetoothGatt.setCharacteristicNotification(characteristic, true); if (!notificationSet) return; // 获取配置Descriptor BluetoothGattDescriptor descriptor = characteristic.getDescriptor(temperatureDescriptorUuid); if (descriptor == null) return; // 第二步:写入Indicate启用值 descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } // 必须实现完整的BluetoothGattCallback处理回调 private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorWrite(gatt, descriptor, status); if (status == BluetoothGatt.GATT_SUCCESS) { // Descriptor写入成功,Indicate正式启用 } } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { super.onCharacteristicChanged(gatt, characteristic); if (temperatureMeasureUuid.equals(characteristic.getUuid())) { // 解析温度数据(标准0x2A1C格式) float temperature = parseTemperatureData(characteristic.getValue()); } } }; // 解析标准温度测量特征数据 private float parseTemperatureData(byte[] data) { if (data == null || data.length < 3) return 0f; // 取第1-2字节作为16位有符号整数,乘以0.01得到温度值 int tempRaw = (data[1] & 0xFF) | ((data[2] & 0xFF) << 8); return tempRaw * 0.01f; }
额外排查点
- 确认
BluetoothGattCallback已正确绑定到BluetoothGatt实例,且onCharacteristicChanged方法未被错误覆盖 - 检查App权限:Android 12+需申请
BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限;低版本需ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限 - 在
onConnectionStateChange回调中监控设备连接状态,确保数据推送时设备处于连接状态
内容的提问来源于stack exchange,提问作者Srikanth Sridharan
相关产品推荐
相关产品推荐

