一、获取的回调类型
微信端:buffer类型
获取的回调类型值是buffer类型。需要手动转成16进制格式的字符串。才能解析回调信息。
buffer转化为16进制字符串的工具方法
function bufferToStr(buffArray) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffArray),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
支付宝端:hex String类型(16进制字符串)
获取的回调值。直接就是16进制字符串。不需要再转换了。
二、ios端中,两个小程序对获取的广播值的区别。
一般在和蓝牙设备对接的时候,ios端获取了周围蓝牙设备之后。
需要使用mac值或设备厂家约定的比对值去和蓝牙设备广播值中的值
而两个小程序对这个广播值的处理会有不同。
微信端:buffer类型
微信端会直接把广播值扔出来,一个buffer类型。所以我们还是需要将这个buffer类型转化成16进制的字符串类型。以mac地址为例
Array.from(new Uint8Array(buffer), bit => bytes[bit]).join(':')
需要用以上的方法。将接收到的buffer值转化成mac地址。
然后再去比对我们要连接设备的mac地址。一致的话,拿到其deviceId。再用这个deviceId去连接蓝牙。
支付宝端:hex String类型
支付宝端就会自己将广播值转一手,直接转成16进制字符串,然后扔给我们。不过这个16进制字符串不会是固定成我们想要的格式的。比如mac地址。它就是一个单纯的16进制字符串。
所以如果我们要使用这个广播值去比对的话。我们也需要自己处理下
扫描二维码关注公众号,回复:
15668899 查看本文章
buffer.match(/[\da-f]{2}/gi).join(':')
获取广播值代码示例
function bufferToMac(buffer, join = '') {
// #ifdef MP-WEIXIN
return Array.from(new Uint8Array(buffer), bit => bytes[bit]).join(join)
// #endif
// #ifdef MP-ALIPAY
return buffer.match(/[\da-f]{2}/gi).join(join)
// #endif
}
uni.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: () => {
uni.getBluetoothDevices({
success: (res) => {
let devices = res.devices
for (let i = 0, len = devices.length; i < len; i++) {
const advertisData = devices[i].advertisData;
if (advertisData && (bufferToMac(advertisData,':') === this.deviceId)) {
console.log('获取蓝牙设备成功', devices[i])
this.deviceId = devices[i].deviceId
// 匹配设备成功,然后拿这个deviceId去连接蓝牙
this.createBLEConnection(this.deviceId);
return;
}
}
setTimeout(() => {
getBluetoothDevices();
}, 100);
},
fail: (err) => {
if (this.send) this.error("getBluetoothDevices失败:",
err)
}
});
},
fail: (err) => {
}
});
三、ios端获取的服务id和安卓端获取的服务id的区别(serviceId)
一般来说,在安卓端。获取的服务id一般有三个。其中有一个是主服务,且这个服务id设备方会直接给我们判断方式。
然后在获取服务列表的返回值里面一般格式如下
其中的uuid就是服务serviceId
但是在ios端
如果是微信端。则和安卓端表现基本一致。
如果是支付宝端,这个获取的服务列表表现方式就很诡异
他的返回值如下所示
只有一个。而且服务id很短。FFF0
这并不是错误的。而且只有拿这个服务id去连接服务。才能获取到特征值。