stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面升级

2023-05-16

stm32 esp8266 ota系列文章:
stm32 esp8266 ota-快速搭建web服务器之docker安装openresty
stm32 esp8266 ota升级-tcp模拟http
stm32 esp8266 ota升级-hex合并-烧录-bin生成
stm32 esp8266 ota升级-qt bin文件处理工具
stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面方式
stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面升级

本文通过自建mqtt和文件服务器,动态获取升级配置,然后进行AB面升级。有部分代码截图示例。
1.mqtt升级消息包含version,file_name ,host,port等字段,程序可根据这些字段,动态配置固件名,升级服务器和端口号。
2.升级所用的bin文件,是每隔512字节进行crc16校验,并将校验值插入其后,进而保证了数据传输的稳定性。
通过挂表2天2夜循环升级测试,该实现方案,稳定可靠。

环境介绍

硬件

  1. stm32F103系列flash要去128K以上;
  2. esp8266-01s

软件

qt bin文件处理工具:

用于生成crc校验后的bin文件,作为升级使用。

思路主要是对bin文件,每隔512字节进行crc16校验,并将两个字节的校验值,插入其后。

具体实现请参阅博文https://blog.csdn.net/a554521655/article/details/128455446

文件服务:

升级bin文件存储,http GET请求方式获取。

具体文件服务器搭建请参阅博文:https://blog.csdn.net/a554521655/article/details/128422637

mqtt服务器

用于mqtt消息管理和转发。

具体搭建(仅参考emqx部分即可),请参阅博文:https://blog.csdn.net/Apple_Coco/article/details/121500546

app 程序

mqtt消息订阅与发布,进行iot控制处理,如蜂鸣器、led、继电器等开发,温湿度传感器上报等,用户可根据自己产品在此app基础上进行改进。

升级处理:主要完成ota升级

BootLoader

引导启动app程序。主要判断从app A,app B和app facotry 哪个区启动;

OTA常见方案

请参考https://blog.csdn.net/zdavid_2018/article/details/109490846博文,感谢博主分享。

stm32程序运行

请参考https://www.elecfans.com/d/1802838.html,博文,感谢博主分享。

对于stm32初学开发者,需要会通过跳冒来配置自己需要的启动模式。

image-20221226112539234

说明:一般我们使用JTAG或者SWD模式下载程序时,就是下载程序到内置的Flash里面,重启后也直接从这启动程序。

flash分区

采用AB面的升级方式,我们将flash分为5个区域,从低地址到高地址依次是 bootloader,env parameters,app A,app B,factory。

  1. bootloader:程序引导区域,根据环境参数,决定启动哪个区域的用户程序;
  2. env parameters:用于存储环境参数,主要有当前启动模式,启动是否正常,失败次数等;
  3. app A:用于程序A,也可理解为A面;
  4. app B:用户程序B,也可理解为B面;
  5. factory:产品出厂时的程序,可用于恢复出厂配置;
#define PageSize		FLASH_PAGE_SIZE			//page大小
#define Stm32_BaseAddr			FLASH_BASE	//stm32运行首地址

#define BootLoader_Size 		0x2400U			//BootLoader大小 9K
#define Env_Size                0x400U      //环境变量大小  1K
#define Application_Size		0x9800U			//app大小 38K

#define BootLoader_addr			   Stm32_BaseAddr	//bootLoader的首地址
#define Env_addr			    (Stm32_BaseAddr+BootLoader_Size)	//env addr
#define Application_A_Addr		(Stm32_BaseAddr+BootLoader_Size+Env_Size)		//appA首地址
#define Application_B_Addr		(Stm32_BaseAddr+BootLoader_Size+Env_Size+Application_Size)	//appB首地址
#define Factory_App_Addr		(Stm32_BaseAddr+BootLoader_Size+Env_Size+Application_Size+Application_Size)		//factory首地址

image-20221230104931930

AB升级整体逻辑

ota升级流程2

上传固件到文件服务器

首先,对bin文件Iot4g.bin进行处理(每隔512字节进行crc16校验,并将两个字节的校验值,插入其后)。这里使用作者自己开发qt bin文件处理工具进行处理,软件界面如下。处理完成,将生成Iot4g-crc.bin。

image-20221226181644819

image-20221226182025665
然后,将Iot4g-crc.bin 文件上传到服务器。
image-20221226175738350

app程序中主动发送mqtt消息触发升级

stm32 支持mqtt消息订阅和发布功能,这里订阅和发布话题

pubtopicBuzzer:qytech/mqtt/981071898424177441124234033/data/buzzer
subtopicBuzzer:qytech/mqtt/981071898424177441124234033/cmd/buzzer
pubtopicUpgrade:qytech/mqtt/981071898424177441124234033/data/upgrade
subtopicUpgrade:qytech/mqtt/981071898424177441124234033/cmd/upgrade

