uni-app中uni.onBLECharacteristicValueChange遇到的问题

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

uni-app中uni.onBLECharacteristicValueChange遇到的问题

问题描述

uni.onBLECharacteristicValueChange 无法监听到第二次 uni.writeBLECharacteristicValue 特征值写入。

流程描述

  1. 初始化蓝牙
  2. 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
  3. 监听蓝牙特征值变化
  4. writeBLECharacteristicValue 下发参数给设备
  5. onBLECharacteristicValueChange 正常监听到特征值变化,成功获取报文
  6. 获取到成功报文后再次启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值(此时的 uuid、服务 id、特征值 id 与第一次获取的一致)
  7. onBLECharacteristicValueChange 未监听到特征值变化,无报文

解决方案

onBLECharacteristicValueChange 中获取到第一次成功报文后,断开与低功耗蓝牙设备的连接 uni.closeBLEConnection,再次初始化蓝牙:

  1. 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
  2. 监听蓝牙特征值变化
  3. writeBLECharacteristicValue 下发参数给设备
  4. 成功获取到 onBLECharacteristicValueChange 特征值变化,成功获取报文

1 回复

在uni-app中使用uni.onBLECharacteristicValueChange监听蓝牙设备的特征值变化时,确实可能会遇到一些问题。这些问题通常与权限管理、设备连接状态、特征值读取权限以及数据处理等方面有关。以下是一个简化的代码示例,展示了如何使用uni.onBLECharacteristicValueChange,并附上了一些常见的错误处理和数据解析的代码片段。

// 初始化蓝牙适配器
uni.openBluetoothAdapter({
    success: function (res) {
        console.log('蓝牙适配器初始化成功', res);
        // 开始扫描蓝牙设备
        uni.startBluetoothDevicesDiscovery({
            allowDuplicatesKey: false,
            success: function (devicesRes) {
                console.log('开始扫描设备', devicesRes);
                // 假设已经找到目标设备,并获取到deviceId
                let deviceId = 'your_device_id';
                // 连接到蓝牙设备
                uni.createBLEConnection({
                    deviceId: deviceId,
                    success: function (connRes) {
                        console.log('连接成功', connRes);
                        // 获取服务
                        uni.getBLEDeviceServices({
                            deviceId: deviceId,
                            success: function (servicesRes) {
                                let serviceId = 'your_service_id'; // 假设已知服务ID
                                // 获取特征值
                                uni.getBLEDeviceCharacteristics({
                                    deviceId: deviceId,
                                    serviceId: serviceId,
                                    success: function (charsRes) {
                                        let characteristicId = 'your_characteristic_id'; // 假设已知特征值ID
                                        // 启用通知
                                        uni.notifyBLECharacteristicValueChange({
                                            state: true,
                                            deviceId: deviceId,
                                            serviceId: serviceId,
                                            characteristicId: characteristicId,
                                            success: function (notifyRes) {
                                                console.log('启用通知成功', notifyRes);
                                                // 监听特征值变化
                                                uni.onBLECharacteristicValueChange(function (changeRes) {
                                                    console.log('特征值变化', changeRes);
                                                    // 解析数据,例如假设数据是16进制字符串
                                                    let hexData = uni.arrayBufferToHexString(changeRes.value);
                                                    console.log('解析后的数据', hexData);
                                                });
                                            }
                                        });
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    },
    fail: function (err) {
        console.error('蓝牙适配器初始化失败', err);
    }
});

// 工具函数:将ArrayBuffer转换为16进制字符串
function arrayBufferToHexString(buffer) {
    let hexArr = Array.from({ length: buffer.byteLength }, (_, i) => {
        const byte = buffer.getUint8(i);
        return (`0${byte.toString(16)}`).slice(-2);
    });
    return hexArr.join('');
}

上述代码展示了从初始化蓝牙适配器到监听特征值变化的完整流程,并提供了将接收到的ArrayBuffer数据转换为16进制字符串的工具函数。在实际应用中,你需要根据具体的蓝牙设备和协议,调整服务ID、特征值ID以及数据处理逻辑。同时,记得在不需要时关闭蓝牙连接和扫描,以节省资源。

回到顶部