uni-app中uni.onBLECharacteristicValueChange没有监听到返回值
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. 确认监听的特征值正确
- 确保
serviceId
和characteristicId
是正确的,可以通过uni.getBLEDeviceCharacteristics
获取设备的特征值列表。 - 确保特征值支持
notify
或indicate
属性,只有支持这些属性的特征值才能被监听。
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.getBLEDeviceServices
和uni.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);
}
});