zoukankan      html  css  js  c++  java
  • ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

    实现功能概要

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

      这一节,在用户程序里面加入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":"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"}

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

      一,下载单片机程序(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文件的名字

        

      四,编译

        

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

      

  • 相关阅读:
    OkHttp的基本使用方法
    C#中Dictionary小记
    SQL Server表的数据量大小查询
    基于.NET平台常用的框架整理
    JQuery中ajax的相关方法总结
    JQuery中的工具函数总结
    Asp.net MVC 中Controller返回值类型ActionResult
    Plupload文件上传组件使用API
    HTTP 方法:GET 对比 POST
    C#使用简单邮件传输协议(SMTP)发送邮件
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11854595.html
Copyright © 2011-2022 走看看