当前位置:首页 > 移动端开发 > 正文内容

微信小程序 BLE 根底事务接口封装

邻居的猫1个月前 (12-09)移动端开发225

写在前面:本文所述未必契合当时最新景象(包括蓝牙技能开展、微信小程序接口迭代等)。

微信小程序为蓝牙操作供给了许多接口,但在实践开发进程中,会发现躲藏了不少坑。现在干流蓝牙运用都是依据低功耗蓝牙(BLE)的,本文介绍相关的几个根底接口,并对其进行封装,便于事务层调用。

蓝牙开展

在开发蓝牙运用程序之前,有必要对蓝牙这项技能做大致了解。

经典蓝牙

一种短间隔无线通讯规范,运转在 2.4GHz 频段,首要用于两个设备之间的数据传输。

一般将蓝牙 4.0 之前的版别称为经典蓝牙,其传输速率在 1-3Mbps 之间。尽管有着不错的传输速率,但因为功耗较大,难以满意移动终端和物联网的需求,逐步被更先进的版别所替代。‌

低功耗蓝牙(BLE)

蓝牙 4.0‌ 引入了低功耗蓝牙(BLE)技能,其最大数据吞吐量仅为1Mbps,但相对经典蓝牙,BLE 具有超低的运转功耗和待机功耗。

BLE 的低功耗是怎么做到的呢?首要是减缩播送通道数量(由经典蓝牙的 16-32个,减缩为 3 个)、缩短播送射频敞开时刻(由经典蓝牙的 22.5ms,削减到 0.6-1.2ms)、深度睡觉形式及针对低功耗场景优化了协议栈等,此处不赘述。

当时最新版别

‌当时大版别是蓝牙 5.0,传输速度达到了 24Mbps,是 4.2 版别的两倍,有用作业间隔可达 300 米,是 4.2 版别的四倍。低功耗形式下的传输速度上限为 2Mbps,适合于影音级运用,如高清晰度音频解码协议的运用。

蓝牙特征值

GATT(Generic Attribute Profile)协议界说了蓝牙设备之间的通讯办法,其间单个服务(Service)能够包括多个特征值(Characteristic),每个服务和特征值都有特定的‌ UUID 来仅有标识。特征值是蓝牙设备中用于存储和传输数据的根本单元,每个特征值都有其特定的特点和值

特点协议(ATT)界说数据的检索,答应设备露出数据给其他设备,这些数据被称为特点(attribute)

经过特点能够设置特征值操作类型,如读取、写入、告诉等,操作目标即为特征值的值(value)。一个特征值能够一起具有多种操作类型。

为了完成数据的传输,服务需求露出两个首要的特征值:write和‌notify 或 indication。write 特征值用于接纳数据,而 notify 特征值用于发送数据。这些特征值类型为 bytes,而且一次传输的数据长度能够依据不同的特征值类型有所不同。

小程序接口封装

需求知道的是,尽管蓝牙是敞开协议,但因为苹果 IOS 体系的封闭规划,现在苹果设备无法与 Android 及其它渠道设备经过蓝牙相连。

本文描绘皆依据 Android 渠道。

要害接口

运用蓝牙传输数据都会触及以下进程及接口:

  1. 激活设备蓝牙(如在手机上点按蓝牙图标);
  2. wx.openBluetoothAdapter:初始化小程序蓝牙模块;
  3. 查找外围设备
    1. wx.onBluetoothDeviceFound:监听查找到新设备的事情;
    2. wx.startBluetoothDevicesDiscovery:开端查找邻近设备;
    3. wx.stopBluetoothDevicesDiscovery:找到待连的对手设备后间断查找;
  4. wx.createBLEConnection:衔接 BLE 设备;
  5. 接纳数据
    1. wx.notifyBLECharacteristicValueChange:为下一进程做衬托(留意:有必要对手设备的特征支撑 notify 或许 indicate 才能够成功调用);
    2. wx.onBLECharacteristicValueChange:监听对手设备特征值改变事情,能够获得改变后的特征 value,如此数据就从对手设备传递过来了;
  6. wx.writeBLECharacteristicValue:向对手设备特征值中写入二进制数据(留意:有必要对手设备的特征支撑 write 才能够成功调用);
  7. wx.closeBLEConnection:断开衔接;
  8. wx.closeBluetoothAdapter:封闭小程序蓝牙模块;
  9. 封闭设备蓝牙。

