实现功能概要
BootLoader程序:
如果没有更新标志位,则尝试加载用户程序.
如果有更新标志位,STM32控制WIFI模块以TCP方式连接Web服务器,然后发送Get 协议获取程序文件,写入Flash后,重启!
每次写入Flash 切换Flash的写入位置,加入更新状态检测,更新失败则运行上一版程序(程序回滚)
APP用户程序:
处理MQTT接收的数据,如果接收到更新指令,则置位升级标志位,重启
MQTT通信升级规定的协议:
WIFI设备订阅的主题 "user/设备MAC地址" 列如: "user/dc:4f:22:11:5d:33" WIFI设备发布的主题 "device/设备MAC地址" 列如: "device/dc:4f:22:11:5d:33" 一,上位机通过MQTT发送获取设备信息指令 {"data":"updata","cmd":"DeviceInfo"} //设备回复 {"data":"updata","model":"STM32_AT8266","version":"1.0.2"}//假设现在的型号是STM32_AT8266,当前设备硬件版本是1.0.2 二,上位机根据型号使用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字节 三,上位机对比版本号,如果不一致,则发送以下指令 注:测试时可直接发送此指令 {"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"}
Flash配置: