8***@qq.com
8***@qq.com
  • 发布:2022-10-31 17:42
  • 更新:2022-10-31 17:42
  • 阅读:415

如何优雅的使用小程序蓝牙通信 ……

分类:uni小程序sdk

问自己三个问题

1、蓝牙授权拿到了吗?
2、蓝牙模块启用了吗?
3、流程是从获取蓝牙模块状态发起的吗? (如果不是,想办法在前面流程中关闭蓝牙模块,并确保业务流程从启动蓝牙模块开始 … 后面所有流程都跑一遍,IOS是的)


const target = {  
  deviceId: null,  
  serviceId: null,  
  characteristicId: null,  
  notifyId: null,  
}  

// 获取蓝牙模块授权 ,这里存在已授权和已拒绝、未授权等情况,自己封装下 helperHandle.wxPreAuthorize  
const initKitBluetooth = (force = false) => {   
  return new Promise((resolve, reject) => {  
    helperHandle  
      .wxPreAuthorize({  
        scope: 'scope.bluetooth',  
        scopeNamed: '蓝牙',  
        force,  
      })  
      .then(() => {  
        // 启动蓝牙  
        uni.openBluetoothAdapter({  
          success: async () => {  
            await store.dispatch('app/setBluetoothAdapterState', 2)  
            resolve()  
          },  
          fail: async (res) => {  
            let message = res.errMsg || ''  
            if (res.errCode === 10001) {  
              await store.dispatch('app/setBluetoothAdapterState', 1)  
              message = '请打开手机蓝牙'  
            } else {  
              await store.dispatch('app/setBluetoothAdapterState', 0)  
            }  
            reject(message)  
          },  
        })  
      })  
      .catch((reason) => {  
        reject(reason)  
      })  
  })  
}  

const linkBLEWithWrite = ({ deviceId, value = 'GET', onListen = null } = {}) => {  
  return new Promise((resolve, reject) => {  
    console.log('准备开始连接设备:' + deviceId)  
    createBLEConnection(deviceId)  
      .then(() => {  
        console.log('设备已连接')  
        target.deviceId = deviceId  
        // 设备已连接 # 获取服务  
        return getBLEDeviceServices(deviceId)  
      })  
      .then((services) => {  
        console.log('已获取到设备服务', services)  
        // 根据服务 # 获取特征值  
        const serviceId = services[0].uuid  
        target.serviceId = serviceId  
        return getBLEDeviceCharacteristics({  
          deviceId,  
          serviceId,  
        })  
      })  
      .then(async (characteristics) => {  
        console.log('已获取到特征值', characteristics)  
        // 根据特征值进行通信  
        // 订阅消息的特征值UUID  
        const notifyId = characteristics[0].uuid  
        target.notifyId = notifyId  
        // 发送指令的特征值UUID  
        const characteristicId = characteristics[1].uuid  
        target.characteristicId = characteristicId  
        // 判断是否订阅消息通知  
        if (onListen) {  
          console.log('开始侦听设备广播', target)  
          await notifyBLECharacteristicValueChange(target)  
          console.log('侦听已启动')  
          // 订阅回调  
          onBLECharacteristicValueChange(onListen)  
        }  
        return Promise.resolve()  
      })  
      .then(async () => {  
        console.log('开始向设备写入信息:' + value)  
        // 根据情景 # 向设备写入数据  
        await writeBLECharacteristicValue({  
          value,  
          deviceId: target.deviceId,  
          serviceId: target.serviceId,  
          characteristicId: target.characteristicId,  
        })  
      })  
      .then(() => {  
        console.log('已写入')  
        resolve()  
      })  
      .catch((reason) => {  
        reject(reason)  
      })  
  })  
}  

const clearBLEServices = (deviceId) => {  
  return new Promise((resolve) => {  
    closeBLEConnection(deviceId)  
      .then(() => {  
        console.log('连接已关闭')  
        return closeBluetoothAdapter()  
      })  
      .then(async () => {  
        await store.dispatch('app/setBluetoothAdapterState', 0)  
        console.log('蓝牙已关闭')  
        resolve()  
      })  
  })  
}  
1 关注 分享
vurtne

要回复文章请先登录注册