小程序_OTA升级的一些情况说明

序:由于蓝牙设备产品已经成型,不可能再将产品中的蓝牙设备拆开来拿去烧录升级,所以只能通过小程序蓝牙连接设备再进行OTA升级。

一、设备分两种模式:APP模式,OTA模式;

二、升级的流程(肯定有差别,但是大同小异)

1、一般会先连接目标设备,根据对应服务(一个设备一般会有两个服务通道:server1server2)获取对应的特征(一个服务一般有两个特征,打印一下就知道了),正常情况下,我们一般会用的一个 server1 和其对应的特征去读写数据、监听数据,那么另一个 server2 和其对应的特征一般就是进入OTA模式读写数据、监听数据的;

2、从APP模式进入OTA模式之前,要根据设备文档来,最好要问设备那边需不需要密码,要的话,输入密码、进入OTA模式的协议也要问明白,肯定是走 server2 写入数据到设备的;

3、要问清进入OTA模式的设备名称是什么,进入OTA模式后,一般会断开连接,可能 设备名称 和 设备的MAC地址 或者 uuid 都会发生改变(看设备那边),重新搜索根据设备名过滤再重新连接上;

4、固件包大致有几种格式:zip、bin、hex,hex16 等等…,这些固件包的格式并不适合小程序使用,所以就需要后端整理数据了,这个是麻烦事,都要用到后端,第一种,包比较小的,可以从后端整理数据后生成一个 xxx.js 的文件(300K之内),第二种,从后端传文件整理后的数据;

5、比如:xxx.hex16 文件下某个数据段,这个并不是蓝牙可需要的数据,标红的是摘取的数据段拼接成一个partition,还要计算长度,根据 run_address 和长度的规则计算出 flash_address,拼接成 一条指令,是在发partition 数据之前;这些都是在后端操作;

:1000C00003B40148019001BD691F000003B4014859

6、然后就是往设备写数据了,整个文件分5个partition,发送partition数据前,计算长度和校验等发送一条指令;发送一段20个字节的数据,一段一段的传,发完16段 监听回应匹配数据,发完一个partition 监听回应匹配数据;发完匹配对应的参数就清楚是哪里,什么时候是完成了;

7、升级完成,设备会断开连接或需要重新启动;如果过程中升级失败,设备会回到升级前版本并退出升级模式或会停留在OTA模式,这个看设备那边怎么定的;

例子:在 wx.onBluetoothDeviceFound() 这里获取对应的设备数据 判断是否升级 (获取当前的 MAC +1 与进入ota模式的 MAC 是否匹配,判断是否进入ota模式,可要可不要)

scanDevices() {
  let that = this;
  const data = {};
  wx.onBluetoothDeviceFound((res) => {
    res.devices.forEach(device => {
      if (!device.name && !device.localName) { return; } // 过滤命名为空的数据
      // 设备过滤
      if(device.name.indexOf("XXXX") != -1){
        let values = new Uint8Array(device.advertisData);
        // values[num] 要与设备的软件工程师沟通
        if(values[12] != 1){
          var otaMacArray = new Uint8Array(6);  // 进入OTA模式时,目标MAC地址+1
          for(var i = 0; i < 6; i++){
            otaMacArray[i] = values[i+2];
            if(i==5){
              otaMacArray[i] = (values[i+2]+1)%256;
            }
          }
          app.globalData.otaModelMac = otaMacArray; // 存放到去全局
          that.setData({
            deviceNeedOTA: true, // 需要升级
          })
        }else{
          app.globalData.otaModelMac = "";
          that.setData({
            deviceNeedOTA: false, // 不需要升级
          })
        }
        const foundDevices = this.data.deviceList;
        const idx = inArray(foundDevices, 'deviceId', device.deviceId);
        if (idx === -1) {
          data[`deviceList[${foundDevices.length}]`] = device
        } else {
          data[`deviceList[${idx}]`] = device
        }
        that.setData(data);
      }
    })
  })
}
function inArray(arr, key, val) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i][key] === val) {
      return i;
    }
  }
  return -1;
}

三、OTA 传输区别

使用 geiBLEMTU 获取一下蓝牙的最大传输单元,发现 Android 的 ATT_MTU是23,iOS 的ATT_MTU是512,实际可以传输的数据长度为 ATT_MTU - 3,也就是说 Android 发20个字节,iOS 的可以发几百;

wx.getBLEMTU({
  deviceId: "deviceIdxxx",
  success (res) {
    console.log(res)
  }
})

情况:ota升级过程中,Android 按解析有效数据包拆分为 n 个 Partition,一个 Partition 拆分为 n 个分段,一个分段为 16 个数据包;一个数据包 20(MTU size)个字节;

iOS 按照 Android 的一样却出错了,搞了很久,没办法,最后通过APP的抓包发现,iOS 的发送的 MTU size 长度不是20,而是 237,气死我了;(iOS按解析有效数据包拆分为 n 个 Partition,一个 Partition 拆分为 n 个分段,一个分段为 16 个数据包;一个数据包 237(MTU size)个字节;

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
微信小程序OTA(Over-the-Air)升级是指通过网络将小程序的更新包传输到用户的设备上进行升级。下面是一个简单的步骤来实现微信小程序OTA升级: 1. 在小程序的后台管理系统中创建一个OTA管理页面,用于上传和管理小程序的更新包。 2. 在小程序端,创建一个检测更新的方法。可以使用wx.getUpdateManager()方法获取更新管理器实例,在onCheckForUpdate回调中进行判断是否有新版本。 3. 如果有新版本,可以使用wx.showModal()提示用户是否要进行更新。 4. 用户确认更新后,调用更新管理器实例的onUpdateReady回调函数,提示用户重启应用程序。 5. 在小程序的app.json文件中配置"usingComponents"字段,将OTA管理页面注册为一个组件。 6. 在小程序的页面中使用该组件,显示OTA管理页面并提供上传更新包的功能。可以使用wx.uploadFile()方法将更新包上传到服务器。 7. 服务器接收到更新包后,将其保存到指定位置。 8. 在OTA管理页面中,提供查看已上传更新包和选择发布的功能。可以使用wx.request()方法向服务器发送请求,获取已上传的更新包列表。 9. 用户选择要发布的更新包后,可以使用wx.request()方法向服务器发送请求,触发更新流程。 10. 服务器将选择的更新包发送给对应的用户设备。可以使用WebSocket等技术实现实时传输。 11. 设备接收到更新包后,使用wx.getUpdateManager()方法进行更新。 以上是一个简单的微信小程序OTA升级的实现步骤,具体的实现细节还需要根据具体需求进行调整。希望能对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸曦穆泽

您的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值