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

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

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

1、一般会先连接目标设备,根据对应服务(一个设备一般会有两个服务通道:server1,server2)获取对应的特征(一个服务一般有两个特征,打印一下就知道了),正常情况下,我们一般会用的一个 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地址+1for(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)个字节;)

小程序_OTA升级的一些情况说明相关推荐

  1. 苹果小程序上下拉出现留白情况

    苹果小程序上下拉出现留白情况 今天做小程序测试发现一个bug,小程序上下拉的时候会出现留白底的情况,或者是红底的情况,安卓机不会出现这种情况 解决方法分多种 1.第一种,如果你只是需要解决他颜色的问题 ...

  2. dedecms小程序插件升级到1.4.4(支持百度小程序,微信小程序,头条小程序,QQ小程序,支付宝小程序...)

    从2019年6月份开发到现在 dede织梦小程序插件已经升级到1.4.4版本,现在已经支持:微信小程序,百度小程序,头条/抖音小程序,QQ小程序,支付宝小程序. dedecms小程序插件目前主要的功能 ...

  3. 酷客多小程序重磅升级,这十几个模板足以打动你的心!

    酷客多小程序(www.kukeduo.cn)DIY系统2.0上线!商家期待已久的DIY升级版终于上线了!升级版功能更强大,编辑能力更强.说到这有没有让你很心动,那少废话,上图! 右侧12个模板有没有您 ...

  4. 微信小程序无法获取UnionId的情况及处理

    问题背景:做了微信小程序,一切都还正常,但是最后体验版放出去时,却发现很多用户无法绑定用户,后台返回:参数非法.经过多方排查,发现是微信拿到的code请求返回的数据里没有UnionId,也就是接口返回 ...

  5. 小程序的缓存数据什么情况会被清除

    虽然官方说是缓存数据永久的,但有几种情况缓存数据会被清除 同一个微信用户,同一个小程序 storage 上限为 10MB 如果用户储存空间不足,我们会清空最近最久未使用的小程序的本地缓存. 直接删除小 ...

  6. 追格小程序重磅升级 新亮点来袭!

    追格小程序是一个积木式小程序搭建框架,基于Uniapp+WordPress开发,代码免费开源不加密且支持二开,安装追格相应扩展模块,简单配置即可快速搭建不限于圈子社区.知识付费.活动报名.资讯等类型小 ...

  7. 格创跑腿小程序改版升级啦

    格创校园跑腿小程序发行至今一直受到用户们的广泛喜爱,了解的人数也是越来越多,非常感谢大家长期以来对我们的信赖和支持. 2022年,我们将迎来格创跑腿的全新改版--格创跑腿独立版,不一样的页面,不一样的 ...

  8. 微信小程序—调用API获取天气情况

    1.在微信开发者工具中的.js文档参考wx.getLocation函数获取当前地理位置,注意在app.json文件中permission授权. "permission": {&qu ...

  9. 小程序再升级:支持创建微信小店小程序

    " 为了帮助商家在微信内快速开店,方便商家和用户之间沟通,所有认证公众号,可快速创建微信小店小程序." 01 - 通过公众号后台快速创建 1.原有微信小店功能的公众号,可以一键升级 ...

  10. pbootcms小程序插件升级到1.3.0版本,新增后台管理界面

    (1)新增后台管理功能,随时创建多个小程序,可控制小程序的开启 (2)新增安全密钥校验 (2)新增system接口用于获取小程序的信息(company和siteinfo接口并入system接口,减少请 ...

最新文章

  1. 各大厂分布式链路跟踪系统架构对比
  2. Bash的基础知识man手册
  3. 成功解决TypeError: take() got an unexpected keyword argument ‘fill_value‘
  4. Centos/Red Hat6.8 安装、配置、启动Gitlab (内网环境)心得分享
  5. 回文绝对求下联:亚冠决赛决冠亚
  6. 开发一款浏览器内核需要学习哪些方面的知识?
  7. 2020 年 AI 产业报告:100 个岗位抢 1 个人,计算机视觉成最大缺口
  8. 海量数据中找top K专题
  9. win11触屏模式在哪 Windows11触屏模式的设置方法
  10. html5 list 拖拽排序,vue实现可拖拽排序的列表
  11. 使用阿里云镜像加速器--docker
  12. 知识管理案例:谁来负责知识管理?
  13. Windows 10正式版的历史版本
  14. Phalcon框架的访问控制列表 ACL(Access Control Lists ACL)
  15. 1.决策树 实例:泰坦尼克号幸存者的预测
  16. Revit二次开发—内建类别BuiltInCategory枚举(中英文对照)
  17. DM数据库的启停以及数据库状态检查
  18. SYN_RECV状态相关
  19. B-树叶子个数和关键字个数间关系推导
  20. 解决 Hadoop 启动 ERROR: Attempting to operate on hdfs namenode as root 的方法

热门文章

  1. 百度分享链接批量转存到百度网盘
  2. 最新国外虚拟主机对比评论国外虚拟主机购买指南
  3. 全国计算机网络英语,2007年10月自考试题计算机网络管理全国试卷(国外英语资料).doc...
  4. android实现推箱子代码,android开发--推箱子小游戏(二)
  5. 宁静以致远,淡泊以明志
  6. 解决 注册谷 歌 邮 箱 gmail 手机号无法用于验证
  7. centos 加密解密
  8. 网络爬虫:Beautiful Soup库信息组织与提取
  9. php网页的制作,网页制作步骤是什么
  10. 【盘点】2017杭州云栖大会迁云实战Workshop