3-STM32+W5500远程升级篇OTA(阿里云物联网平台)-STM32通过W5500使用http下载程序文件,升级程序(一型一密)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/STM32W5500AIR202A/alyota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
这节的例程BootLoader和第一节是一样的, 只是这节用户程序是设备以一型一密方式(动态注册)接入阿里云物联网平台.
为了这节可以单独查看使用,会重复前面的内容.
提示提示提示
设备动态注册的数据存储在了flash里面,烧录程序的时候记得选择只擦除程序使用的flash空间;
如果选择了上面的擦除全部,则数据没有了设备就会重新注册, 阿里云默认注册了一定次数之后就不让注册了.
除非手动在平台上把设备删除, 然后设备才可以重新注册成功.
升级概述
1,实现升级是使用的基础通信里面的Topic
阿里云介绍文档:
https://help.aliyun.com/document_detail/85700.html
/ota/device/inform/a1m7er1nJbQ/${deviceName}
设备通过这个主题上报设备的固件版本号,要求设备在连接上服务器以后第一时间上报.
格式:
/ota/device/upgrade/a1m7er1nJbQ/${deviceName}
设备需要订阅这个主题,服务器会通过这个主题下发固件信息
一般在上传新固件以后,在平台上操作以后,平台才会主动下发.
size是固件大小; version是服务器固件版本; url是固件下载地址
提示:url虽然给的是https 但是同样可以使用 http 80 端口进行下载, 这个阿里云平台没有强制SSL
{ "code": "1000", "data": { "size": 432945, "version": "2.0.0", "isDiff": 1, "url": "https://iotx-ota-pre.oss-cn-shanghai.aliyuncs.com/nopoll_0.4.4.tar.gz?Expires=1502955804&OSSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=XfgJu7P6DWWejstKJgXJEH0qAKU%3D&security-token=CAISuQJ1q6Ft5B2yfSjIpK6MGsyN1Jx5jo6mVnfBglIPTvlvt5D50Tz2IHtIf3NpAusdsv03nWxT7v4flqFyTINVAEvYZJOPKGrGR0DzDbDasumZsJbo4f%2FMQBqEaXPS2MvVfJ%2BzLrf0ceusbFbpjzJ6xaCAGxypQ12iN%2B%2Fr6%2F5gdc9FcQSkL0B8ZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO1wEP4K%2BkkMqH8Uic3h%2Boy%2BgJt8H2PpHhd9NhXuV2WMzn2%2FdtJOiTknxR7ARasaBqhelc4zqA%2FPPlWgAKvkXba7aIoo01fV4jN5JXQfAU8KLO8tRjofHWmojNzBJAAPpYSSy3Rvr7m5efQrrybY1lLO6iZy%2BVio2VSZDxshI5Z3McKARWct06MWV9ABA2TTXXOi40BOxuq%2B3JGoABXC54TOlo7%2F1wTLTsCUqzzeIiXVOK8CfNOkfTucMGHkeYeCdFkm%2FkADhXAnrnGf5a4FbmKMQph2cKsr8y8UfWLC6IzvJsClXTnbJBMeuWIqo5zIynS1pm7gf%2F9N3hVc6%2BEeIk0xfl2tycsUpbL2FoaGk6BAF8hWSWYUXsv59d5Uk%3D", "md5": "93230c3bde425a9d7984a594ac55ea1e", "sign": "93230c3bde425a9d7984a594ac55****", "signMethod": "Md5", "module": "MCU" }, "id": "1507707025", "message": "success" }
/ota/device/progress/a1m7er1nJbQ/${deviceName}
设备可以使用这个主题上报更新进度, 发布的消息格式看下面
/sys/a1m7er1nJbQ/${deviceName}/thing/ota/firmware/get
设备可以使用这个主题主动请求云端固件信息, 详细说明看下面
测试
1,登录自己的云平台打开动态注册
注:选择哪个产品,设备就会注册到哪个产品下
开始测试
1.使用下载器下载BootLoader程序
使用单片机串口1打印串口日志(115200)
2.打开用户程序
3.修改为阿里云的设备参数(根据自己的注册设备修改)
4,查看并替换自己instanceId
提示:在2021年7月30日之前购买的实例是没有 instanceId 的, 单片机程序里面可保持空
如果有, 则需要填写上.
5.修改完成以后,编译下载用户程序
6.正常运行日志如下
7.在物联网平台上刷新一下设备列表,会看到注册了一个新设备
把升级包上传到服务器
1.修改用户程序(mcu_project)里面的固件版本
注:这个随意,我修改的是0.0.1
2.编译下工程
3.会在工程目录的bin文件夹生成bin文件
4.打开OTA Tools上位机软件
5.按照红框选择配置
6.选择用户程序生成的 bin文件
7.点击 生成固件
8.将在user.bin目录生成user_crc.bin文件
提示: 两个bin文件的区别:
1.user_crc.bin文件是在user.bin的基础上增加了CRC校验位
2.user_crc.bin文件还记录了此固件的大小
在物联网平台上新增固件
1.设备运维 - 固件升级
2.选择添加模块(使用默认的好像不能主动查询到固件信息)
升级包名称:随意写, 所属产品:选择您当前设备所属的产品
3.模块名称填写1,这个是和单片机程序对应的
这个模块名称其实就是一个参数,命名最好是以产品型号进行命名
这个要和单片机里面设置的一样
4.选择咱刚才添加的升级包模块,版本号填写刚才用户程序设置的版本号
5.上传固件
6.先不选择验证
验证的话需要先让其中一个设备远程升级验证下.有个繁琐的过程
不过实际产品应用尽量选择验证!
这个验证呢后面会说,咱先快速的使用起来.
开始控制设备升级了
1.点击批量升级
2.选择动态升级
注意哈,待升级版本号那里之所以是0.0.0 是因为咱设备刚刚上报了自己的版本号
3.下面这些选项,按照自己的需求更改
4.观察下串口日志
服务器推送给了咱设备固件信息, 接收到固件信息以后重启执行BootLoader
5.BootLoader下载程序
6.下载完成
7.用户程序第一时间上报版本, 每隔一段时间获取下服务器上的固件信息
假设咱更新了程序
1.修改版本号
2.编译下工程
3.打开OTA Tools.exe软件生成带有CRC校验的固件
4.添加升级包
5.下面的步骤我就不多说了
假设需要验证
1.改个新版本
2.生成带有CRC校验的固件
3.添加升级包
4.点击验证
现在批量升级不可以点击,必须先验证下固件
这个是咱先前设备更新完成以后上报的版本号
5.选择可以用来测试的设备
6.可以看到设备开始升级
7,升级成功上报版本
8,刷新下页面
然后按照前面的操作批量升级就可以了.
单片机程序说明
提示:
用户必须已经学习完了基本控制篇里面的阿里云物联网平台教程和看完了(主要是熟悉下流程)自建物联网平台的OTA教程.
我下面说明一下整个的流程
首先梳理一下思路:
阿里云物联网平台提供的升级其实和咱自建物联网平台里面的使用APP控制设备升级是一样的道理
其实就是用户程序通过mqtt获取程序文件下载地址,然后存储起来以后跳转到BootLoader
BootLoader访问下载地址,就下载了程序.
1,BootLoader程序就是原先的自建物联网平台里的程序,就不再叙述
2,现在看用户程序
初始化处理
3,连接阿里云的TCP服务器(MQTT服务器),发送MQTT连接协议(实际是注册设备协议)
先以SSL方式连接TCP服务器(MQTT服务器), 然后发送注册协议
提前说下哈, 设备的名字 DeviceName 在一开始初始化的时候就赋值了 (使用的设备的MAC地址)
根据阿里云的文档,组合发送注册设备信息,
使用MQTT发送完以后, 服务器会把注册信息通过MQTT发送给设备, 所以咱直接在MQTT接收回调函数里面获取就可以
把获取到的设备注册信息存储到flash, 然后重启
4.重启之后呢判断下已经注册了
5.设备使用注册的信息连接MQTT服务器
其实最终就是mqtt连接通信哈, 只不过mqtt的那些参数是使用先前的注册的设备信息进行拼接.
6,在连接成功函数中订阅主题和发布消息
那个上报升级进度没用到
7,每隔一段时间请求固件版本
8,接收到固件信息以后存储记录数据,重启
关于Flash分配调整
1.打开BootLoader 或者 用户程序(mcu_project)里面的iap_interface.h 文件
flash的最一开始存储的BootLoader程序, 结尾存储更新相关数据, 预留一些空间让用户存储其它数据
最后剩下的平半分, 一部分存储用户程序, 另一部分用来备份用户程序
用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
用户可以根据自己的需求调整Flash分配大小, 注意:BootLoader程序和用户程序的Flash分配要保证一样.
我设置了BootLoader占用50KB(用户可以根据自己的BootLoader程序的bin文件大小进行更改)
存储更新相关数据至少用1K, 这个用户不要改动.
如果用户在项目中也需要使用flash存储数据, 可以根据自己存储的数据量调整
数据存储的起始地址是: FLASH_USERDATE_ADDR
2.调整完成以后,下载BootLoader程序, 串口会打印flash具体分配
用户需要根据上面打印的设置下用户程序(mcu_project)运行地址和占用空间
3,注意个地方(关于存储用户自己的数据)
存储数据的模子已经写好了,用户按照说明存储自己的数据即可.
用户后期存储自己的数据,从 flash_data_buffer[200] 开始存储
存储可以参考下面的例子
.