首页 » 科学 » 解决uniapp微信小轨范Android与iOS获取蓝牙deviceid不合的办法_蓝牙_地址

解决uniapp微信小轨范Android与iOS获取蓝牙deviceid不合的办法_蓝牙_地址

乖囧猫 2024-10-17 05:12:16 0

扫一扫用手机浏览

文章目录 [+]

作者在开拓一款共享干衣机小程序,用的是uniapp框架进行开拓的,开拓期间时碰着了 苹果(ios) 和 安卓(android)手机 获取到的 deviceId(mac)地址不一致问题;

1、设备绑定

在共享设备铺货到酒店等场所时,我们会让事情职员利用小程序码对共享干衣机设备进行绑定,这个目的便是为理解决,用户打开蓝牙连接时会涌现N个蓝牙,用户会不知所措的问题。

解决uniapp微信小轨范Android与iOS获取蓝牙deviceid不合的办法_蓝牙_地址 解决uniapp微信小轨范Android与iOS获取蓝牙deviceid不合的办法_蓝牙_地址 科学

绑定过程须要填写以下信息:

解决uniapp微信小轨范Android与iOS获取蓝牙deviceid不合的办法_蓝牙_地址 解决uniapp微信小轨范Android与iOS获取蓝牙deviceid不合的办法_蓝牙_地址 科学
(图片来自网络侵删)

蓝牙名称:自动天生;设备编码:扫描提前天生的小程序码(里面包含了设备编码);设备:选择设备便是我们选择蓝牙然后拿到deviceId(mac地址);代理商;商户;网点;2、用户利用流程

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

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

由于我们利用的是uniapp框架开拓以是没看到uniapp解释这个...(大坑)

后来我们从微信文档上面看到这样一段话:

看到这里我就想着,完犊子了,由于我们的手机平台有安卓和苹果,唯一标识蓝牙的便是deviceId,但是苹果搜索出来就不是这个了,而是uuid的一串字符串。
由于苹果官方认为透露deviceId(MAC地址)会有安全问题,索性直接屏蔽了。

4、问题剖析

开拓安卓和IOS的APP中,在获取蓝牙模块的MAC地址的时候有差异。

安卓系统在蓝牙这一块,给了获取蓝牙模块MAC地址的接口,以是直接用就行,包括安卓真个微信小程序或者其他小程序。

IOS比较严谨,不许可获取蓝牙模块的MAC地址,没有给出API,以是必须要在蓝牙模块这一端做一些特殊的设置。

在设备绑定时事情职员用安卓绑定的设备是唯一的,而用户利用ios搜索蓝牙时,每个用户搜索到的蓝牙设备都是uuid随机的deviceId与我们绑定deviceId的不匹配,因此也就无法在用户利用的时候过滤其他蓝牙了。

5、办理方案

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

实在这类型的运用并不多,由于他须要建立连接之后,才能获取到mac地址,这样就不实用了

在程序开拓中我们很少有采取这样的办法的 。
实在实现也很大略,一说就懂

以是这个方法,暂时不推举利用,请详细理解一下方法二。

方法2-MAC地址存放在蓝牙模块广播包里面

在广播包里面,查找蓝牙的 MAC 地址,一样平常良心厂商都会存放在广播包里面,以是可以获取到。

作者开拓的蓝牙线路板厂商没有写进去...,然后联系厂商重新烧录进去。

经由了九九八十一天来回邮寄线路板,厂商终于把 mac 地址写入进`advertisData`去了。

下面是原始数据

这里我们称之为:advertisData(当前蓝牙设备的广播数据段中的 ManufacturerData 数据段, 类型为:ArrayBuffer)。

做这个的目的,有如下缘故原由:

微信小程序开拓:无法直接获取蓝牙芯片的 mac 地址,没有相应的API,以是可以通过这个获取到,详细网上可以搜一下APP 开拓--IOS 端,也没办法直接获取 MAC 地址,也是通过这个办法得到蓝牙芯片的 MAC 地址APP 开拓--安卓端,没有这个问题,直接通过 API 时可以获取到蓝牙芯片的 mac 地址的。
以是用不用这个功能,都无所谓

实当代码:

// 初始化蓝牙模块uni.openBluetoothAdapter({ success(res) { // 开始征采附近的蓝牙外围设备 uni.startBluetoothDevicesDiscovery({ success(res) { // 监听探求到新设备的事宜 uni.onBluetoothDeviceFound((devices) =>{ console.log(ab2hex(devices[0].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地址,然后就可以进行后续操作了。

标签:

相关文章

做嵌入式开拓辛苦吗?_工作_工程师

1. 单位早期的系统架构设计技能职员水平会决定你的事情状态曾经一家公司,一个while(1 开头的裸奔系统,带自己设计的机制,带没...

科学 2025-01-11 阅读0 评论0