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

1 回复

更多关于uni-app 真机调试 uni.onBLECharacteristicValueChange 无法接收到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html


从代码分析来看,问题可能出现在以下几个方面:

  1. 监听时机问题
    uni.onBLECharacteristicValueChange 是全局监听,建议在页面初始化时(如 onLoad)提前注册,而不是在启用通知后才注册。当前代码在 notifyBLECharacteristicValueChange 成功回调中通过延时调用 onDataReceived,可能导致监听未及时生效。

  2. 特征值属性验证
    需确认目标特征值(characteristicId)是否支持 NOTIFYINDICATE 属性。可通过 uni.getBLEDeviceCharacteristics 检查特征值的 properties 是否包含对应权限。

  3. 设备兼容性与系统权限
    部分安卓机型对后台蓝牙监听有限制,需确保应用在前台运行。检查是否授予定位权限(安卓蓝牙扫描需要),并尝试在 onShow 生命周期中重新注册监听。

  4. 数据触发条件
    确保外设设备主动发送了数据。若外设仅在写入后回复,需结合 uni.writeBLECharacteristicValue 触发数据流。

建议调整代码:

  • uni.onBLECharacteristicValueChange 移至页面早期执行(如 onLoad)。
  • notifyBLECharacteristicValueChangesuccess 回调中直接处理数据,无需延时。
  • 添加特征值属性校验逻辑,示例:
    uni.getBLEDeviceCharacteristics({
      deviceId,
      serviceId,
      success: (res) => {
        const char = res.characteristics.find(c => c.uuid === characteristicId);
        if (!char.properties.notify) {
          console.error('特征值不支持通知功能');
        }
      }
    });
回到顶部