实现功能概要

  前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级.

  这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级

  注意:BootLoader程序还是用以前的程序.

  一开始设计这个升级篇的时候,我就规定好了大的框架

  BootLoader只是负责升级,其它一概不管

  用户程序只是写入升级标志,然后重启,所有的升级步骤全部交给BootLoader!

  协议:

  

注:所有的实现MQTT的软件,统称为MQTT上位机

一,MQTT上位机通过MQTT发送获取设备信息指令
{"data":"updata","cmd":"DeviceInfo"} //设备接收到回复
{"data":"updata","model":"STM32_AT8266","version":"1.0.2"}//假设现在的型号是STM32_AT8266,当前设备硬件版本是1.0.2 二,MQTT上位机根据型号使用http访问云端存放的记录更新信息的文件
"型号"
列如:上位机使用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"} 后面的 "details":"1,优化了部分BUG;2,测试升级;3,支持升级STM32程序;4,修改XXXBUG" MQTT上位机可作为升级提示信息,提示给用户
注:版本号最大设置为20字节 三,MQTT上位机对比版本号,如果不一致,则发送以下指令
{"data":"updata","cmd":"start"} 注:测试时可直接发送此指令 //设备接收到回复
{"data":"updata","status":"start"} 四,设备连接上MQTT发送的第一条消息为
"{\"data\":\"status\",\"status\":\"online\",\"UpdataStatus\":\"UpdataSuccess\",\"version\":\"1.0.4\"}" UpdataSuccess 更新成功
RunAppErr 上次更新的程序没有运行起来
NoUpdata 没有更新
DataAddressError 更新的数据有错误
DataOverflow 数据溢出
DataDownloadTimeout 下载超时
MainTimeout 更新超时
FlashWriteErr 写Flash失败
FlashEraseErr 擦除Flash失败
VersionLenErr 版本号长度 等于0 或者大于20
VersionAlike 版本号一致,是最新程序,无需更新 ----------------------------------------------------------------
控制指令,查询继电器状态
{"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":""}

快速测试(使用本人的服务器:测试准备工作)

  一,下载单片机程序(BootLoader)

    

  二,下载第一份用户程序

    

    

  二,调整波动开关位置,STM32和Wi-Fi 串口 通信

      

  三,短接STM32的PB2和Wi-Fi模块的RST引脚(内部程序使用该引脚硬件复位Wi-Fi)

      

  四,安装这节使用的APP

    

    

快速测试(使用本人的服务器:配网绑定)

  注:还是那样配网....

  一.打开手机APP,点击右上角菜单 "添加设备" ,手动输入自家路由器密码.(路由器名称为自动获取,不需要用户填写)

                     

  二.长按PB5大约4S,等待指示灯快闪,松开PB5,Wi-Fi模块进入配网状态

        

  三.点击APP的搜索设备按钮,开始搜索设备,搜索成功,将自动跳转到主页面,并显示设备

            

  四.单片机控制Wi-Fi连接上MQTT服务器以后,指示灯1S闪耀

        

快速测试(使用本人的服务器:现在用APP控制硬件更新)

  一.点击设备进入,设备控制页面,点击最下面的检查更新

    

  二.点击确定

    

  三.设备开始更新

    

  四,更新完成以后

    

应用到自己的服务器

应用到自己的服务器

应用到自己的服务器

应用到自己的服务器(修改BootLoader程序)

  一,修改为自己的Web服务器的IP地址和端口号,文件访问路径自己随意.

    编译.

    

应用到自己的服务器(修改用户程序1)

  一, 修改为自己的MQTT信息,如果前面修改了设备型号,此处也要做修改.

    编译.

    

应用到自己的服务器(修改用户程序2)

  一, 修改为自己的MQTT信息,如果前面修改了设备型号,此处也要做修改.

    编译.

       

应用到自己的服务器(把文件放到Web服务器中)

  一,拷贝记录设备版本的updatainfo.txt文件,和用户程序1文件(Progect.bin),用户程序2文件(Progect2.bin)到服务器

      

      

      

  二,拷贝效果如下

    注:这次的设备取了一个型号 STM32_MQTT_AT8266

        

应用到自己的服务器(修改APP)

  一,修改APP访问的MQTT信息

    

  二,修改APP访问的http信息

    

  三,卸载原来的APP,用软件安装最新的

    

