stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

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和文件服务器全量升级

本文通过自建mqtt和文件服务器,动态获取升级配置,然后进行全量升级。有部分代码截图示例。
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程序。有升级,则进行程序code拷贝,无升级,则正常启动;

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分区

采用全量升级方式,我们将flash分为4个区域,从低地址到高地址依次是 bootloader,env parameters,app A,app B

  1. bootloader:程序引导区域,根据环境参数,决定启动哪个区域的用户程序;
  2. env parameters:用于存储环境参数,主要有当前启动模式,启动是否正常,失败次数等;
  3. app A:用于程序启动运行;
  4. app B:用于bin文件下载接收;
#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首地址

ota flash地址分配-全量升级.drawio

全量升级整体逻辑

ota升级流程-全量升级.drawio

上传固件到文件服务器

首先,对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==app_B,则需要升级,否则正常启动;

image-20221230103159343

升级串口提示信息

升级过程中

image-20221226175637932

升级完成

image-20221227131834087

升级成功后,reboot,BootLoader搬运程序到app A,然后启动

image-20221230100633301

总结

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

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

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

stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级 的相关文章

  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 在一条消息 MQTT 中发布多个主题

    我有一个设备可以从不同的传感器收集大量数据 我想通过一条消息将它们发送给我的经纪人 在客户端 我只想在给定时间查看其中一些数据 我不想看到全部数据 我可以在一条消息中发布多个主题 然后在客户端只能看到其中的一些主题吗 我知道我可以使用通配符
  • 如何通过互联网使用 MQTT?

    目前 我正在成功运行一个 mosquitto 代理 订阅主题并与本地网络中的客户端发布消息 如何与位于不同 IP 地址的另一个本地网络进行通信 我应该设置 2 个 mosquitto 经纪人 每个本地网络一个吗 其他本地网络中的 PC 需要
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 最大 MQTT 连接数

    我需要创建一个服务器场 可以处理 5 100 万个连接 5 00000 个主题 每个客户端一个 每秒处理 300k 消息 我尝试了解各种消息代理的功能 因此我目前使用两个 RHEL EC2 实例 r3 4xlarge 来获取大量可用资源 所
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 我可以向通过 MQTT WebSocket 连接的一组 Azure IoT 中心设备发送消息吗?

    Goal 将消息发送到一组通过 MQTT WebSocket 连接的 Azure IoT 中心设备 初步想法 让一组 IoT 中心设备 组 X 订阅主题 X 的消息 Problem On the 使用 MQTT 协议与 IoT 中心通信 h
  • 如何M2MQTT自动重连

    我正在尝试使用此协议 并且已经有 2 个客户端 一个用于发布 另一个用于订阅 和一个正在工作的经纪人 我的问题是我想在订阅客户端中实现重新连接功能 因为 wifi 信号不稳定并且不想每次都手动重新启动客户端 我该如何实现这一点 您可以使用
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 如何使用 QtMqtt 和 SSL 执行安全 MQTT?

    我正在尝试使用 QtMQtt 示例项目 simpleclient 但我想执行安全的 MQTT 我该如何处理这个问题 我读过这篇博客 https www qt io blog 2017 08 14 introducing qtmqtt pro
  • 如何从 MQTT 生产并在 ActiveMQ 中作为 MQTT 和 JMS 消费

    我有一个设置 其中消息作为 MQTT 生成到 ActiveMQ 我有两个消费者 一个作为 JMS 另一个作为 MQTT 当我将消息作为 JMS 消息发布到主题 foo 时 我在 JMS 和 MQTT 消费者处都收到消息 但是当我在同一主题上
  • AWS-IOT Mqtt Broker 是否会记住跨客户端连接订阅的客户端和未传递的消息?

    AWS 文档在此 http docs aws amazon com iot latest developerguide iot message broker html http docs aws amazon com iot latest
  • 使用 SPIFFS 加载文件时出现问题 (ERR_CONTENT_LENGTH_MISMATCH)

    好吧 这两天我一直在研究这个问题 但我仍然觉得我一无所获 我最近开始使用SPIFFS 文件系统 for Arduino开发于呼扎 ESP8266像FSBrowser ino例如 虽然它在分离代码方面非常出色 但随着我的代码不断增长 它在稳定
  • 如何在 Amazon AWS Lambda 函数中发布到 MQTT 主题?

    我想要一个简单的命令 就像我在 bash 中使用的那样 将某些内容发布到 AWS Lambda 函数内的 MQTT 主题 沿着以下思路 mosquitto pub h my server com t 灯 设置 m 开 背景 我想用 Alex
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • 以编程方式设置 mosquitto 中的访问控制限制

    我正在开发一个将使用 mqtt 的应用程序 我将使用 python 库 我一直倾向于使用 mosquitto 但找不到以编程方式为其设置访问控制限制的方法 我正在编写的应用程序需要能够区分用户 并且只允许他们订阅某些主题 当前的解决方案看起
  • 请求/响应的 MQTT 主题名称

    我正在设计一个包含许多设备的系统 使用 MQTT 连接到中央代理 有些主设备可以向某些从设备发送请求 来自一台主机的请求通常会发送给一台从机 请求的主题可以是 mysystem slaveId req 因此从站可以订阅该主题 并且主站可以发
  • 将消息从 AWS Lambda 发布到 AWS IoT

    我正在尝试使用 Nodejs 将消息从 AWS Lamba 发布到 AWS IoT 我已压缩该项目并上传到 AWS IoT 下面是代码片段 var awsIot require aws iot device sdk var device a

