uni-app中uni.onBLECharacteristicValueChange没有监听到返回值

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app中uni.onBLECharacteristicValueChange没有监听到返回值

开发环境 版本号 项目创建方式
Windows Windows 10 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.98

手机系统:Android

手机系统版本号:Android 12

手机厂商:华为

手机机型:mate30

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

示例代码:

that.devices = uni.getStorageSync('devices');
const serviceId = uni.getStorageSync('serviceId');
const characteristicId = uni.getStorageSync('characteristicId');
console.log(that.devices,characteristicId,serviceId)
uni.notifyBLECharacteristicValueChange({ //启用低功耗蓝牙设备特征值变化时的 notify 功能
state: true,
deviceId: that.devices,
serviceId: serviceId,
characteristicId: characteristicId,
success(res) {
uni.onBLECharacteristicValueChange(res => {  //监听返回
const json = command.hex2jsonBuf(res.value)

操作步骤:

首次连接蓝牙设备,发送指令后无法监听到返回值

预期结果:

蓝牙连接成功后,发送指令就可以监听到返回值

实际结果:

首次连接蓝牙设备,发送指令后无法监听到返回值,需要反复将蓝牙设备断开重启几次后才能监听到返回值

bug描述:

在tabBar页面,将监听返回的方法放在onShow中,蓝牙连接上硬件设备后,发送指令给设备后没有监听到返回值,需要反复将蓝牙设备断开重启几次后才能监听到返回值(目前测试的所有安卓型号手机都有这个问题),使用原生开发工具发送指令后返回值正常,没有这个问题


1 回复

在 Uni-app 中使用 uni.onBLECharacteristicValueChange 监听蓝牙设备特征值变化时,如果没有监听到返回值,可能是以下原因导致的。以下是一些排查和解决问题的步骤:


1. 确认蓝牙设备连接成功

  • 确保设备已经成功连接,可以使用 uni.getConnectedBluetoothDevices 检查设备连接状态。
  • 确保设备和手机之间的蓝牙连接是稳定的。

2. 确认监听的特征值正确

  • 确保 serviceIdcharacteristicId 是正确的,可以通过 uni.getBLEDeviceCharacteristics 获取设备的特征值列表。
  • 确保特征值支持 notifyindicate 属性,只有支持这些属性的特征值才能被监听。

3. 开启特征值通知

在监听之前,需要先启用特征值的通知功能,使用 uni.notifyBLECharacteristicValueChange

uni.notifyBLECharacteristicValueChange({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: characteristicId,
    state: true, // 开启通知
    success(res) {
        console.log('通知开启成功');
    },
    fail(err) {
        console.error('通知开启失败', err);
    }
});

如果这一步失败了,监听就不会生效。


4. 正确使用 uni.onBLECharacteristicValueChange

  • 确保在 uni.notifyBLECharacteristicValueChange 成功回调后再监听特征值变化。
  • 示例代码:
    uni.onBLECharacteristicValueChange((res) => {
        console.log('特征值变化:', res);
        // 处理返回的数据
    });

5. 检查设备是否发送数据

  • 确保蓝牙设备确实发送了数据到特征值。
  • 可以通过其他工具(如 nRF Connect)验证设备是否正常发送数据。

6. 调试和日志

  • 在关键步骤(如连接设备、开启通知、监听)中添加日志,检查是否有错误。
  • 使用 uni.getBLEDeviceServicesuni.getBLEDeviceCharacteristics 检查服务和特征值是否正确。

7. 权限和系统限制

  • 确保应用已经获取了蓝牙权限(在 manifest.json 中配置)。
  • 某些手机系统可能会限制后台蓝牙操作,确保应用在前台运行。

8. 示例完整代码

以下是一个完整的示例代码:

// 连接设备
uni.createBLEConnection({
    deviceId: deviceId,
    success(res) {
        console.log('设备连接成功');

        // 获取服务
        uni.getBLEDeviceServices({
            deviceId: deviceId,
            success(res) {
                console.log('获取服务成功', res.services);
                const serviceId = res.services[0].uuid; // 假设使用第一个服务

                // 获取特征值
                uni.getBLEDeviceCharacteristics({
                    deviceId: deviceId,
                    serviceId: serviceId,
                    success(res) {
                        console.log('获取特征值成功', res.characteristics);
                        const characteristicId = res.characteristics[0].uuid; // 假设使用第一个特征值

                        // 开启通知
                        uni.notifyBLECharacteristicValueChange({
                            deviceId: deviceId,
                            serviceId: serviceId,
                            characteristicId: characteristicId,
                            state: true,
                            success(res) {
                                console.log('通知开启成功');

                                // 监听特征值变化
                                uni.onBLECharacteristicValueChange((res) => {
                                    console.log('特征值变化:', res);
                                });
                            },
                            fail(err) {
                                console.error('通知开启失败', err);
                            }
                        });
                    },
                    fail(err) {
                        console.error('获取特征值失败', err);
                    }
                });
            },
            fail(err) {
                console.error('获取服务失败', err);
            }
        });
    },
    fail(err) {
        console.error('设备连接失败', err);
    }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!