协议


注:所有的实现MQTT的软件,统称为MQTT上位机  一,MQTT上位机通过MQTT发送获取设备信息指令(用户在APP上点击检查更新时发送此命令) {"data":"updata","cmd":"DeviceInfo"}  //设备接收到回复 {"data":"updata","model":"STM32_MQTT_AT8266_A","version":"1.0.2"}//假设现在的型号是 STM32_MQTT_AT8266_A,当前设备硬件版本是1.0.2   二,MQTT上位机根据型号使用http访问云端存放的记录更新信息的文件                                                           "型号" 列如:上位机使用http访问  http://47.92.31.46/hardware/STM32_MQTT_AT8266_A/updatainfo.txt  假设updatainfo.txt文件信息是: {"version":"1.0.45611","SumBin1":219,"SumBin2":103,"details":"1,优化了部分BUG;2,测试升级;3,支持升级STM32程序;4,修改XXXBUG"}  注:版本号最大设置为20字节   APP检测版本不一致时  把后面的 "details":"1,优化了部分BUG;2,测试升级;3,支持升级STM32程序;4,修改XXXBUG" 提示给用户  用户点击更新的时候接着往下看 三,发送以下指令  {"data":"updata","cmd":"start"} 注:测试时可直接发送此指令   //设备接收到回复 {"data":"updata","status":"start"} 然后进入BootLoader程序执行升级去了  为了让APP知道升级的状态 四,设备在执行用户程序连接上MQTT发送的第一条消息为 "{\"data\":\"status\",\"status\":\"online\",\"UpdataStatus\":\"UpdataSuccess\",\"version\":\"1.0.45611\"}"   UpdateStatus_None                  //没有更新 UpdateStatus_DataAddressError      //Flash的高位地址不是0x08 或者 RAM的高位地址不是0x20 UpdateStatus_DataOverflow          //数据接收溢出 UpdateStatus_DownloadTimeout       //程序下载超时 UpdateStatus_MainTimeout           //整个程序运行的时间 UpdateStatus_FlashWriteErr         //Flash 写错误 UpdateStatus_VersionLenErr         //版本号长度错误 UpdateStatus_VersionAlike          //版本号和服务器上面的一致 UpdateStatus_FlashEraseErr         //Flash 擦除失败 UpdateStatus_MissingData           //数据接收不完整 UpdateStatus_SumBinRangeErr        //校验和范围错误(获取的云端的校验和,不在0-255之间) UpdateStatus_SumCheckErr           //校验和不一致 UpdateStatus_RunAppError           //上次更新的程序没有运行起来    ---------------------------------------------------------------- 控制指令,查询继电器状态 {"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"}




准备一个工程

把基础篇的已经实现MQTT通信的工程拷贝过来

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号



把以下文件放到自己的工程

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_02




主函数配置

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_数据_03



ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_04





调用处理更新

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_设备信息_05





发送一条更新状态的信息出去

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_数据_06






加上处理更新协议

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_07




ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_设备信息_08




如果通过MQTT接收到获取设备信息指令

就返回设备信息(型号,和当前版本号)

MQTT上位机根据型号,http访问对应的 updatainfo.txt

然后对比下版本号,如果不一致,就提示给用户有新版本

然后用户点击升级的时候 再发给模块 开始更新的指令

模块收到以后设置更新标志

返回给MQTT 我要升级了 "{\"data\":\"updata\",\"status\":\"start\"}"

然后呢 重启就好了

因为有了升级标志,BootLoader里面就去执行升级去了. 嘻嘻嘻



生成bin文件

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_设备信息_09




看一下bin文件大小.....................

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_10



ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_数据_11



超出了23KB了...这就不好玩了....


第一种方案:改变下程序优化等级

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_校验和_12



我选择的 default

注意: default 就是 Level2

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_13







然后现在是23KB,正好放的下

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_设备信息_14





注意:改变等级以后大家需要多测试下程序

有可能有的代码执行的不对了!!!!


配置生成第一份程序文件


ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_15





ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_16






配置生成第二份程序文件


ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_设备信息_17





ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_18




ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_校验和_19






打开计算校验和软件

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_20



ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_校验和_21




计算第一份程序文件的校验和


ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_22







计算第二份程序文件的校验和

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_23






ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_24

把相应的文件放到云服务器

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_版本号_25




ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_校验和_26







ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级-APP用户程序制作过程(V1.0)_上位机_27






测试放到下一节