001-使用阿里云物联网平台 OTA 远程升级STM32程序-基于ESP8266
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
这节说明一下如何使用阿里云物联网平台的OTA远程升级STM32程序-基于ESP8266
用户必须已经学习完了基本控制方案里面的阿里云物联网平台教程
和远程升级方案里面的自建服务器实现远程升级的教程!
阿里云物联网平台是通过MQTT获取升级固件的地址信息,
其实和咱自建服务器里面的使用APP/微信小程序控制单片机升级是一样的套路!
只不过咱是把程序文件放到物联网平台服务器上而已.
提示:咱放到云平台上面的固件也是和自建服务器里面的一样添加完CRC校验的固件,
咱整个程序其实只修改了用户程序里面获取固件信息的方式而已!
升级概述
1,实现升级是使用的基础通信里面的Topic
阿里云介绍文档:
https://help.aliyun.com/document_detail/89307.html?spm=a2c4g.11186623.6.712.2409429dNoQXsh
/ota/device/inform/a1m7er1nJbQ/${deviceName}
设备通过这个主题上报自己的 版本号
格式: {"id":"0000","params":{"version": "0.0.1"}}
/ota/device/upgrade/a1m7er1nJbQ/${deviceName}
设备需要订阅这个主题,服务器会通过这个主题下发固件信息
size是固件大小; version是服务器固件版本; url是固件下载地址
{ "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}
上报更新进度
/ota/device/request/a1m7er1nJbQ/${deviceName}
主动请求云端固件信息
生成固件程序
1.打开用户程序
2.根据自己在平台注册的设备信息修改
注:这节密码需要自己填上了,因为内存不够了,所以屏蔽了自动计算密码的地方.
3.让WiFi连接自己的路由器
4.修改固件的版本
5.编译生成bin文件
6.打开OTA Tools.exe软件生成带有CRC校验的固件
在物联网平台上新增固件
1.设备运维 - 固件升级 - 新增固件
fdg
2-上传固件
固件名称:随意
所属产品:选择一个自己在平台上注册的产品
注:固件版本号要和单片机程序里面的保持一致
3.当前固件会显示未验证
阿里云物联网平台规定上传的固件需要先测试验证
就是用其中的一台设备先跑个流程.
下载单片机程序
1.下载BootLoader程序到单片机
2.用下载器下载用户程序到单片机
1.修改用户程序版本为000000
注:我只是为了区分出来各个设备,当我这个设备的版本号是特殊的,我好用这个设备测试
3.选择擦除使用区的Flash,然后下载
4.确保用户程序正常运行
5.在平台上点击验证固件,待升级的版本号选择000000
6.选择咱的那个设备
7.设备升级超时时间根据自己的设备设置
当前我的程序升级过程小于1分钟.
8.点击完确定以后,设备会收到服务器通过MQTT发送的更新信息
{"code":"1000","data":{"size":20410,"sign":"8ee365e63505202184af25bc73d8d79e","version":"0.0.1","url":"https://iotx-ota.oss-cn-shanghai.aliyuncs.com/ota/5f0103cd96ad6ac7d12b5492a54b003c/ckevmjb0o00004k8617tle1qq.bin?Expires=1599757056&OSSAccessKeyId=LTAI4G1TuWwSirnbAzUHfL3e&Signature=qokk4wdr78CTsehWDf3aE2T9ye8%3D","signMethod":"Md5","md5":"8ee365e63505202184af25bc73d8d79e"},"id":1599670656831,"message":"success"}
单片机程序提取 size字段,和url字段的内容存到flash里面重启!执行BootLoader
9.BootLoader获取程序文件
10,下载完程序重启
11,执行下载的程序
第一时间上报当前程序版本
12,刷新一下网页
13,咱现在就用设备验证好了固件,现在固件可以让其它设备用了
14,因为我就一个设备,还做为了验证固件用的,我那天设备的固件版本已经是0.0.1最新
所以这里找不到待升级的设备
15,可以修改下用户程序的版本为0.0.0
然后重新下载用户程序,就当做咱的老版本设备.
16,下载完用户程序,看到上报版本了以后
17,选择0.0.0的那个版本
其它的选项一看就明白哈,就不说了.
18,设备升级了
19,这样子,关于阿里云物联网平台控制升级的步骤就说完了
其实稍微总结下就是:
使用阿里云物联网平台给的关于升级的MQTT的主题
从主题里面获取升级的信息,提取size,和url
然后存储到flash里面,然后就交给BootLoader访问下载了
设备上线以后需要第一时间上报下版本号,然后就好了
云端提交的固件说明
1.我让大家提交的是用我写的OTA工具加上CRC校验后的固件
细心的用户会发现,平台提供了默认MD5校验
我没选择用平台提供的MD5,因为我如果用了就需要单片机对整个bin文件
做MD5,我想想还是算了吧!
还是沿用了我自建服务器里面的方式!bin文件自己加CRC校验位
这样底层BootLoader不需要改变代码就可以兼容各大物联网平台!
在稳定可靠的基础上,就要倾向于代码的通用性!
单片机程序说明
1.首先BootLoader程序和自建服务器里面的一模一样!!就不再多说了
2.用户程序比较抱歉的事情是由于内存原因屏蔽掉了计算密码部分
突然想起来一句话:巧妇难为无米之炊
3.程序里面增加了接收/发送升级信息的主题
4.订阅接收升级消息的主题
连接上平台第一时间上报自己的版本号
5.如果接收到更新相关的消息提取url和size写入flash
其余的就交给BootLoader程序了
不过阿里云给的是https链接,前半个月还可以用ESP8266的https访问下载
现在却不行了,郁闷中.....不过也可以用80端口访问下载.
所以我把链接中的https改为了http