前言
这一节和上一节是搭配的
给大家鱼,也必须给鱼竿!
我期望自己封装的代码,无论过了多少年都有应用的价值!
这节说明一下制作APP用户程序的过程
咱是用MQTT通信控制模块实现升级,所以首先自己的程序先实现MQTT哈.
协议
注:所有的实现MQTT的软件,统称为MQTT上位机 一,MQTT上位机通过MQTT发送获取设备信息指令 {"data":"updata","cmd":"DeviceInfo"} //设备接收到回复 {"data":"updata","model":"STM32_MQTT_AT8266_SUM","version":"1.0.2"}//假设现在的型号是 STM32_MQTT_AT8266_SUM,当前设备硬件版本是1.0.2 二,MQTT上位机根据型号使用http访问云端存放的记录更新信息的文件 "型号" 列如:上位机使用http访问 http://47.92.31.46/hardware/STM32_MQTT_AT8266_SUM/updatainfo.txt 假设updatainfo.txt文件信息是: {"version":"1.0.45611","SumBin1":219,"SumBin2":103,"details":"1,优化了部分BUG;2,测试升级;3,支持升级STM32程序;4,修改XXXBUG"} 注:版本号最大设置为20字节 后面的 "details":"1,优化了部分BUG;2,测试升级;3,支持升级STM32程序;4,修改XXXBUG" MQTT上位机可作为升级提示信息,提示给用户 三,MQTT上位机对比版本号,如果不一致,则发送以下指令 {"data":"updata","cmd":"start"} 注:测试时可直接发送此指令 //设备接收到回复 {"data":"updata","status":"start"}
然后进入BootLoader程序执行升级去了 四,设备连接上MQTT发送的第一条消息为 "{"data":"status","status":"online","UpdataStatus":"UpdataSuccess","version":"1.0.4"}" 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"}
把以下文件放到自己的工程
stmflash文件直接拷贝的上一节的
IAP和上一节的不一样,做了很多裁剪.
主函数配置
1.包含下头文件
2.调用一个函数 IAPGetUpdateInfo();//获取更新的信息
这个函数做的工作
获取云端版本: 这个是在BootLoader里面升级的时候存进去的
获取设备版本: 当前这个版本还是以前的程序版本,还没切换呢,后面会说在哪里切换的
获取更新状态: BootLoader里面设置的那些更新状态
大家可以在用户程序里面 通过 IAPStructValue.UpdateStatusValue的值来知道上次更新的状态
为了更直观,大家直接可以调用 printf("%s",IAPStructValue.UpdateStatusStr); 打印对应的字符串
也可以在认为程序没有问题的时候,把这些状态发给上位机,这样就直观的知道更新的状态
处理更新(为什么会有处理更新)
先说一下哈,处理更新是这个函数
IAPUpdateDispose();
这个函数主要就是清零更新状态,然后如果判断运行的是新程序,则切换程序版本.
然后说一下上面函数的妙处
如果在BootLoader里面程序文件下载成功
BootLoader下载好程序以后呢,写入状态为:0x01 然后重启了
重启以后当然还是先运行 BootLoader
然后 BootLoader 判断是0x01以后 写入 0xFF
然后运行新的用户程序
假设用户程序有问题 没有执行函数 IAPUpdateDispose();
那么就没有把升级状态清零
那么单片机重启以后又运行 BootLoader,此时BootLoader里面一判断还是0xFF
便会认为没有正确执行用户程序,就会切换上一份用户程序执行
然后总的来说就一句话:
你认为APP用户程序运行没有问题了以后再调用 IAPUpdateDispose();
这节建议这样处理
在连接上MQTT以后,咱调用下 IAPUpdateDispose();
然后把升级状态通过MQTT发出去