10-STM32+ESP8266+AIR202远程升级方案-功能3-手机APP控制STM32远程更新固件程序,基于ESP8266
说明
前面章节是单片机主动访问升级,这节使用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.0 和 0.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是忽略认证
- Properties+重温Map+本地计数器Map方法Properties的方法用Properties的好处
- SequenceInputStreamSequenceInputStream构造方法读关流刷新
- 怎么实现关闭窗口
- java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
- 不可不知的一点Python陷阱
- 10个应该早点知道的Python技巧
- 一文读懂如何用 Python 实现6种排序算法
- 5 个很好的 Python 面试题
- Python部署手记:django, gunicorn, virtualenv, circus, nginx
- Python图像处理库:Pillow 初级教程
- 陷阱!python参数默认值
- 怎么样才算是精通 Python?
- 教你一招 | Python实现无向图最短路径
- 教你一招 | Python装饰器的另类用法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现apk插件方式换肤的实例讲解
- 基于Spark Graphx实现ID-Mapping
- Nginx keepalived一主一从高可用,手把手带你一步一步配置!
- Android实现自动轮询的RecycleView
- Android自定义钟表特效
- Android MediaPlayer 音频倍速播放 调整播放速度问题
- Android 简单实现倒计时功能
- Android Canvas自定义实现时钟效果
- 虚拟机kali安装vmtools
- Android动画学习笔记之补间动画
- [- Flutter 数据&状态篇 -] setState
- flutter 自定义websocket路由的实现
- Flutter开发之路由与导航的实现
- Android BSearchEdit 搜索结果选择框的实例代码
- 使用AccessibilityService实现微信自动切换账号功能