mqtt升级消息格式定义如下:

{
"type": "upgrade_firmware",    //升级标识
"file_name": "Iot4g-crc.bin",  //升级文件名
"version": "smartV1.1",        //升级版本
"file_size": 708482,           //升级文件大小,这里未使用,文件大小通过get请求获取
"url": "/",                    //升级文件服务器中路径
"host": "alyou.langtaotech.cn",//升级服务器
"port": "51802",               //升级端口
"md5sum": ""                   //升级文件md5校验,未使用,这里对bin文件每隔512字节crc16校验
}

然后发送升级消息,进行升级
image-20221226175824009

订阅话题qytech/mqtt/981071898424177441124234033/data/upgrade,会收到start upgrade提示。相应的升级成功和失败也会收到提示信息。

image-20221226183244589

app程序中解析mqtt升级指令

解析收到的mqtt消息,提取出version,file_name ,host,port 等所需字段
image-20221226183515031

通过获取的file_name ,host ,port 等信息,连接服务器,获取文件大小;
image-20221226183714619

通过文件大小,计算分包下载所需包数,然后发送带Range字段的get请求进行bin文件分包下载

image-20221226183944589

对接收的每包数据(这里是512+2字节crc16)的前512字节进行crc16计算,结果与包中后2字节对比,一致则写入flash中;

image-20221226184242396

当所有整包数据接收完成后,处理最后不足整包的数据。思路与整包处理流程一致,这里不做说明。

BootLoader处理

读取环境变量env_info.appIndex,判断从哪个分区启动
image-20221230105147860

升级串口提示信息

升级过程中

image-20221226175637932

升级完成

image-20221227131834087

升级成功后,已经从app B面启动

image-20221227131246248

总结

自建mqtt和文件服务器,让大家自己掌握整个项目流程环节,不局限于某个平台。

bin文件crc校验处理,保证了数据传输的稳定性。
mqtt升级消息(version,file_name ,host,port等字段),程序可动态配置固件名,升级服务器和端口号,让升级更加灵活。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面升级 的相关文章

  • 通过QGC应用TFmini Plus

    TFmini QGC中所需设置参数 xff1a EKF2 RNG AID enable EKF2 RNG MODE Range sensor SENS TFMINI CFG TELEM SERIAL 4 最后一个参数如何确定是哪一通道 xf
  • C语言格式化字符串漏洞实验

    格式化字符串漏洞实验 在线实验环境 xff1a 格式化字符串漏洞实验 文章转载自 xff1a https github com shiyanlou seedlab blob master formatstring md 一 实验描述 格式化
  • C语言Socket编程(TCP与UDP)

    C语言Socket编程 xff08 TCP与UDP xff09 UDP xff1a span class token comment udp server c span span class token macro property spa
  • ubuntu 换源深层次解析

    换源也是一个容易出错的问题 xff0c 本文以树莓派为例展开 xff0c x86也是一样的操作 那么假设成立的话 xff0c 就要记住我们是在树莓派 xff08 arm xff09 上安装的ubuntu xff0c 不是X86 xff0c

