HarmonyOS 鸿蒙Next BLE低功耗蓝牙扫描设备ID变动问题
HarmonyOS 鸿蒙Next BLE低功耗蓝牙扫描设备ID变动问题
现在就是h5端会给我一个deviceId就是蓝牙地址去连接指定蓝牙,如下图
但是怎么也连接不了,然后我自己对设备进行了扫描,发现扫描到的那个蓝牙设备地址和给我的蓝牙地址不一致,我查阅文档后发现鸿蒙端的蓝牙地址会动态变化的,那么我该怎么根据给我的地址去连接指定蓝牙呢,毕竟蓝牙地址不一致,根本连接不上。
你好,可以参考下面的帖子:https://developer.huawei.com/consumer/cn/forum/topic/0203153618195564024?fid=0109140870620153026
方案一:通过设备广播截取 扫描设备的时候可以获取设备的广播数据,设备的 mac地址一般包含在特定位置,
/**
* 通过广播数据获取血糖设备mac
* [@param](/user/param) data
* [@returns](/user/returns) FF-FF-11-57-B6-5B
*/
getMac(data: ArrayBuffer) {
// 1. Uint8Array处理二进制(高效)
const arr = new Uint8Array(data).slice(6, 12)
let mac = ''
// 2. 转换 16 进制
arr.forEach((item, i) => {
mac += i === 0 ? '' : '-'
mac += item.toString(16)
.padStart(2, '0')
.toUpperCase()
})
return mac
}
方案二:通过给设备名称添加标识 falg 方式匹配,核心代码如下:
const validDevices = devices.filter(dv => {
if (scanFilter.type === 'mac') {
let flag: boolean
if (!scanFilter.door) {
// 广播匹配
flag = this.getMac(dv.data) === scanFilter.value
} else {
// 名称 falg匹配
flag = this.isMatchDoor(scanFilter.value, dv.deviceName)
}
return list.some(item => item.deviceId === dv.deviceId) === false && flag
} else {
return list.some(item => item.deviceId === dv.deviceId) === false &&
dv.deviceName.startsWith(scanFilter.value)
}
})
言外之意:不同的两个端的蓝牙(H5页面端和手机端)去连接另外的蓝牙(物联网设备蓝牙模块)蓝牙模块分配给到不同设备之间的地址是随机的,那必然是不一样的。你自己可以尝试用3台手机同时开启蓝牙做测试看看,手机1和手机2同时去连手机3的蓝牙,配对成功之前会分配一个配对码,这两个配对码是不一样的。所以,解决这个蓝牙连接问题的关键是:你这种通过H5给你的蓝牙地址去用客户端连接,这个方向就是错的!H5扫描到的地址(配对码)是H5与蓝牙设备之间的配对码;你想通过你的手机端拿着H5给你的蓝牙设备地址肯定是连不通的,因为蓝牙设备根本就不认识你。你应该是哪个端要去连接蓝牙设备就用哪个端去扫描它!
可能我说的不太清楚,不是h5和手机端两个端,就是鸿蒙原生基座内嵌web组件h5页面,实际上就是鸿蒙原生连接蓝牙,h5给的蓝牙地址是没错的,只是官方处于隐私考虑会动态变化蓝牙地址,官方给的建议是采用设备名称进行设备比对,然后拿到该设备的地址进行连接
还有个误区要解释一下,几个手机扫描到的蓝牙同一时间地址都是一样的,只是过几小时会动态改变mac地址
针对HarmonyOS 鸿蒙Next BLE低功耗蓝牙扫描设备ID变动问题,这通常是由于系统出于信息安全考虑,返回的是随机MAC地址。配对成功后,该地址不会变更;已配对设备取消配对后重新扫描或蓝牙服务下电时,该随机地址会变更。
为了解决这个问题,开发者可以采取以下措施:
- 通过设备广播截取:扫描设备时获取设备的广播数据,设备的MAC地址一般包含在特定位置,可以通过解析广播数据来获取真实的MAC地址。
- 通过设备名称进行匹配:如果设备名称具有唯一性,可以通过设备名称来进行设备匹配,避免使用易变的设备ID。
此外,还可以考虑使用其他唯一标识符,如Service UUID等,来进一步确认设备身份。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。