解决iOS设备获取MAC方式

uniapp 解决 iOS 获取 MAC地址,在Android、iOS不同端中互通,根据MAC 地址处理相关的业务场景;

文章目录

解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制微信小程序 监听设备返回数据MAC 数据

API:

onBluetoothDeviceFound

可能会遇到相关问题:请查看

关于进制转换:请点击或搜索相关文章

Desc:

因 Android 和 iOS 设备得到的 deviceId 是不一致的,如果想要存储 MAC ,在后面的业务中使用,如何获取 MAC地址 ?Android:得到是 MAC iOS:得到是 UUIDtip:不要混淆了,是否处理 MAC 根据需求,不影响设备正常连接;

监听寻找到新设备的事件

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 数据段

filterDevices(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

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进制

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 数据

[

{

"0": 172,

"1": 35,

"2": 53,

"3": 153,

"4": 83,

"5": 133

}

]