解决iOS设备获取MAC方式
uniapp 解决 iOS 获取 MAC地址,在Android、iOS不同端中互通,根据MAC 地址处理相关的业务场景;
文章目录
-
- 解决iOS设备获取MAC方式
-
- 监听寻找到新设备的事件
- BLE工具效果图
- APP监听设备返回数据
- 解决方式
- ArrayBuffer转16进制
- [微信小程序 监听设备返回数据](#微信小程序 监听设备返回数据)
- [MAC 数据](#MAC 数据)
可能会遇到相关问题:请查看
关于进制转换:请点击或搜索相关文章
Desc:
- 因
Android
和iOS
设备得到的 deviceId 是不一致的,如果想要存储MAC
,在后面的业务中使用,如何获取MAC地址
? Android
:得到是MAC
iOS
:得到是UUID
- tip :不要混淆了,是否处理
MAC
根据需求,不影响设备正常连接;
监听寻找到新设备的事件
javascript
function onBluetoothDeviceFound() {
uni.onBluetoothDeviceFound((res) => {
console.log('onBluetoothDeviceFound success', res)
handleFilterDevices(res.devices);
})
}
BLE工具效果图
APP监听设备返回数据
- 很多人以为返回数据是空的,在App端,ArrayBuffer 数据无法直接查看,转换下打印日志也许有惊喜(⊙o⊙)
解决方式
具体数据 根据 供应商 协议去处理,因有些 供应商 返回 MAC方式不一样;
-
监听广播数据,根据 MAC 数据存储位置,解析对应
ManufacturerData
数据段、ServiceData
数据段; -
MAC 在
advertisData
中: 即ManufacturerData 数据段javascriptfilterDevices(devices) { let res = devices.filter(device => { if (!device.name && !device.localName) return; // ArrayBuffer转16进制 let advertisData = ab2hex(device.advertisData); console.log('advertisData To HEX:', advertisData); // ... } }
-
MAC 在
serviceData
中:即 ServiceData 数据段,返回对象- 先 转换为 Uint8Array 类型,再 转换 16进制
- 和效果图一样,返回在 ServiceData
javascript
filterDevices(devices) {
let res = devices.filter(device => {
if (!device.name && !device.localName) return;
// 遍历 ServiceData 数据段
let serviceData = '';
for (let key in device.serviceData) {
let tmpData = new Uint8Array(device.serviceData[key]);
if (tmpData) {
let tmpHex = ab2hex(tmpData);
serviceData = tmpHex.join(':');
}
}
device['MAC'] = serviceData;
// ...
}
}
- 通过广播数据段
name
、localName
中通过名称匹配设备,通常: 前缀 +MAC
,直接截取就行(有些供应商会采取该方式)
ArrayBuffer转16进制
javascript
const ab2hex = (buffer) => {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}
微信小程序 监听设备返回数据
小程序,打印日志更直观些
MAC 数据
json
[
{
"0": 172,
"1": 35,
"2": 53,
"3": 153,
"4": 83,
"5": 133
}
]