随机推荐

  • 1运动规划概述

    Motion planning autonomous robot 总结一下什么是自主机器人 xff1a 首先我们需要状态估计 xff08 定位 xff09 xff1b 基于此 xff0c 利用传感器融合人建立一个周围环境的三维地图 xff1
  • 5轨迹生成

    文章目录 Introduction全局与局部方法全局与局部对比 轨迹生成T xff08 what xff09 为什么需要平滑轨迹呢Y why W how 微分平坦 xff08 Differential Flatness xff09 TQua
  • java--通过JNI调用动态链接库(dll、so、dylib)

    公司项目需要用到第三方qt插件 xff0c 由于业务是偏底层的 xff0c 基本上用不到jar包 xff0c 因此只能通过jni的方式调用 没学过c 43 43 xff0c 十多天的摸爬滚打一路过来不容易啊 xff01 今天总算跑通了 网上
  • 在头文件实现函数的重定义问题

    例如一个头文件headfile h这样写 pragma once bool Func return true 在这个头文件被多个地方包含的时候就会出问题 xff0c 链接时报错 FuncB报重定义 fatal error LNK1169 找
  • 数字电路基础知识系列(六)之LC滤波器的基础知识

    针对设计过程的问题 xff0c 如有疑问 xff0c 欢迎留言讨论 xff01 点我返回目录 LC滤波器 xff0c 是指将电感 L 与电容器 进行组合设计构成的滤波电路 xff0c 可去除或通过特定频率的无源器件 电容器具有隔直流通交流
  • I-002 智能家居系列--ESP8266环境搭建

    智能家居系列 1 NodeMCU简介2 硬件介绍3 开发工具的选择3 1 软件介绍3 2 环境搭建 4 测试代码5 后续会更新这边文章 1 NodeMCU简介 NodeMCU简介 NodeMCU 是一个开源的 物联网 平台 它使用 Lua
  • I-000 智能家居系列--需求梳理

    智能家居系列 1 智能家居2 系统框架3 组成部分4 开发思路5 当前的进展 1 智能家居 智能家居的目的旨在提高人们的生活水平 xff0c 确保人们的生活更加舒适 2 系统框架 下图只是初版 xff0c 在具体的开发过程中 xff0c 会
  • Cartographer(二)使用思岚rplidar雷达进行cartographer建图

    一 修改launch文件和lua配置文件 xff08 1 xff09 修改revo lds lua 到目录下 xff0c 打开文件 home meng xx catographer ws src cartographer ros carto
  • 数字电路硬件设计系列(三)之缓启电路设计

    针对设计过程中的问题 xff0c 如有疑问 xff0c 欢迎留言评论 xff01 点我返回目录 1 简介 在一些大电压 大电流的产品中 xff0c 上电的瞬间通常会有较大的电流冲击 xff0c 下图是一款产品上电过程中波形 最大的电流达到1
  • 数字电路硬件设计系列(十)之RS485电路设计

    针对设计过程中的问题 xff0c 如有疑问 xff0c 欢迎留言评论 xff01 点我返回目录 1 简介 RS485通信属于串口通信中的半双工通信 xff0c RS485具有支持多节点 xff08 32个节点 xff09 传输距离远 xff
  • 数字电路硬件设计系列(五)之AT89C51/C52最小系统设计

    针对设计过程中的问题 xff0c 如有疑问 xff0c 欢迎留言评论 xff01 点我返回目录 1 简介 AT89C51 C52是指两个系列的产品 xff0c 具体包含AT89C51 AT89C52 xff0c 但是最小系统的组成基本上相差
  • 1.18 接地设计问题(非常实用)

    目录 1 简介 2 接地的分类 3 接地的目的 3 1 对地阻抗低 3 2 地平面稳定 3 3 对地均衡 4 共地耦合干扰 5 常用的基地方式 6 安全地 防雷击浪涌接地的接法 1 简介 在电路设计的过程中 xff0c 接地是一个老生常谈的
  • 1.0 硬件设计基础(面试题)

    1 滤波磁珠和滤波电感的区别 磁珠由导线穿过铁氧体组成 xff0c 直流电阻很小 xff0c 在低频时阻抗也很小 xff0c 对直流信号几乎没有影响 在高频 xff08 几十兆赫兹以上 xff09 时磁珠阻抗比较大 xff0c 高频电磁场在
  • 1.19 旁路电容与去耦电容

    1 简介 旁路电容和旁路电容是电路设计过程中十分常见 xff0c 但是很多应将工程师都没有真正区分这两者的功能 xff0c 我们先来看看这两个单词在英文中的意思 xff1a 电容英文中文解释旁路电容Bypass抄近道去耦电容couple是一
  • vins运行1

    vins fusion 运行笔记 安装code utils 1 fatal error elfutils libdw h 没有那个文件或目录 没有安装 sudo apt get install libdw dev 2 fatal error
  • 四旋翼无人机汇报

    我主要负责的是四旋翼无人机的组装和飞控参数的调试 遇到的问题 当初焊接时由于时间紧张用的是比较细的焊条 xff0c 虽然焊接成功 xff0c 但是导致了后续插拔导线时容易接触不良 xff0c 后来在焊点处重新焊接 由于未在地面站软件中修改无
  • 载波相位差分定位

    x1f30e 我接触差分定位是通过暑期在南京北斗一段时间的实习 x1f30e 我把 Lambda算法的zip和rar上传到了这里 x1f30e https wwi lanzoui com b01bp70yj x1f30e 再推荐一个gith
  • nRF SPI 与 TWI 操作相关 (BMI088 与 MLX90614 举例)

    SPI0 与 TWI0 的 ID相同 xff0c SPI0 与 TWI0 的 ID相同 编译时有报错 若要避免 xff0c 有两个方法 1 使用不同ID外设 2 使用模拟SPI或模拟IIC nRF SPI 初始化 sdk config h
  • ros(13):ros找不到包报错及解决办法--Config.cmake

    目录 一 基础包 1 1 rospy包 1 2 tf包 1 3 grid map包 1 4 serial 二 专有包 2 1 dynamic reconfigure包 2 2 rosparam handler包 2 3 qt build包
  • stm32 esp8266 ota升级-自建mqtt和文件服务器动态AB面升级

    stm32 esp8266 ota系列文章 xff1a stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 o