实现功能概要
前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级.
这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级
注意:BootLoader程序还是用以前的程序.
一开始设计这个升级篇的时候,我就规定好了大的框架
BootLoader只是负责升级,其它一概不管
用户程序只是写入升级标志,然后重启,所有的升级步骤全部交给BootLoader!
协议:
代码语言:javascript复制一,MQTT上位机通过MQTT发送获取设备信息指令
{"data":"updata","cmd":"DeviceInfo"}
//设备接收到回复
{"data":"updata","model":"STM32_AT8266","version":"1.0.2"}//假设现在的型号是STM32_AT8266,当前设备硬件版本是1.0.2
二,MQTT上位机根据型号使用http访问云端存放的记录更新信息的文件
"型号"
列如:"http://47.92.31.46/hardware/" STM32_AT8266 "/" "updatainfo.txt"
假设updatainfo.txt文件信息是 {"version":"1.0.4","details":"1,优化了部分BUG;2,测试升级;3,支持升级STM32程序;4,修改XXXBUG"}
注:版本号最大设置为20字节
三,MQTT上位机对比版本号,如果不一致,则发送以下指令 注:测试时可直接发送此指令
{"data":"updata","cmd":"start"}
//设备接收到回复
{"data":"updata","status":"start"}
四,设备连接上MQTT发送的第一条消息为
"{"data":"status","status":"online","UpdataStatus":"UpdataSuccess","DeviceVersion":"1.0.4"}"
UpdataSuccess 更新成功
RunAppErr 上次更新的程序没有运行起来
NoUpdata 没有更新
DataAddressError 更新的数据有错误
DataOverflow 数据溢出
DataDownloadTimeout 下载超时
MainTimeout 更新超时
FlashWriteErr 写Flash失败
FlashEraseErr 擦除Flash失败
VersionLenErr 版本号长度 等于0 或者大于20
VersionAlike 版本号一致,是最新程序,无需更新
----------------------------------------------------------------
控制指令,查询继电器状态
{"data":"switch","bit":"1","status":"-1"}
设备回复 {"data":"switch","bit":"1","status":"1"} 或者 {"data":"switch","bit":"1","status":"0"}
六,控制指令,控制继电器吸合
{"data":"switch","bit":"1","status":"1"} 设备回复 {"data":"switch","bit":"1","status":"1"}
七,控制指令,控制继电器断开
{"data":"switch","bit":"1","status":"0"} 设备回复 {"data":"switch","bit":"1","status":"0"}
测试
制作完代码,哈,
详细的代码制作步骤(这节代码是如何来的)
拷贝使用Wi-Fi模块定时升级的 BootLoader程序
修改BootLoader
为了和以前升级程序区别开来,取一个新名字 STM32_MQTT_AT8266
BootLoader程序只需要修改这个就可以,修改完了.
下面看用户程序
由于在用户程序里面,MQTT处理程序是比较多的,升级处理程序就一点点
为了移植的方便快捷一点,咱呢,就在实现MQTT的程序上加上升级处理程序
一,拷贝基础篇的Wi-Fi模块使用AT指令实现MQTT通信的单片机程序源码,到咱现在的目录