uniapp uni.onblecharacteristicvaluechange无效是怎么回事?
在uniapp中使用uni.onBLECharacteristicValueChange监听蓝牙特征值变化时,回调函数不触发是怎么回事?
具体环境:HBuilderX 3.6.18,测试机型小米10。已正确执行uni.notifyBLECharacteristicValueChange并返回成功,但onBLECharacteristicValueChange始终没有触发回调。其他蓝牙接口如uni.onBLEConnectionStateChange都能正常使用。
尝试过:1.确认characteristicId正确;2.重新连接设备;3.更换不同蓝牙设备测试。问题依旧存在,请问可能是什么原因导致的?是否需要特殊配置?
2 回复
可能原因:
- 未正确监听特征值变化
- 设备未连接或特征值不可用
- 特征值UUID错误
- 未启用特征值通知
检查步骤:
- 确保设备已连接
- 确认特征值支持通知
- 先调用notifyBLECharacteristicValueChange启用通知
- 再监听onBLECharacteristicValueChange
uni.onBLECharacteristicValueChange 监听无效通常由以下原因导致:
1. 监听时机问题
必须在连接蓝牙设备并成功获取服务后设置监听:
// 正确顺序
uni.createBLEConnection({ deviceId })
.then(() => uni.getBLEDeviceServices({ deviceId }))
.then(() => uni.getBLEDeviceCharacteristics({
deviceId,
serviceId: 'your-service-id'
}))
.then(() => {
// 在此处设置监听
uni.onBLECharacteristicValueChange((res) => {
console.log('特征值变化:', res)
})
// 然后启用通知
uni.notifyBLECharacteristicValueChange({
deviceId,
serviceId: 'your-service-id',
characteristicId: 'your-characteristic-id',
state: true
})
})
2. 特征值属性问题
确保特征值支持 notify 或 indicate 属性:
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId: 'your-service-id'
}).then(res => {
const char = res.characteristics.find(c =>
c.uuid === 'your-characteristic-id'
)
console.log('特征属性:', char.properties)
// 必须包含 notify 或 indicate
})
3. 平台差异
- iOS:需要设置特征值的
notify为 true - Android:部分设备需要先读取一次特征值
4. 完整示例
async function setupBLE() {
try {
await uni.createBLEConnection({ deviceId })
await uni.getBLEDeviceServices({ deviceId })
await uni.getBLEDeviceCharacteristics({
deviceId,
serviceId: 'your-service-id'
})
// 设置监听
uni.onBLECharacteristicValueChange(res => {
console.log('接收到数据:', res.value)
})
// 启用通知
await uni.notifyBLECharacteristicValueChange({
deviceId,
serviceId: 'your-service-id',
characteristicId: 'your-characteristic-id',
state: true
})
} catch (error) {
console.error('蓝牙设置失败:', error)
}
}
检查以上几点,通常能解决监听无效的问题。

