前文简述了STM32的无线下载原理及实现方法,在此基础上,使用阿里云的OTA下载服务提供整包下载功能(注:由于单片机Flash只能全片擦除,无法讲写0的位单独改为1,因此无法实现差分下载,所以没有深入研究如何进行差分下载,若有网友实现,还请指教)。
一、添加升级包
(注:在进行添加升级包之前,请先跳转到2.2查看如何订阅Topic,否则将收不到升级的URL消息!!)
如上图所示,点击“添加升级包”后,在弹出的界面上设置相关配置:
- 升级包类型:选择整包升级,不适用差分
- 升级包名称:可用中英文、数字字母等,方便自己查看
- 所属产品:要升级的三元组所属的产品类
- 升级包模块:默认default(注:此处设置关乎后面升级消息内容,若修改请记住修改内容)
- 升级包版本号:填写代码的版本号(注:此处设置关乎后面升级消息内容,若修改请记住修改内容)
- 上传升级包:上传.bin文件,不支持.hex文件。(注:若文件后缀为.binery,手动修改后缀名即可)
- 是否平台验证:此处点否,否则需要进行一次验证下载,才可以进入后续下载,此处若确保程序包正确,即可直接跳过验证。
二、使用MQTT协议进行OTA升级
本系统使用MQTTbox进行演示下载,若读者使用4G模块开发,仅需按照下文操作,对相应的Topic发送消息即可。
上图为阿里云官网指导手册提供的操作流程图,如图所示共分为六个步骤,在此我们仅需执行2、3、4、6即可,上报操作进度可以略去。第一步和最后一步上报当前保本信息可以放在代码的初始化之中进行即可,再完成下载后一定要发送最新的版本号(添加升级包时填写的版本号),阿里云才会认为上传成功。
2.1 上报OTA版本号
请求Topic:
Topic:/ota/device/inform/ {YourProductKey} / {YourDeviceName}
注:{***}括号和里面的内容需要替换成需要升级的三元组的产品号和设备号,$、{、}三个符号全部需要替换掉!
请求内容:
{
“id”: “001”,
“params”: {
“version”: “1.0.1”,
“module”: “default”
}
}
- id:id号为消息的编号,此处因该从1开始依次累加,不能重复。
- version:版本号(当前单片机内所执行的程序的版本号)
- module:升级包模块(若按照笔者教程,在添加升级包时配置写的时default,该字段直接删除即可,若自行更改名称,需要将此处更改为对应的模块名称。此处巨坑!阿里云手册此处直接一笔带过,导致笔者第一次调试的时候在这里卡了半天,在搭档的帮助下才排查出问题)
2.2 接收OTA升级包的URL地址
请求Topic:
Topic:/ota/device/upgrade/{YourProductKey}/{YourDeviceName}
首先先使用MQTT订阅对应的Topic,然后进入阿里云物联网平台设置升级下发指令。
点击完成后,MQTT端会收到设备下发的URL地址,使用HTTPS协议访问并下载即可得到bin文件。
2.3 上报最新的版本号
如图所示,阿里云上显示已经升级成功。
2.4 上报升级进度
请求Topic:
/ota/device/progress/a1f2CH9BSx7/WD_NJ_Transplanter_1
请求内容:
{
“id”: “1286”,
“params”: {
“step”: “99”,
“desc”: “OTA升级完成99%”,
“module”: “default”
}
}
- step:上传的百分比(整数:1-100)
- -1:升级失败
- -2:下载失败
- -3:校验失败
- -4:烧录失败
- desc:错误信息备注
2.5 主动请求检查是否有更新
请求Topic:
/sys/a1f2CH9BSx7/WD_NJ_Transplanter_1/thing/ota/firmware/get
请求内容:
{
“id”: “1287”,
“version”: “1.0”,
“params”: {
“module”: “default”
},
“method”: “thing.ota.firmware.get”
}
- version:默认1.0,不要修改
- module:添加升级包时设置的升级包模块名称
- method:默认值,不要修改
返回的Topic:
/sys/a1f2CH9BSx7/WD_NJ_Transplanter_1/thing/ota/firmware/get_reply