uni-app 真机调试 uni.onBLECharacteristicValueChange 无法接收到数据
uni-app 真机调试 uni.onBLECharacteristicValueChange 无法接收到数据
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | win10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10
HBuilderX类型:正式
HBuilderX版本号:4.76
手机系统:Android
手机系统版本号:Android 9.0
手机厂商:华为
手机机型:Honor 7X
页面类型:vue
vue版本:vue2
打包方式:云端
项目创建方式:HBuilderX
### 示例代码:
```javascript
enableNotify(deviceId, serviceId, characteristicId) {
let that = this;
console.log('deviceId', deviceId);
console.log('serviceId', serviceId);
console.log('characteristicId', characteristicId);
uni.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId, // 目标特征值UUID
state: true, // 启用通知
success: (res) => {
console.log('通知启用成功', res)
// 监听硬件发送的数据
setTimeout(() => {
that.onDataReceived();
}, 1000)
},
fail: (err) => {
console.error('通知启用失败', err)
}
})
},
// 监听数据接收
onDataReceived() {
console.log('方法调用');
uni.onBLECharacteristicValueChange(function(res) {
console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
// console.log(ab2hex(res.value))
})
},
操作步骤:
按照文档开发
预期结果:
触发回调
实际结果:
不触发
bug描述:
蓝牙成功与设备连接,并成功调用 特征值通知,但是调用 uni.onBLECharacteristicValueChange 不触发,不打印也不报错
更多关于uni-app 真机调试 uni.onBLECharacteristicValueChange 无法接收到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app 真机调试 uni.onBLECharacteristicValueChange 无法接收到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html
从代码分析来看,问题可能出现在以下几个方面:
-
监听时机问题
uni.onBLECharacteristicValueChange是全局监听,建议在页面初始化时(如onLoad)提前注册,而不是在启用通知后才注册。当前代码在notifyBLECharacteristicValueChange成功回调中通过延时调用onDataReceived,可能导致监听未及时生效。 -
特征值属性验证
需确认目标特征值(characteristicId)是否支持NOTIFY或INDICATE属性。可通过uni.getBLEDeviceCharacteristics检查特征值的properties是否包含对应权限。 -
设备兼容性与系统权限
部分安卓机型对后台蓝牙监听有限制,需确保应用在前台运行。检查是否授予定位权限(安卓蓝牙扫描需要),并尝试在onShow生命周期中重新注册监听。 -
数据触发条件
确保外设设备主动发送了数据。若外设仅在写入后回复,需结合uni.writeBLECharacteristicValue触发数据流。
建议调整代码:
- 将
uni.onBLECharacteristicValueChange移至页面早期执行(如onLoad)。 - 在
notifyBLECharacteristicValueChange的success回调中直接处理数据,无需延时。 - 添加特征值属性校验逻辑,示例:
uni.getBLEDeviceCharacteristics({ deviceId, serviceId, success: (res) => { const char = res.characteristics.find(c => c.uuid === characteristicId); if (!char.properties.notify) { console.error('特征值不支持通知功能'); } } });