应用到自己的服务器(测试)

  一,下载单片机程序(BootLoader)

      

  二,打开APP,配网绑定设备(只下载了BootLoader,咱让单片机自己下载第一份用户程序)

    我就不再啰嗦了,配网绑定还是和上面一样,只截图提示一下.

        

            

  三.等到单片机更新完程序,执行刚更新的用户程序,连接上MQTT以后,指示灯会1S 闪耀

    注:如果等了3分钟没有出现闪耀说明没有更新进去,可重新配网.

        

  四.点击APP的 检查更新

    因为是刚更新进去的程序,所以当然是最新版本了.

    

  五.去云端修改下版本

    

     六.点击APP的 检查更新

     

  七.更新完成

    

详细单片机代码制作步骤(BootLoader程序制作)

  一,拷贝升级篇第一节使用Wi-Fi模块定时升级的 BootLoader程序到当前文件夹

    

  二,为了和以前升级程序区别开来,取一个新名字  STM32_MQTT_AT8266

    BootLoader程序只需要修改这个就可以,修改完了.

    

  三,内存分配情况还是以前的

    

详细单片机代码制作步骤(用户程序制作)

  注:  由于在用户程序里面,MQTT处理程序是比较多的,升级处理程序就一点点

    为了移植的方便快捷一点,咱呢,就在实现MQTT的程序上加上升级处理程序

  一,拷贝基础篇的Wi-Fi模块使用AT指令实现MQTT通信的单片机程序源码,到咱现在的目录

    

  

  二,拷贝升级篇"测试STM32远程乒乓升级,基于(WIFI模块AT指令TCP透传方式),定时访问升级"

    用户程序里面的IAP文件和stmflash文件到现在的用户程序工程里面

      

  三,添加文件,包含头文件

    

  四,设置软件生成bin文件,并编译

    

  

  五,看下生成的bin文件大小

    

    六,还记得当前单片机的Flash分配不

    

                        

    Flash超了.....没办法,我就去掉用户程序里面的OLED的程序,来解决Flash超的问题

    所以我的利用MQTT升级的用户程序都去掉了OLED部分

    所以我建议大家最好用128KB Flash及其以上的单片机来做.

  七,用户程序加上获取更新状态,获取版本和处理更新状态

    拷贝路径: 升级篇的第一节使用Wi-Fi模块定时升级的用户程序里面

    7.1 获取更新状态,程序版本

      

      

    

    7.2 处理更新状态,清除更新状态

      咱的这个处理呢!加在用户程序连接上MQTT,向MQTT发送的第一条消息里面

      

      \

  八,用户程序加上处理MQTT升级相关指令

    8.1,用数组存储型号,这个型号记得和BootLoader程序保持一致

      

    8.2,在原来处理MQTT数据的地方加上处理更新部分

      

单独运行用户程序,测试下通信

  一,为了方便测试,我把程序中发布和订阅的主题设置成自定义的

    

  二,不过呢,我还是改一下,毕竟咱连接的一个MQT服务器,订阅和发布的主题只要对应便建立通信了

    如果大家都用1111作为发布的主题,2222作为订阅的主题来测试,有可能别人控制我的设备

    我也有可能也控制了别人的设备.

    

  三,打开调试助手,我重新做了一个新版的C#的MQTT调试助手

    

  四,设置好参数

    

  五,下载单片机程序,正常操作以后,MQTT客户端会收到设备发送的连接上MQTT以后的第一条信息

    因为没有加BootLoader程序初始化版本 所以version 就是空的.

    

  六,发送询问设备信息指令  {"data":"updata","cmd":"DeviceInfo"}

    

  七,发送个升级指令,看看是否回复,然后看看是否重启  {"data":"updata","cmd":"start"}

    

配置生成第一份bin文件

  一,修改配置

    

  二,编译,生成bin文件

    

    

复制出来一份用户程序作为第二份程序文件

  一,复制一份用户程序文件

    

  二,配置一下中断向量偏移,还有这份文件运行的位置

    

  三,设置一下生成的bin文件的名字

    

  四,编译

    

