uni-app中uni.getBLEDeviceCharacteristics()获取蓝牙特征数据时缺少value字段

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

uni-app中uni.getBLEDeviceCharacteristics()获取蓝牙特征数据时缺少value字段

测试过的手机:

android

示例代码:

uni.getBLEDeviceCharacteristics({  
    deviceId: deviceID,  
    serviceId: BLE_VERSION,  
    success(res) {  
        console.log('device getBLEDeviceCharacteristics:', JSON.stringify(res.characteristics))  
    },  
    fail(error) {  
    }  
})

预期结果:

获取蓝牙特征值的value字段

实际结果:

bug描述:

根据 官网 uni.getBLEDeviceCharacteristics 文档显示,返回的res.characteristics字段只有uuid和properties,但其实在ios和Android中是都还有个value字段的,这也是蓝牙特征值的重要组成数据,例如可用于读取蓝牙的硬件、软件、固件版本, 不知道为什么不提供?


### 表格
| 信息类型       | 信息内容               |
|----------------|------------------------|
| 产品分类       | uniapp/App             |
| PC开发环境     | Windows                |
| PC开发环境版本 | Windows 10             |
| HBuilderX类型  | 正式                   |
| HBuilderX版本  | 3.99                   |
| 手机系统       | 全部                   |
| 手机厂商       | Android原生            |
| 页面类型       | vue                    |
| vue版本        | vue2                   |
| 打包方式       | 云端                   |
| 项目创建方式   | HBuilderX              |

1 回复

在uni-app中,uni.getBLEDeviceCharacteristics() 方法用于获取蓝牙设备的特征值(Characteristics)。如果在使用此方法时遇到返回的数据缺少 value 字段的情况,这通常意味着特征值在当前时刻没有变化或者设备本身就没有返回该特征值的数据。不过,value 字段的缺失也可能是因为调用时机或数据处理上的问题。

以下是一个完整的代码示例,展示了如何使用 uni.getBLEDeviceCharacteristics() 来获取蓝牙特征值,并处理可能缺少 value 字段的情况。

// 假设已经成功连接到蓝牙设备,并且deviceId是已知的
const deviceId = 'your-bluetooth-device-id';
const serviceId = 'your-bluetooth-service-id';

// 获取蓝牙设备的特征值
uni.getBLEDeviceCharacteristics({
    deviceId: deviceId,
    serviceId: serviceId,
    success: (res) => {
        console.log('获取特征值成功:', res.characteristics);
        
        // 遍历特征值
        res.characteristics.forEach((characteristic) => {
            const characteristicId = characteristic.uuid;
            
            // 读取特征值
            uni.readBLECharacteristicValue({
                deviceId: deviceId,
                serviceId: serviceId,
                characteristicId: characteristicId,
                success: (readValueRes) => {
                    console.log('读取特征值成功:', readValueRes);
                    
                    // 检查value字段是否存在
                    if (readValueRes.value) {
                        // value字段存在,进行数据处理
                        const value = readValueRes.value;
                        // 根据蓝牙协议解析value,这里只是示例
                        console.log('特征值:', new Uint8Array(value).reduce((data, byte) => data + byte.toString(16).padStart(2, '0') + ' ', ''));
                    } else {
                        // value字段不存在,可能需要重新读取或者处理错误
                        console.warn('特征值中缺少value字段');
                        // 可以尝试重新读取或者通知设备发送数据
                        // uni.notifyBLECharacteristicValueChange({...}); // 根据需要调用
                    }
                },
                fail: (err) => {
                    console.error('读取特征值失败:', err);
                }
            });
        });
    },
    fail: (err) => {
        console.error('获取特征值失败:', err);
    }
});

在上述代码中,我们首先通过 uni.getBLEDeviceCharacteristics() 获取设备的特征值列表,然后遍历这些特征值并使用 uni.readBLECharacteristicValue() 读取每个特征值。在读取成功的回调中,我们检查 readValueRes 是否包含 value 字段,并根据是否存在进行相应的处理。

请注意,如果设备本身就不发送某些特征值的数据,或者数据发送的时机与我们的读取操作不匹配,那么 value 字段可能会缺失。在实际应用中,可能需要结合设备的文档和通信协议来确保正确读取和处理数据。

回到顶部