uni-app中uni.onBLECharacteristicValueChange遇到的问题
uni-app中uni.onBLECharacteristicValueChange遇到的问题
问题描述
uni.onBLECharacteristicValueChange 无法监听到第二次 uni.writeBLECharacteristicValue 特征值写入。
流程描述
- 初始化蓝牙
- 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
- 监听蓝牙特征值变化
writeBLECharacteristicValue
下发参数给设备onBLECharacteristicValueChange
正常监听到特征值变化,成功获取报文- 获取到成功报文后再次启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值(此时的 uuid、服务 id、特征值 id 与第一次获取的一致)
onBLECharacteristicValueChange
未监听到特征值变化,无报文
解决方案
在 onBLECharacteristicValueChange
中获取到第一次成功报文后,断开与低功耗蓝牙设备的连接 uni.closeBLEConnection
,再次初始化蓝牙:
- 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
- 监听蓝牙特征值变化
writeBLECharacteristicValue
下发参数给设备- 成功获取到
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以及数据处理逻辑。同时,记得在不需要时关闭蓝牙连接和扫描,以节省资源。