把文件放到服务器按照一开始介绍的测试

  

ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级的更多相关文章

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

    前言 这一节和上一节是搭配的 给大家鱼,也必须给鱼竿! 我期望自己封装的代码,无论过了多少年都有应用的价值! 这节说明一下制作APP用户程序的过程 咱是用MQTT通信控制模块实现升级,所以首先自己的程 ...

  2. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级

    实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...

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

    前言 这节演示下,上两节写的利用MQTT来控制STM32控制的程序 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootLoader程序(请自行下载) 首先BootLo ...

  4. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块AT指令TCP透传方式,定时访问升级(含有数据校验)

    实现功能概要 单片机定时使用http访问云端的程序版本,如果版本不一致, 然后通过http下载最新的升级文件,实现远程升级STM32程序. 兼容Air202 ,SIM800 测试准备工作(默认访问我的 ...

  5. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定时访问升级(兼容Air202,SIM800)

    实现功能概要 单片机定时使用http访问云端的程序版本, 如果版本不一致,然后通过http下载最新的升级文件,实现远程升级STM32. 兼容Air202,SIM800 测试准备工作(默认访问我的服务器 ...

  6. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于WIFI模块AT指令TCP透传方式,定时访问升级(含有数据校验)

    实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootL ...

  7. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(WIFI模块AT指令TCP透传方式),定时访问升级

    前言 学习此代码所需: 实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说 ...

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

    前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...

  9. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,升级流程源码详细说明

    前言 1.BootLoader程序,升级简要流程图 2.其实主要的就是把程序文件写入环形队列,然后环形队列取出来数据写入Flash 3.用户程序,简要流程图 下面的读一下,有个印象就可以: 说白了就是 ...

随机推荐

  1. ajax.readyState和HTTP状态码的提示

    ajax.readyState 0 -(未初始化)还没有调用send()方法 1 -(载入)已调用send()方法,正在发送请求 2 -(载入完成)send()方法执行完成,已经接收到全部响应内容 3 ...

  2. 网Js RSA加密,后端(Asp.Net)解码(非对称加解密)

    前言 RSA加解密知识自行百度了解决一下 1.取得公钥与私钥方法 JSEncrypt Download 下载后将其发布成网站进入:http://127.0.0.1:3000/demo/index.ht ...

  3. Rust从入门到放弃(1)—— hello,world

    安装及环境配置 特点:安全,性能,并发 rust源配置 RLS安装 cargo rust管理工具,该工具可以愉快方便的管理rust工程 #!/bin/bash mkdir learn cd learn ...

  4. 2019-11-29-dotnet-core-使用-GBK-编码

    原文:2019-11-29-dotnet-core-使用-GBK-编码 title author date CreateTime categories dotnet core 使用 GBK 编码 li ...

  5. C# 方法默认访问级别 : private C# 类默认访问级别 : internal

    C# 方法默认访问级别 : private C# 类默认访问级别 : internalpublic:访问不受限制.protected:访问仅限于包含类或从包含类派生的类型.Internal:访问仅限于 ...

  6. LinuxShell——变量

    LinuxShell——变量 摘要:本文主要学习了Shell命令中的变量. 什么是变量 简单的说,变量就是让某一个特定字串代表不固定的内容. 变量是计算机内存的单元,其中存放的值可以改变.当Shell ...

  7. MTSC2019大会日程重磅发布,腾讯WeTest独家Topic大揭秘!

    WeTest 导读 中国移动互联网测试开发大会 Mobile Testing Summit China(简称 MTSC)是由国内最大的移动测试技术社区 TesterHome 发起的软件测试行业技术会议 ...

  8. 第九届极客大挑战——Geek Chatroom(sql盲注)

    首先观察这个web应用的功能,可以任意留言,也可以搜索留言,当然我还用cansina扫描过网站,查看过源码,抓包查看过header等.没发现其他提示的情况下断定这就是个sql注入,可能存在的注入点呢, ...

  9. vue学习指南:第一篇 - vue的介绍

    三大主流框架: 1. Vue.js 是目前最火的一个前端框架,react是最流行的前端框架 (react除了开发网站,还可以开发手机app,Vue语法也是可以用于手机App开发的,需要借助于wexx) ...

  10. 电信NBIOT 4 - NB73模块上行测试(NB73-电信平台-自己平台)

    电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...