zoukankan      html  css  js  c++  java
  • 10-STM32+ESP8266+AIR202远程升级方案-功能3-手机APP控制STM32远程更新固件程序,基于ESP8266

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    前面章节是单片机主动访问升级,这节使用Android软件控制远程更新单片机程序!

    请用户从第一节开始看,前面说过的不再重复赘述!

    升级流程如下:

    APP/微信小程序/其它上位机控制STM32实现远程升级协议:
    APP/微信小程序/其它上位机以下统称为上位机软件
    
    1.上位机软件首先通过MQTT发送询问设备信息指令>>
    {"data":"updata","cmd":"DeviceInfo"}
    
    
    2.设备收到以后回复型号和固件版本号(假设型号是:STM32APPESP8266BKAPP  固件版本是:0.0.0)
    {"data":"updata","DeviceModel":"STM32APPESP8266BK","FirmwareVersion":"0.0.0"}
    
    
    4.上位机收到设备型号以后,根据设备型号,使用http/https访问获取对应的info.txt文件
    假设info.txt文件信息如下:
    {"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32APPESP8266BKAPP/user_crc.bin","info":"1.解决了部分BUG
    2.优化了部分程序"}
    
    
    5.上位机对比版本号:  0.0.00.0.1  不一致,弹出选择是否更新对话框.
    注:对话框的提示信息为:  1.解决了部分BUG 2.优化了部分程序 
    注:如果版本号一致,则提示用户版本是最新无需升级
    
    
    6.如果用户点击了升级,通过MQTT发送以下信息给设备
    {"data":"updata","size":15990,"url":"http://mnif.cn/ota/hardware/STM32APPESP8266BKAPP/user_crc.bin"}
    
    
    7.设备接收正确解析以后回复
    {"data":"updata","status":"start"}  //设置为保留消息,上位机订阅主题便可立即知道设备是不是在执行更新.
    
    
    8.设备上线以后需要第一时间发送更新状态(携带着更新状态变量,版本号)
    {"data":"updata","UpdataValue":0-255,"FirmwareVersion":"0.0.1"} //设置为保留消息
    
    9.上位机收到该消息以后提示更新完成!或者更新失败,请重试!
    
    
    其它:
    设备在发送完更新状态以后,紧接着发送一条上线信息
    {"data":"status","status":"online"} //设置保留消息,用于冲掉上面保留的消息.
    
    补充:升级进度(升级进度是使用MQTT发送,需要在BootLoader里面加上MQTT通信,小容量单片机和AT指令版本的暂不考虑)
    {"data":"updata","progress":"[0-100]"}

    测试本节功能

    1.单片机串口1作为日志打印口,串口2和模块通信
    (STM32)PA3 -- TX(WiFi)
    (STM32)PA2 -- RX(WiFi)



     

    2.下载BootLoader程序

    3.下载用户程序

    注:需要用下载器

    4.安装手机APP

    5.按照前面基本控制方案里面的APUConfig绑定WiFi

    点击设备进入控制页面

    6.点击右上角菜单选择固件升级

    7.选择确认

    8.更新中

    9.更新完成

    10.再次点击固件升级的时候将会显示版本已是最新.

    程序说明

    1,前面的章节中是单片机主动访问 info.txt文件里面的信息,

    然后根据信息控制升级,这节只不过是手机APP去获取这个信息,

    然后对比下版本号,如果版本号不一致就把升级信息发给设备,控制设备升级.

    2.打开APP源码

    当用户点击了 固件升级 以后 

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

    3.设备收到消息以后回复 型号和版本号

    4.APP根据设备型号获取 info.txt文件

    5.如果版本不一致,弹出提示框

    6.如果用户点击了确认,就把info.txt里面的size字段和url字段的数据发给设备

    7.设备接收到以后解析信息

    8.解析完成以后,把size,url存入falsh,发送{"data":"updata","status":"start"} 给服务器

    消息等级为1,确保发给了服务器. 

    设置需要服务器保留消息,其它上位机订阅设备的主题便可立即获取这条消息,知道设备是在执行更新.

    9.发送完成以后执行重启操作,在BootLoader里面执行更新

    10.APP收到上面的指令以后,显示进度条对话框,提示正在更新

    11.设备更新完成以后执行用户程序

    连接上MQTT以后第一时间上报 设备的更新状态变量和当前版本

    12.APP显示更新状态

    重要细节

    1.发送{"data":"updata","status":"start"} 给服务器,消息等级设为了1,是为了确保发给了服务器. 

    2.我还设置了需要服务器保留这个消息

    保留消息目的是,在设备更新的过程中,如果APP刚进入设备页面,

    只要订阅这个设备发布的主题,APP便可获取到

    "{"data":"updata","status":"start"}"  这条消息

    然后直接弹出 正在更新的对话框.

    3.在第一时间发送完设备的更新状态变量和当前版本以后

    下面还写了一个发送上线信息(设置需要服务器保留消息)

    服务器会默认保证最后一条让服务器保留的消息

    我只让服务器保留上线消息.

    升级程序和前面章节的区别

    1.首先没有大区别,服务器上面的该怎么弄还是怎么弄.

    只不过本来是设备直来直去的访问info.txt

    现在是让APP去访问info.txt,然后对比版本号以后再把更新信息发给设备.

    2.修改了一个小地方

    我需要把更新状态传递出去,所以修改了下这个函数

     

    Android 程序细节

    1.Android P 及其以上版本Google为了安全不能直接使用 http

    如果想使用 可以在 AndroidManifest 增加 android:usesCleartextTraffic="true"

    2.在HttpHelper 中为提供了一份http的和一份https的

    https是忽略认证

  • 相关阅读:
    对于“机器视觉(computer version)”的反思
    图像视觉的调试
    对自主标定的实现
    使用dll,将image库开放出去
    使用liner、feather、multiband对已经拼接的数据进行融合(下)
    使用liner、feather、multiband对已经拼接的数据进行融合
    模版多匹配
    Metasploit AFP爆破模块afp_login
    SQLite中SELECT基本形式
    Nmap 7.70新增功能——扫描主机所有IP
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/13587571.html
Copyright © 2011-2022 走看看