主要需要全局监听蓝牙连接状态,避免多次连接

多次调用打开蓝牙适配器

  1. 微信:没有问题
  2. 支付宝:蓝牙已经连接的情况下再重复调用就会导致连接失败或断开重连,或找不到指定设备
  3. 建议先执行 my.getBluetoothAdapterState

3.1 success 回调中若打开, 继续正常流程
3.2 error 回调中 errorCode 为未打开, 调用 my.openBluetoothAdapter
3.3 complete回调中,再调用my.getBluetoothAdapterState判断是否已打开,并设置监听

最终方案

  1. onLaunch 连接蓝牙
    1. app.connect 保存连接状态
    2. (注意)iife 无法访问 getApp(),通过事件传递 app 对象
    3. 小程序存活期间 if app.connect 就不再主动连接
  2. onHide 开始计时,4分55秒后断开连接并清除连接状态(包括storage)
  3. 清理
    1. Uuid清理场景 - 签名刷新 app.uuid
    2. Mac清理场景 - 蓝牙断开就清理
  4. 连接成功监听蓝牙连接状态

    备忘录

  5. 连接失败清除所有数据

  6. 去除 ble.js 的currentDevice,只需要 deviceId 即可
  7. 重复连接会导致后续设备认证失败或连接超时(断开不彻底导致)
    1. 场景:支付宝第一次设备认证成功,但第二次设备认证必然失败(表现为蓝牙设备返回重复指令)
  8. 支付宝连接之前不能执行清理资源操作
    1. 会导致 currentDevice 为空,无法连接蓝牙
  9. 支付宝断开连接需要清除 currentDevice 否则小程序销毁后(无法监听销毁事件),再次打开小程序就会无法使用,currentDevie 存在就会跳过连接
    1. 连接成功需进行多重判断
  10. 支付宝蓝牙未打开,后续无法监听打开事件
  11. ios serviceId 和特征值需要 大写
  12. 微信支付宝 onBLECharacteristicValueChange 参数不同 ``` my.onBLECharacteristicValueChange({ success: res => {
    1. // toast('特征值变化:' + JSON.stringify(res));
    2. console.log("蓝牙设备返回数据", res.value);
    3. receiveMsg(res.value);
    }, fail: res => {
    1. console.log("开启监听特征值失败", res)
    } });

wx.onBLECharacteristicValueChange(function(res) { console.debug(“蓝牙设备返回数据”, strUtil.arrayBuffer2HexString(res.value)) receiveMsg(strUtil.arrayBuffer2HexString(res.value)) }); ```

  1. 多次连接失败后,即使重试连接成功也会导致蓝牙设备重复发送指令或无法监听蓝牙设备发送的指令,可通过杀掉支付宝后台进程解决
    1. ios 支付宝开发模式第二次连接必然出现无法监听的情况
    2. 由于结束调试不会自动断开蓝牙导致(不建议短时间内重连蓝牙,坑比较大)!!!