坑及留意点(仅限于笔者依据开发进程运用到的机型调查记载,未必有普遍性):

  • wx.onBluetoothDeviceFound 这个办法只能找到新的蓝牙设备,之前查找过的在部分安卓机型上,不当作新的蓝牙设备,因而从头查找不到。这种状况,要么重启小程序蓝牙模块或许重启小程序,或许运用wx.getBluetoothDevices获取在蓝牙模块收效期间一切查找到的蓝牙设备。
  • 衔接未必能一次成功,需求多连几回。
  • 每次衔接最好能重启 BluetoothAdapter,不然在后续 wx.notifyBLECharacteristicValueChange 时简单报 10005-没有找到指定特征 过错。
  • 若小程序在之前已有查找过某个蓝牙设备,并成功树立衔接,可直接传入之前查找获取的 deviceId 直接测验衔接该设备,无需再次进行查找操作。
  • 体系与蓝牙设备会约束蓝牙 4.0 单次传输的数据巨细,超越最大字节数后会产生写入过错,主张每次写入不超越 20 字节。
  • 一旦进程中呈现任何反常,就有必要断开衔接重连,不然后续会一向报 notifyblecharacteristicValuechange:fail: no characteristic 过错

首要代码

注:本文代码块为笔者暂时盲敲,仅作参阅。

界说一个东西目标

const ble = {}

因为或许会遇到的各类问题,咱们先大局界说运转时反常枚举和 throw/handle 办法,以免后边遇到反常处理各写各的。

