uniapp uni.onblecharacteristicvaluechange无效是怎么回事?

在uniapp中使用uni.onBLECharacteristicValueChange监听蓝牙特征值变化时,回调函数不触发是怎么回事?

具体环境:HBuilderX 3.6.18,测试机型小米10。已正确执行uni.notifyBLECharacteristicValueChange并返回成功,但onBLECharacteristicValueChange始终没有触发回调。其他蓝牙接口如uni.onBLEConnectionStateChange都能正常使用。

尝试过:1.确认characteristicId正确;2.重新连接设备;3.更换不同蓝牙设备测试。问题依旧存在,请问可能是什么原因导致的?是否需要特殊配置?


2 回复

可能原因:

  1. 未正确监听特征值变化
  2. 设备未连接或特征值不可用
  3. 特征值UUID错误
  4. 未启用特征值通知

检查步骤:

  1. 确保设备已连接
  2. 确认特征值支持通知
  3. 先调用notifyBLECharacteristicValueChange启用通知
  4. 再监听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. 特征值属性问题

确保特征值支持 notifyindicate 属性:

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)
  }
}

检查以上几点,通常能解决监听无效的问题。

回到顶部