微信小程序与支付宝小程序与ios端 对接蓝牙设备所需注意的坑(自整理,自用)

一、获取的回调类型

微信端: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去连接服务。才能获取到特征值。

猜你喜欢

转载自blog.csdn.net/weixin_43941023/article/details/129412368