uni-app Android下蓝牙监听特征值变化回调不执行
uni-app Android下蓝牙监听特征值变化回调不执行
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 10 | HBuilderX |
示例代码:
{
"uuid": "CBA1D466-344C-4BE3-AB3F-189F80DD7518",
"properties": {
"read": true,
"write": true,
"notify": true,
"indicate": true
}
}
uni.notifyBLECharacteristicValueChange({
state: true,
deviceId: deviceId, // 设备ID
serviceId: serviceId, // 服务UUID,
characteristicId: characteristicId, // 这里的特征值就是上方获取的,支持notify
success(res) {
listenValueChange()
},
fail(err) {
console.error(err)
}
})
function listenValueChange() {
uni.onBLECharacteristicValueChange(res => {
console.log('监听到数据了');
// 结果里有个value值,该值为 ArrayBuffer 类型,所以在控制台无法用肉眼观察到,必须将该值转换为16进制
let resHex = ab2hex(res.value)
// 最后将16进制转换为ascii码,就能看到对应的结果
let result = hexCharCodeToStr(resHex)
console.log(JSON.parse(result).diameter)
uni.$emit('diameter', JSON.parse(result).diameter)
})
}
1:在Android上使用BLE调试助手,发现没有问题,可以正常接收
2:改用plus api方式调用蓝牙,同样无法收到通知
开发过程中发现uni.startBluetoothDevicesDiscovery方法中的参数services必须使用大写的serviceId才可以搜寻到,不知道characteristicId,serviceId这些大小写是否有影响,硬件给到的这两个值都是小写的
有没有官方大佬看下
兄弟搞出来了吗
确实收不到,他大爷的,折腾两天也没搞出来,就卡到最后一步了,实测,用苹果可以收到
没有解决,插件市场的也不行,plus api也用过了,没用,真的脑壳疼
onBLECharacteristicValueChange android无返回值
【报Bug】蓝牙uni.onBLECharacteristicValueChange在安卓端微信小程序无效
去年就有这个问题了,一年多了还没修复
我解决了,官方太懒,文档不写清除点。。。
在蓝牙连接后加入代码
uni.setBLEMTU({
deviceId: deviceId,
mtu: 247 //根据硬件情况设置,否则会报错
});
一点问题都没有
我加了这个还是不行,不知道是不是我的使用姿势不对,但ios好好的。。。
回复 久智环境: IOS不用加就可以,你看看是不是加错地方了,同时在setBLEMTU内部打印执行结果看看有没有报错
回复 追梦随想: setBLEMTU我是放在createBLEConnection成功的回调函数里执行的,ios确实不用加就可以,安卓的我加了也没用,我都怀疑是设备问题,但是我用其他的蓝牙工具又可以
回复 久智环境: 可以问问硬件佬,或者推荐你一个测试蓝牙的小程序:易加蓝牙助手,图标是饿了么的。。。连接上去试试,如果能收到,那就是你代码问题,不能收到就是设备问题
回复 追梦随想: 能给我看看你的代码吗,我的代码顺序是openBluetoothAdapter,startBluetoothDevicesDiscovery,onBluetoothDeviceFound,createBLEConnection,stopBluetoothDevicesDiscovery,setBLEMTU,notifyBLECharacteristicValueChange(这里是提前知道了serviceId和characteristicId),onBLECharacteristicValueChange,我代码看着没有任何问题呀
我的是Android可以执行,ios时行时不行
不好意思,刚看到,这是全部代码,页面是用我的UI框架 dm-ui
在 uni-app
中,使用蓝牙功能时,监听特征值变化的回调不执行,可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决:
1. 确保蓝牙设备已连接
- 在监听特征值变化之前,确保蓝牙设备已成功连接。
- 使用
uni.createBLEConnection
连接设备,并通过onBLEConnectionStateChange
监听连接状态。
2. 确保已启用通知
- 监听特征值变化需要先启用通知(Notify)。
- 使用
uni.notifyBLECharacteristicValueChange
方法启用通知,并确保传入正确的deviceId
、serviceId
和characteristicId
。
uni.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
state: true, // 启用通知
success(res) {
console.log('通知启用成功', res);
},
fail(err) {
console.error('通知启用失败', err);
}
});
3. 正确监听特征值变化
- 使用
uni.onBLECharacteristicValueChange
监听特征值变化。 - 确保在启用通知后,再调用监听方法。
uni.onBLECharacteristicValueChange((res) => {
console.log('特征值变化', res);
// 处理特征值变化
});
4. 检查特征值是否支持通知
- 不是所有的特征值都支持通知(Notify)。
- 使用
uni.getBLEDeviceCharacteristics
获取特征值属性,检查properties
是否包含notify
。
uni.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId,
success(res) {
console.log('特征值属性', res.characteristics);
// 检查 properties 是否包含 notify
}
});
5. 检查权限
- 确保应用已获取蓝牙相关权限。
- 在
Android
中,需要在manifest.json
中声明蓝牙权限:
{
"permission": {
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.ACCESS_FINE_LOCATION"
}
}
6. 调试日志
- 在关键步骤中添加日志,检查是否有错误信息。
- 使用
console.log
或uni.showToast
输出调试信息。
7. 检查设备兼容性
- 某些蓝牙设备可能存在兼容性问题,尝试更换设备测试。
8. 更新 uni-app 版本
- 确保使用的
uni-app
版本是最新的,旧版本可能存在蓝牙相关 Bug。
示例代码
以下是一个完整的示例代码:
// 连接设备
uni.createBLEConnection({
deviceId: deviceId,
success(res) {
console.log('设备连接成功', res);
// 获取服务
uni.getBLEDeviceServices({
deviceId: deviceId,
success(res) {
console.log('服务列表', res.services);
// 获取特征值
uni.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId,
success(res) {
console.log('特征值列表', res.characteristics);
// 启用通知
uni.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
state: true,
success(res) {
console.log('通知启用成功', res);
// 监听特征值变化
uni.onBLECharacteristicValueChange((res) => {
console.log('特征值变化', res);
});
},
fail(err) {
console.error('通知启用失败', err);
}
});
}
});
}
});
},
fail(err) {
console.error('设备连接失败', err);
}
});