ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级(含有数据校验)-APP用户程序制作过程
前言
这一节和上一节是搭配的
给大家鱼,也必须给鱼竿!
我期望自己封装的代码,无论过了多少年都有应用的价值!
这节说明一下制作APP用户程序的过程
咱是用MQTT通信控制模块实现升级,所以首先自己的程序先实现MQTT哈.
协议
注:所有的实现MQTT的软件,统称为MQTT上位机 一,MQTT上位机通过MQTT发送获取设备信息指令(用户在APP上点击检查更新时发送此命令)
{"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":,"SumBin2":,"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":"","status":"-1"} 设备回复 {"data":"switch","bit":"","status":""} 或者 {"data":"switch","bit":"","status":""} 六,控制指令,控制继电器吸合
{"data":"switch","bit":"","status":""} 设备回复 {"data":"switch","bit":"","status":""} 七,控制指令,控制继电器断开
{"data":"switch","bit":"","status":""} 设备回复 {"data":"switch","bit":"","status":""}
准备一个工程
把基础篇的已经实现MQTT通信的工程拷贝过来

把以下文件放到自己的工程
stmflash文件直接拷贝的上一节的
IAP和上一节的不一样,做了很多裁剪.

注:受内存影响,去掉了OLED部分
主函数配置
1.包含下头文件

2.调用一个函数 IAPGetUpdateInfo();//获取更新的信息

处理更新
先说一下哈,处理更新是这个函数
IAPUpdateDispose();
这个函数主要就是清零更新状态,然后如果判断运行的是新程序,则切换程序版本.

然后说一下上面函数的妙处
如果在BootLoader里面程序文件下载成功

BootLoader下载好程序以后呢,写入状态为:0x01 然后重启了
重启以后当然还是先运行 BootLoader
然后 BootLoader 判断是0x01以后 写入 0xFF
然后运行新的用户程序
假设用户程序有问题 没有执行函数 IAPUpdateDispose();
那么就没有把升级状态清零
那么单片机重启以后又运行 BootLoader,此时BootLoader里面一判断还是0xFF
便会认为没有正确执行用户程序,就会切换上一份用户程序执行
然后总的来说就一句话:
你认为APP用户程序运行没有问题了以后再调用 IAPUpdateDispose();
这节建议这样处理
在连接上MQTT以后,咱调用下 IAPUpdateDispose();
然后把升级状态通过MQTT发出去

/**
* @brief 连接上MQTT以后发送一条上线指令
* @param
* @param
* @retval
* @example
**/
void FunctionSendOnline(void)
{
IAPUpdateDispose(); //如果不使用自定义的配置
#ifndef UserCustomConfig //device/Wi-Fi的MAC
memset(MQTTPublishTopic,NULL,sizeof(MQTTPublishTopic));
sprintf(MQTTPublishTopic,"%s%s","device/",&MQTTid[]);//组合发布的主题
#endif
MqttPublishTopicStruct.topicName.cstring = MQTTPublishTopic;//设置发布的主题
MqttPublishTopicStruct.qos = ; //消息等级
MqttPublishTopicStruct.retained = ; //需要服务器保留消息
//连接上MQTT以后发送一条上线信息,携带着更新状态,当前设备版本
MainLen= sprintf(MainBuffer,"{\"data\":\"status\",\"status\":\"online\",\"UpdataStatus\":\"%s\",\"version\":\"%s\"}",
IAPStructValue.UpdateStatusStr,//更新的状态
IAPStructValue.VersionDevice //当前设备版本
);//组合发送的数据
MainLen = MqttPublish(MqttPublishTopicStruct,MainBuffer,MainLen);//打包MQTT数据
UsartOutStr(MqttSendData,MainLen);//发送MQTT协议数据
MqttPublishTopicStruct.retained = ; //后期的数据不需要服务器保留消息
}
加上处理更新协议

