泉缘泉 发表于 2024-10-13 20:01:29

解决uniapp微信小程序Android与iOS体系获取蓝牙广播包中deviceid不同的办法

媒介

由于小程序官方是支持接入低能蓝牙(BLE)的,所以在一个项目中也尝试利用怎样接入蓝牙,我们从微信的官方网站就可以清晰知道怎样利用,但是其中也是有许多坑的。本着学习的心态,自己也手把手带你摸坑,一起处理一些平台兼容性的题目以及一些逻辑判断题目
作者在开辟一款共享干衣机小程序,用的是uniapp框架进行开辟的,开辟期间时碰到了 苹果(ios) 和 安卓(android)手机 获取到的 deviceId(mac)地址不同等题目;
1、装备绑定

在共享装备铺货到酒店等场合时,我们会让工作人员利用小程序码对共享干衣机装备进行绑定,这个目标就是为相识决,用户打开蓝牙毗连时会出现N个蓝牙,用户会不知所措的题目。
绑定过程须要填写以下信息:
https://i-blog.csdnimg.cn/blog_migrate/5eb07f91df8b32345d9e19cdefba9f01.png#pic_center


[*]1、蓝牙名称:自动天生
[*]2、装备编码:扫描提宿世成的小程序码(内里包含了装备编码)
[*]3、装备:选择装备就是我们选择蓝牙然后拿到deviceId(mac地址)
[*]4、署理商
[*]5、商户
[*]6、网点
2、用户利用流程

我们这个共享项目标用户利用流程是:


[*]1、用户扫码(天生的小程序码) 内里包含装备蓝牙信息;
[*]2、弹出毗连蓝牙给用户毗连 (通过小程序码里的蓝牙信息里的deviceId(mac地址)过滤掉其他蓝牙,只显示用户扫码装备的蓝牙);
[*]3、用户毗连成功后 隐蔽毗连蓝牙按钮显示 立即利用按钮;
[*]4、用户选择利用时长(默认30分钟);
[*]5、点击立即利用调用付出;
[*]6、付出成功后 (小程序下发开关定时指令给干衣机装备进利用用);
3、平台差别化

由于我们利用的是uniapp框架开辟所以没看到uniapp说明这个…(大坑)
后来我们从微信文档上面看到如许一段话:
https://i-blog.csdnimg.cn/blog_migrate/1505ed8af29e312830bf30be70ec1566.png#pic_center
看到这里我就想着,完犊子了,由于我们的手机平台有安卓和苹果,唯一标识蓝牙的就是deviceId,但是苹果搜索出来就不是这个了,而是uuid的一串字符串。由于苹果官方认为透露deviceId(MAC地址)会有安全题目,索性直接屏蔽了。
4、题目分析

开辟安卓和IOS的APP中,在获取蓝牙模块的MAC地址的时候有区别。
安卓体系在蓝牙这一块,给了获取蓝牙模块MAC地址的接口,所以直接用就行,包括安卓端的微信小程序或者其他小程序。
IOS比较严谨,不允许获取蓝牙模块的MAC地址,没有给出API,所以必须要在蓝牙模块这一端做一些特殊的设置。
在装备绑定时工作人员用安卓绑定的装备是唯一的,而用户利用ios搜索蓝牙时,每个用户搜索到的蓝牙装备都是uuid随机的deviceId与我们绑定deviceId的不匹配,因此也就无法在用户利用的时候过滤其他蓝牙了。
5、解决方案

方法1-特定的UUID去读取MAC地址

其实这范例的应用并不多,由于他须要创建毗连之后,才能获取到mac地址,如许就不实用了
在程序开辟中我们很少有采用如许的方式的 。其实实现也很简朴,一说就懂
所以这个方法,临时不推荐利用,请具体相识一下方法二。
方法2–MAC地址存放在蓝牙模块广播包内里

在广播包内里,查找蓝牙的 MAC 地址,一样寻常良心厂商都会存放在广播包内里,所以可以获取到。
作者开辟的蓝牙线路板蓝牙厂商没有写进去…,然后接洽厂商重新烧录进去。
https://i-blog.csdnimg.cn/blog_migrate/1a212bd44f139a7170fbb2e2f4606953.png#pic_center
https://i-blog.csdnimg.cn/blog_migrate/f54a10fcfdd947c00a79d000898314ba.png#pic_center
颠末了九九八十一天来回邮寄线路板,厂商终于把 mac 地址写入进advertisData去了。
https://i-blog.csdnimg.cn/blog_migrate/7367be325c966d96a6e2f4d1d832be6f.jpeg#pic_center
这里我们称之为:advertisData(当前蓝牙装备的广播数据段中的 ManufacturerData 数据段, 范例为:ArrayBuffer)。
做这个的目标,有如下原因:


[*] 1、微信小程序开辟:无法直接获取蓝牙芯片的 mac 地址,没有相应的API,所以可以通过这个获取到,具体网上可以搜一下
[*] 2、APP 开辟–IOS 端,也没办法直接获取 MAC 地址,也是通过这个方式得到蓝牙芯片的 MAC 地址
[*] 3、APP 开辟–安卓端,没有这个题目,直接通过 API 时可以获取到蓝牙芯片的 mac 地址的。所以用不消这个功能,都无所谓
实现代码:
// 初始化蓝牙模块
uni.openBluetoothAdapter({
success(res) {
    // 开始搜寻附近的蓝牙外围设备
    uni.startBluetoothDevicesDiscovery({
      success(res) {
      // 监听寻找到新设备的事件
       uni.onBluetoothDeviceFound((devices) =>{
          console.log(ab2hex(devices.advertisData)) // 获取到 mac 地址
      })
      }
    })
}
})

// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function (bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
)
return hexArr.reverse().join(':')
}
至此成功,我们拿到了蓝牙的mac地址,然后就可以进行后续操纵了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 解决uniapp微信小程序Android与iOS体系获取蓝牙广播包中deviceid不同的办法