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

前言

  这一节和上一节是搭配的

  给大家鱼,也必须给鱼竿!

  我期望自己封装的代码,无论过了多少年都有应用的价值!

  这节说明一下制作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发出去

  

  

  

  

    

原文地址:https://www.cnblogs.com/yangfengwu/p/12075412.html

时间: 2024-10-17 03:44:22

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于Wi-Fi模块AT指令TCP透传方式,MQTT通信控制升级(含有数据校验)-APP用户程序制作过程的相关文章

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级(含有数据校验)

前言 这一节实现的功能是使用MQTT通信控制模块去升级 其实和这一节实现的功能一样  https://www.cnblogs.com/yangfengwu/p/11854595.html 这一节还是着重讲解一下如何移植升级升级程序到自己的项目 我做的单片机远程升级封装文件的目的是希望大家直接移植到自己的项目使用! 准备一个已经实现了TCP的工程,拷贝升级处理文件 1.准备的工程 2.把BootLoader需要用到的文件拷贝到自己的工程 拷贝到自己的项目里面 整理下工程 1.自行添加到工程,还有设

ESA2GJK1DH1K升级篇: 测试STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 注意:BootLoader程序还是用以前的程序. 一开始设计这个升级篇的时候,我就规定好了大的框架 BootLoader只是负责升级,其它一概不管 用户程序只是写入升级标志,然后重启,所有的升级步骤全部交给BootLoader! 协议: 一,MQTT上位机通过MQTT发送获取设备信息指令 {"da

ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)

前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定时访问升级 这节将告诉大家如何移植到其它型号的单片机. 这一节以 STM32F103RET6 (512KB Flash 64KB RAM) 为例 我使用我的这块板子 大家测试的时候可以按照下面的方式接到自己的GPRS模块(Air202 / SIM800) 单片机串口1 接到GPRS的AT指令配置串口

WIFI网络(ESP8266)升级STM32:程序固定Flash地址写入,运行 ( AT指令版;TCP透传方式;不支持MQTT )

前言 这一节为下面两节的结合 实现功能概要 BootLoader程序: 如果Flash没有存储更新标志和用户没有在操作更新,就尝试加载用户程序.    (一直在主循环中判断)           如果有更新标志,控制WIFI以TCP方式连接Web服务器,获取当前程序版本,如果版本不一致,则获取程序文件.实现升级 如果用户按下配网按钮,配网以后,置位更新标志,重启! APP用户程序: 每隔10S,控制WIFI以TCP方式连接Web服务器,获取当前程序版本,如果版本不一致,置位更新标志,重启! 总结

ESA2GJK1DH1K基础篇: STM32+Wi-Fi(AT指令版)实现MQTT源码讲解

前言 该程序需要的基础知识:  https://www.cnblogs.com/yangfengwu/category/1566194.html   所有源码开源,请自行学习 打开第一节的源码 为了方便修改,我用数组存储了些参数 然后看链接MQTT部分 说个地方 然后看 判断连接状态 接着看订阅 判断订阅是否成功 发送一条上线消息 连接MQTT部分就结束了,然后就到了主循环了 一,配网 二,处理接收的数据 三,每隔一段时间采集发送温湿度数据 看下我的心跳包处理 说下我的处理思路 首先,如果到了发

基于hc-05蓝牙模块控制的步进电机指定旋转角度

一.蓝牙模块 蓝牙选用[HC-05主从机一体蓝牙模块 无线蓝牙串口透传 无线模块 电子模块],淘宝链接地址为:https://detail.tmall.com/item.htm?id=41281471872&spm=a1z09.2.0.0.u7iKss&_u=m10qactucc9f 二.手机端APP 手机端蓝牙串口调试助手,如图一所示: 图一 用手机数据线连接手机,下载上图所示[蓝牙串口调试助手].下载完毕后,打开手机APP,如图二所示: 图二                      

ESA2GJK1DH1K升级篇: 阿里云物联网平台 OTA: 关于阿里云物联网平台 OTA 的升级流程

前言 鉴于有些用户直接想使用现成的物联网平台实现 OTA 远程升级 我就写一写这系列的文章 注意:首先大家必须把我自建服务器是如何实现的看明白! 我看了下阿里云提供的,实际上流程和咱自建实现的差别不大 https://help.aliyun.com/document_detail/85700.html?spm=a2c4g.11186623.6.699.6292740d5hzKl6 首先控制升级获取当前程序的版本号等走的还是MQTT 设备端首先通过MQTT获取云端的版本信息,还有程序固件的http

3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(项目功能演示--远程升级WIFI模块程序)

2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(视频总揽) 为了节省时间,基础篇的基础内容不再叙述 , 原文地址:https://www.cnblogs.com/yangfengwu/p/10360618.html

【转载】运维职业向!我是怎么入得运维行业?运维工程师入门必备技能以及打怪升级篇

前言:转载 陈浩一个从事安全运维向的前辈文章.写的很好.人非常nice,遇到了问题,qq上很快就回复了我. 大道三千 入门最难,凡事入了行,也就什么都好说了,好的自然不断努力奋斗修行,不好的自然很快就被淘汰.恭谨勤勉,时不我待~ ---------------------------------------------------------------------------------------------------------------------------------------