如果通过MQTT接收到获取设备信息指令
就返回设备信息(型号,和当前版本号)
MQTT上位机根据型号,http访问对应的 updatainfo.txt
然后对比下版本号,如果不一致,就提示给用户有新版本
然后用户点击升级的时候 再发给模块 开始更新的指令
模块收到以后设置更新标志
返回给MQTT 我要升级了 "{\"data\":\"updata\",\"status\":\"start\"}" 嘻嘻嘻
然后呢 重启就好了
因为有了升级标志,BootLoader里面就去执行升级去了
先查看一下用户程序的bin文件大小

咱上一节BootLoader里面设置的
0x5C00 = 23KB 设置的可以满足

配置生成第一份程序文件



配置生成第二份程序文件



打开计算校验和软件


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

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


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



测试放到下一节
…
ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级(含有数据校验)-APP用户程序制作过程的更多相关文章
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级
实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级
实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块(ESP8266)AT指令TCP透传方式,MQTT通信控制升级(加入数据校验)
前言 这节演示下,上两节写的利用MQTT来控制STM32控制的程序 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootLoader程序(请自行下载) 首先BootLo ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块AT指令TCP透传方式,定时访问升级(含有数据校验)
实现功能概要 单片机定时使用http访问云端的程序版本,如果版本不一致, 然后通过http下载最新的升级文件,实现远程升级STM32程序. 兼容Air202 ,SIM800 测试准备工作(默认访问我的 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定时访问升级(兼容Air202,SIM800)
实现功能概要 单片机定时使用http访问云端的程序版本, 如果版本不一致,然后通过http下载最新的升级文件,实现远程升级STM32. 兼容Air202,SIM800 测试准备工作(默认访问我的服务器 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于WIFI模块AT指令TCP透传方式,定时访问升级(含有数据校验)
实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootL ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(WIFI模块AT指令TCP透传方式),定时访问升级
前言 学习此代码所需: 实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说 ...
- ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)
前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,升级流程源码详细说明
前言 1.BootLoader程序,升级简要流程图 2.其实主要的就是把程序文件写入环形队列,然后环形队列取出来数据写入Flash 3.用户程序,简要流程图 下面的读一下,有个印象就可以: 说白了就是 ...
随机推荐
- 构建Electron的常见问题(Mac)
背景 起因是产品的需求,需要更换Electron为底层平台,但因为会有不少定制化的功能要实现,必须自己实现此类内容,所以也就导致必须自己编译Electron的源代码. 整个构建过程,看Electron ...
- JS---DOM---元素相关的操作方法
1. 追加子元素 my$("dv").appendChild(obj); 2. 把新的子元素插入到第一个子元素的前面 my$("dv").insertBefor ...
- Linux命令详解 三
Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...
- 自生成图片验证码Servlet
package com.woniuxy.busniess.servlet; import java.awt.*; import java.awt.geom.*; import java.awt.ima ...
- 解读并加工BeautifulReport 报告模板
使用unittest框架的脚本执行完成后,会生成一个html格式的报告 这个报告是提前制作了一个html的模板,然后将对应的内容写入到模板中,并生成一个最终的报告,这个报告模板在通过 pip inst ...
- 被忽略的CSS规则
说起CSS规则,除了普通规则(属性和值,key:value),可能大家都会想到@media,@keyframes,@fontface等常用的,那剩余的大家是否有所了解呢. 我们先来看一看CSS有哪些规 ...
- linux查看占用端口号的程序及pid
netstat -tunlp|grep 端口号 圈出来的就是pid
- Linux中哪些工具堪称神器?
作者:int32bit www.zhihu.com/question/59227720 ag:比grep.ack更快的递归搜索文件内容. Github地址: https://github.com/gg ...
- 深入selenium三种等待方式使用
深入selenium三种等待方式使用 处理由于网络延迟造成没法找到网页元素 方法一 用time模块不推荐使用 用time模块中的time.sleep来完成等待 from selenium import ...
- linux中服务(service)管理
一.介绍 服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙等),因此我们又称为守护进程,是Linux 中非常重 ...