随机推荐

  • 判断系统是大端还是小端

    文章目录 大端与小端判断大端 小端的三种方式直接观察变量的内存值强制转换 xff1a 将 amp int转换为char 使用联合体union进行判断 大端与小端 大端模式 xff1a 指数据的高字节保存在内存的低地址中 xff0c 低字节保
  • void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解

    GPIO TypeDef GPIOA BASE 表示将GPIOA BASE强制转换为指针类型的结构体 xff0c define GPIOA GPIO TypeDef GPIOA BASE 表示用 GPIO TypeDef GPIOA BAS
  • OTT-TV网络电视EPG录制和EPG抓取解决方案

    EPG是Electrical Program Guide xff0c 也就是电子节目单 这个名词的出现和OTT TV或者说IPTV紧密相关 EPG功能是频道化电视以 频道 时间 方式提供一段时间内的所有电视节目信息 xff0c 实现业务浏览
  • ROS noetic 安装编译Cartographer踩坑记录

    ROS noetic 安装编译Cartographer踩坑记录 安装编译工具 span class token function sudo span span class token function apt get span update
  • 用PWM控制舵机(以是stm32为例)

    因为做校创需要用到舵机 xff0c 以前知道大致的理论 xff0c 因此看了一些帖子 xff0c 总结一下被以后查看 什么是PWM波 PWM就是脉冲宽度调制 xff0c 也就是占空比可变的脉冲波形 pwm的占空比 xff0c 就是指高电平保
  • 算法时间复杂度的计算

    一 算法时间复杂度定义 在进行算法分析时候 语句总的执行次数T n 是关于问题规模n的函数 进而分型T n 随着n的变化情况并确定T n 的数量级 算法的时间复杂度 也就是算法的时间度量记作 T n 61 O f n 它表示随着问题规模n的
  • 三角形最小路径和(JS)--自底向上解决(动态规划)

    题目描述 xff1a 给定一个三角形 xff0c 找出自顶向下的最小路径和 每一步只能移动到下一行中相邻的结点上 例如 xff0c 给定三角形 xff1a 2 3 4 6 5 7 4 1 8 3 自顶向下的最小路径和为 11 xff08 即
  • leetcode42--接雨水(JS)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图 xff0c 计算按此排列的柱子 xff0c 下雨之后能接多少雨水 上面是由数组 0 1 0 2 1 0 1 3 2 1 2 1 表示的高度图 xff0c 在这种情况下 xff0c 可以
  • 自定义组件继承的组件基类React.Component是什么

    我们平时写React组件时都要继承一个父类 xff0c 那就是React Component 也会用到props state和setState xff0c 我们只是会使用它 xff0c 然而不知道它们怎么来的 xff0c 既要知其然也要知其
  • Java 在二维坐标系绘制矩形、圆形、多边形

    最近遇到一个需求 xff0c 大概要求是 xff1a 根据前端传递的参数 xff0c 在Java侧绘制虚拟的二维封闭图形 xff0c 判断各个图形间是否有交集 在java awt包下有个名为Shape的接口 xff0c 可以实现在二维坐标系
  • Uncaught (in promise) TypeError: Cannot read property 'data' of undefined

    最近在学习Redux的时 xff0c 自己写了个Demo xff0c 用fetch异步调用接口时返回这个脑壳疼的问题 问题 xff1a 问题排查 xff1a 一步一步在控制台打印 xff0c 并检测类型 xff0c 发现控制台打印undef
  • Ajax、fetch、axios的区别与优缺点

    背景 前端的技术发展速度非常的快 xff0c 异步请求也是其重要的体现之一 xff0c 从最早的原生XHR xff0c 再到JqueryAjax的统治时代 xff0c 再到近来 xff0c fetch axios等技术也开始出现并大量投入使
  • 什么是 Promise.allSettled() !新手老手都要会?

    什么是 Promise allSettled xff01 新手老手都要会 xff1f Promise allSettled 方法返回一个在所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise x
  • 一份稳进Shopee的简历长啥样?

    小伙伴们好 xff0c 我是Eason 简历是求职流程的第一步 xff0c 是很关键的一环 Eason在做Shopee招聘工作时 xff0c 收到了投递的1000 43 的简历 xff0c 简历也修改过50多次 xff0c 最近也帮10多个
  • Vue项目中较优雅地封装Echarts

    场景 1 Echarts 1 使用时 xff0c 都需要写一堆的 option xff0c 如果每个图表都要写一个 xff0c 一个文件里面的代码量是很大的 2 不方便复用 需求 1 方便复用 2 展示类的图表 xff0c 数据与业务 样式
  • React系列--JSX到底是什么东西

    JSX 简介 JSX的全称是 Javascript and XML xff0c React发明了JSX xff0c 它是一种可以在JS中编写XML的语言 JSX更像一种模板 xff0c 类似于Vue中的 template 为什么使用JSX
  • https请求+basic认证

    目录 1 工具类 SSLClient 2 工具类HttpsClientUtil 3 使用 1 工具类 SSLClient 此类可绕过https证书 import org apache http conn ClientConnectionMa
  • 自旋锁的原理及使用

    什么是自旋锁 是指当一个线程在获取锁的时候 xff0c 如果锁已经被其它线程获取 xff0c 那么该线程将循环等待 xff0c 然后不断的判断锁是否能够被成功获取 xff0c 直到获取到锁才会退出循环 获取锁的线程一直处于活跃状态 xff0
  • 实验11 多线程

    1 设有一个银行账户 xff0c 里面有2000元钱 该账户归tom和jack两个人共同所有 每个人每 次可以取100元钱 编写一个类BankAccount表示银行账户 xff0c void withdraw int count 方法表 示
  • stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

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