const ble = {
  errors: {
    OPEN_ADAPTER: '敞开蓝牙模块反常',
    CLOSE_ADAPTER: '封闭蓝牙模块反常',
    CONNECT: '蓝牙衔接反常',
    NOTIFY_CHARACTERISTIC_VALUE_CHANGE: '注册特征值改变反常',
    WRITE: '发送数据反常',
    DISCONNECT: '断开蓝牙衔接反常',
    //...
  },

  _throwError(title, err) {
    //... 能够考虑在这里调用 wx.closeBLEConnection

    if (err) {
      err.title = title
      throw err
    }
    throw new Error(title)
  },  

蓝牙衔接。留意到这是个有限递归办法,且每次衔接都先重启 BluetoothAdapter,原因请看上节。

/** 
   * @param {string} deviceId 设备号
   * @param {int} tryCount 已测验次数
   */
  async connectBLE(deviceId, tryCount = 5) {
    await wx.closeBluetoothAdapter().catch(err => { ble._throwError(this.errors.CLOSE_ADAPTER, err) })
    await wx.openBluetoothAdapter().catch(err => { ble._throwError(this.errors.OPEN_ADAPTER, err) })
    await wx.createBLEConnection({
      deviceId: deviceId,
      timeout: 5000
    })
      .catch(async err => {
        if (err.errCode === -1) { //蓝牙已是衔接状况
          // continue work
        } else {
          console.log(`第${6 - tryCount}次蓝牙衔接犯错`, err.errCode, err.errMsg)
          tryCount--
          if (tryCount === 0) {
            ble._throwError(this.errors.CONNECT, err)
          } else {
            await ble.connectBLE(deviceId, tryCount)
          }
        }
      })
      //蓝牙衔接成功
  },

衔接成功后,或许需求监听对手设备,用于接纳其传过来的数据。

  async onDataReceive(deviceId, serviceId, characteristicId, callback) {
    await wx.notifyBLECharacteristicValueChange({
      deviceId: deviceId,
      serviceId: serviceId,
      characteristicId: characteristicId,
      state: true
    }).catch(err => { ble._throwError(this.errors.NOTIFY_CHARACTERISTIC_VALUE_CHANGE, err) })

    wx.onBLECharacteristicValueChange(res => {
      let data = new Uint8Array(res.value)
      callback(data)
    })
  },

发送数据,须切片,每次发送不多于 20字节。此处增加了在固定时长内的重试机制。

  /** 
   * @param {Uint8ClampedArray} data 待发送数据
   * @param {boolean} holdConnWhenDone 发送结束后是否坚持衔接
   */
  async send(deviceId, serviceId, characteristicId, data, holdConnWhenDone = false) {
    let idx = 0 //已传输字节数
    let startTime = Date.now(),
      duration = 800 //发送失利重试持续时刻  
    while (idx < data.byteLength) {
      await wx.writeBLECharacteristicValue({
        deviceId: deviceId,
        serviceId: serviceId,
        characteristicId: characteristicId,
        value: data.slice(idx, idx += 20).buffer
      })
        .then(_ => startTime = Date.now()) //成功则now重置
        .catch(err => {
          if (Date.now() - startTime >= duration) {
            ble._throwError(this.errors.WRITE, err)
          } else {
            //重试
            idx -= 20
          }
        })
    }
    if (!holdConnWhenDone)
      await wx.closeBLEConnection({ deviceId: deviceId }).catch(err => { ble._throwError(this.errors.DISCONNECT, err) })
  }

在实践项目中,或许需求在每次发送数据片之后得到对手设备呼应后,依据呼应决议重发(校验过错或呼应超时等)、间断(设备繁忙)、仍是接着发送下一个数据片。这种状况则需合作 onDataReceive 办法协同作业,向其传入适宜的 callback 参数,此处不赘述。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=503

标签: 前端移动端
分享给朋友:

“微信小程序 BLE 根底事务接口封装” 的相关文章

【AppStore】聊一聊关于IOS应用上架Appstore审阅不通过的坑

【AppStore】聊一聊关于IOS应用上架Appstore审阅不通过的坑

前语 上一篇文章写到怎么上架IOS应用到Appstore,其间漏掉了少许期间遇到的小坑,现在补上 审阅不通过原因 5.1.1 Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage 5.1.1(ii) Permission A...

鸿蒙图标,湳鍥炴垬澶姳鏉跨殑鐢蜂汉

鸿蒙系统(HarmonyOS)的图标资源可以通过华为开发者联盟的官方网站获取。这些资源包括多种分辨率的PNG、SVG和Icon font格式,方便第三方开发团队直接使用。以下是相关资源的具体信息:1. 官方主题图标库: 2. 设计资源下载: 3. 其他资源: qwe...

开发一款手机app需要多少钱,中式五檩柁图片

开发一款手机app需要多少钱,中式五檩柁图片

开发一款手机app的成本取决于多个因素,包括但不限于:1. 功能需求:应用的复杂程度、所需功能数量和类型都会影响开发成本。例如,一个简单的应用程序可能只需要基本的用户界面和数据库功能,而一个复杂的应用程序可能需要集成多种服务、实时数据更新、高级用户界面设计等。2. 开发平台:是只开发iOS还是And...

小米手机稳定版怎么刷成开发版,轻松体验最新功能与优化

小米手机稳定版怎么刷成开发版,轻松体验最新功能与优化

将小米手机从稳定版刷成开发版需要一定的操作步骤和注意事项。以下是一个基本的指南,但请注意,刷机有风险,操作不当可能会导致手机变砖。建议在进行任何操作之前,确保备份好重要数据,并遵循官方指南。1. 解锁Bootloader: 访问小米官网解锁页面,按照官方指引申请解锁权限。 下载并安装小米...

鸿蒙小说完本排行榜,盘点热门作品,重温经典瞬间

鸿蒙小说完本排行榜,盘点热门作品,重温经典瞬间

以下是几份鸿蒙小说完本排行榜的推荐,供您参考:1. 认书网 提供了十大巅峰完结混沌鸿蒙类小说排行榜前10名,具体榜单可以访问 查看详细信息。2. 排行榜123网 推荐了十大已完结鸿蒙小说,例如《巫神纪》和《洪荒星辰道》。详细榜单可以访问 查看。3. 蚂蚁文学 整理了200万以上的鸿蒙小说,并提供...

鸿蒙系统pc版,鸿蒙电脑操作系统下载官网

1. 发布时间: 鸿蒙系统PC版预计将在今年第四季度正式推送。 另有消息称,鸿蒙PC版将于明年上半年发布。2. 功能特点: 鸿蒙系统PC版支持多屏协同、智能互联、跨设备操作等功能。 界面设计简约,适配应用广泛,并提供专属的PC麒麟处理器,性能强劲。 支持多设备家族化、跨...