ESP8266实现在线升级OTA

article/2025/8/29 22:27:24

今天总结一下我实现ESP8266实现在线升级(OTA)的经验

关于理论介绍我这里不多讲,大家可以参考以下文章:
1.一个网友总结的经验(我这篇文章主要也是对该文章做进一步补充):https://www.cnblogs.com/demodashi/p/9437734.html
2.乐鑫官方OTA文档:https://www.espressif.com/sites/default/files/documentation/99c-esp8266_fota_upgrade_cn.pdf

一,在你的代码工程里增加以下代码:(别忘了添加头文件:#include “upgrade.h”)

/**函数功能:OAT在线升级固件* 输入参数1:server_ip: 服务器地址* 输入参数2:port:服务器端口* 输入参数3:path:文件路径*/
void ICACHE_FLASH_ATTR ota_start_Upgrade(const char *server_ip, uint16_t port,const char *path)
{const char* file;//获取系统的目前加载的是哪个bin文件uint8_t userBin = system_upgrade_userbin_check();os_printf("当前使用的userBin文件,0表示user1,1表示user2: %d\n\n",userBin);switch (userBin) {//如果检查当前的是处于user1的加载文件,那么拉取的就是user2.bincase UPGRADE_FW_BIN1:file = "user2.4096.new.4.bin";break;//如果检查当前的是处于user2的加载文件,那么拉取的就是user1.bincase UPGRADE_FW_BIN2:file = "user1.4096.new.4.bin";break;//如果检查都不是,可能此刻不是OTA的bin固件default:os_printf("Fail read system_upgrade_userbin_check! \n\n");os_printf("读取系统升级失败,请检查userbin \n\n");return;}struct upgrade_server_info* update =(struct upgrade_server_info *) os_zalloc(sizeof(struct upgrade_server_info));//upgrade_server_infoupdate->pespconn = (struct espconn *) os_zalloc(sizeof(struct espconn));//设置服务器地址os_memcpy(update->ip, server_ip, 4);//设置服务器端口update->port = port;//设置OTA回调函数update->check_cb = ota_finished_callback;//设置定时回调时间update->check_times = 10000;//从 4M *1024 =4096申请内存update->url = (uint8 *)os_zalloc(4096);//打印下請求地址os_printf("Http Server Address:%d.%d.%d.%d ,port: %d,filePath: %s,fileName: %s \n",IP2STR(update->ip), update->port, path, file);//拼接完整的 URL去请求服务器os_sprintf((char*) update->url, "GET /%s%s HTTP/1.1\r\n""Host: "IPSTR":%d\r\n""Connection: keep-alive\r\n""\r\n", path, file, IP2STR(update->ip), update->port);//IP地址请求//os_sprintf((char*) update->url, "GET /%s%s HTTP/1.1\r\n""Host: "OTA_DN"\r\n""Connection: keep-alive\r\n""\r\n", path, file, update->port);//域名请求,测试可用//os_sprintf((char*) update->url, "GET /%s%s HTTP/1.1\r\n""Host: "OTA_DN"\r\n""Connection: keep-alive\r\n""\r\n", path, file);//域名请求,测试可用,去掉端口号,默认就是80
//     GET /v1/user1.4096.new.4.bin HTTP/1.1
//     Host: 193.112.122.156:80
//     Connection: keep-aliveif (system_upgrade_start(update) == false){os_printf(" Could not start upgrade\n");//释放资源os_free(update->pespconn);os_free(update->url);os_free(update);}else{os_printf(" Upgrading...\n");}
}//函数功能:OAT回调函数
//成功就重启
//失败不重启
void ICACHE_FLASH_ATTR ota_finished_callback(void *arg)
{struct upgrade_server_info *update = arg;if (update->upgrade_flag == true){espconn_send(&PhoneConn,"OTA Success",11);	//告诉服务器OTA成功os_printf("OTA  Success ! rebooting!\n");os_printf("OTA  成功 ! 重启中!\n");system_upgrade_reboot();}else{espconn_send(&PhoneConn,"OTA failed",10);	//告诉服务器OTA失败os_printf("OTA failed!\n");os_printf("OTA 失败!\n");}os_free(update->pespconn);os_free(update->url);os_free(update);
}

编写代码调用:
ota_start_Upgrade(serverip, port,fileBinPath);//调用在线升级函数
就可以实现升级啦(前提是你设置的服务器路径中要有固件)

二,编译
在工程目录下的makefile中大约20多行有这样一段代码:

BOOT?=new
APP?=2
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=4

按以下表格要求,修改以上代码的参数,修改APP=1编译一次,修改APP=2编译再一次,这样才会有user1和user2
在这里插入图片描述
修改完后就清除,编译。
建议在user_init(void)函数里添加一个标识,以区分是user1还是user2,比如:
os_printf(“我是user1\r\n”);
os_printf(“我是user2\r\n”);

三,下载首个bin
编译两次后,user1和user2存放在这个upgrade文件夹
在这里插入图片描述
下图的第一和第二个bin文件必须要下载,第三个不清楚是否必要,但下载进去也能正常运行,第四个其实是个空白bin文件,最好写进去
在这里插入图片描述
四,服务器部署
这是一个复杂的事情,我试验OTA的时候是搭建一个TOMCAT本地服务器进行试验的,怎么搭建?还是参考这个网友的文章吧:https://www.cnblogs.com/demodashi/p/9437734.html

这两个文件放到服务器你设置的路径那里,给ESP8266发送一条升级指令,8266会自动拉取这两个文件其中一个这两个文件放到服务器你设置的路径那里

好了,粗略描述了一下整个过程,当然还有完整例程献上
https://download.csdn.net/download/qq_33215476/11980526


http://chatgpt.dhexx.cn/article/wOSrgCJh.shtml

相关文章

stm32在线升级方案

目录 下载固件流程: Bootloader程序设计流程 普通工程改为APP工程的步骤 背景:当嵌入式软件需要固件升级时,有时需要拆卸设备,较为麻烦,为方便升级,提供远程升级的功能,可通过网络或其他通讯…

串口在线升级步骤

串口在线升级步骤 一、查看工程文件的Config.h 二、确定本地地址和目标地址 三、打开在线升级工具 四、配置串口参数 串口配置可以波查询代码与PC通讯的UART设置的参数。 五、填写本机地址和目标地址 本机地址为0xf3 243 主板目标地址为0xf5 245 PMT板目标地址为0x13 19 …

mariadb数据库在线升级版本

mariadb----在线版本升级 我之前的数据库版本号是5.5 一:备份数据库和数据库配置 mysqldump -u root -p --all-databases > /home/mydb.sql mv /etc/my.cnf /etc/my.cnf.bak 二:添加mariadb yum库 vim /etc/yum.repos.d/MariaDB.repo [mariadb] na…

FPGA远程固件在线升级

FPGA远程固件在线升级 1.摘要 对最近做的FPGA远程更新/在线升级做一个总结。一般在代码开发阶段,我们使用JTAG烧写代码,但当产品投入到实际使用过程中,难以再用JTAG进行固件更新。所以需要开发远程/在线更新的功能,即使用产品自…

固件在线升级流程

从事硬件开发,为了方便维护,免不了对模块进行固件升级,所以对于固件升级,简单整理了一下完整的在线升级的实现思路,该思路适用于所有带通讯总线的模块。 需要注意的是,需要额外的上位机配合。 下位机在线…

php 在线升级

php 在线升级 功能 目前已修改为通用解决方案 点击下方链接下载 此为最新优化过的版本 之后的贴图 说明 仅用来做思路参考 我就不再修改了 下面是思路解析思路一思路二升级程序服务器检测版本至此整个升级程序已经结束 感谢大家参考有任何问题都可以直接联系我咨询 一定不吝赐教…

软件在线升级系统设计

需求描述 一直用Qt开发PC版本的程序,常用的方法都是打包发布。目前开发的程序比较复杂,涉及到上百个独立的进程以及4000多个相关文件,采用原来的打包发布就变得很麻烦,第一改动比较频繁,打包次数过多;第二…

Nginx在线升级

1、查看当前nginx版本,nginx -v(小写v) 2、下载最新版本nginx包,nginx-1.23.1.tar.gz 3、解压tar -zxvf nginx-1.23.1.tar.gz 4、进入解压目录cd nginx-1.23.1.tar.gz 5、查看nginx当前配置,nginx -V注意这里是大写…

在线升级:OTA升级的原理和实现方式

目录 1、OTA 在线升级 2、实现方式 3、操作方式 3.1、后台式升级 3.2、非后台式式更新 4、STM32 的在线升级 4.1、划分 Flash 区域 4.2、实操1 - Flash空间地址的划分 4.3、实操2 - 设置工程 4.4、实操3 - 接收固件更新包 4.5、实操4 - 拷贝程序至Flash 4.6、实操5 - 跳转至 Ap…

halcon 彩色图转灰度图

read_image (Image, jiao1.bmp) //读取图像 get_image_size (Image, Width, Height) //获取宽高 dev_close_window () //关闭图形窗口 rgb1_to_gray (Image, GrayImage) //彩色图转灰度图 dev_open_window (0, 0, Width, Height, black, WindowHandle) //打开图形窗口 d…

Python中使用PIL快速实现灰度图

效果 原图 效果图 实现 新建文件夹grayImage,在此文件夹下新建gray.py from PIL import Image imgImage.open(1111.jpg) imgimg.convert(L) img.save(灰度图.jpg) 其中1111.jpg是原图,将其放在同目录下。 运行即可。 源码以及资源下载 https://do…

计算机灰度分析,计算机中的256级灰度图像

【建议1】使用GltraEdit软件观察字符“((Z20享有声望的学校联盟)”的内部代码. 以下说法正确 A. 字符“(”的内部代码占用两个字节 B. 字符“ Lian”的代码值的二进制表示形式是11010001 10101010 C. 图片中有5个ASCⅡ字符,其中字符“ 2”的代码值的十六进制表示为32 D. 字符“…

C++-灰度图上色GrayToColor

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 最近有客户提出,想要将解包裹图像转化为有颜色的图像,具备更佳的视觉效果。解包裹图是一个floa…

灰度图与二值化

图像处理的灰度化和二值化 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的…

opencv学习5:cvtColor RGB图像转灰度图像原理

简介 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、…

Matplotlib显示灰度图

引言 matplotlib中的imshow()函数不能自动显示灰度图像,这一点应该是众所周知的,需要调用cmap“gray"以进行设置,但是cmap"gray"实际上并不是如opencv中的imshow函数一样将单通道图显示为灰度图,私以为是引入了灰度…

python显示灰度图像,Python读取图像并显示灰度图的实现

python读取图像 原图: import cv2 # 利用opencv读取图像 import numpy as np # 利用matplotlib显示图像 import matplotlib.pyplot as plt img cv2.imread("./lena.png") #读取图像 # 显示图像 plt.imshow(img) plt.axis(off) plt.show() 效果: 问&#…

OpenCV灰度图

什么是灰度图&#xff1a; 百度百科 什么是灰度图 #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std;int main(int argc, char** argv) {Mat src Mat(4,4,CV_8UC3,Scalar(28,128,228));cout << src << en…

RGB图像转化为灰度图原理

RGB图像转化为灰度图原理 1 原理 利用MATLAB对RGB图像进行读取&#xff1a; imgimread(蒙娜丽莎.jpg);可以知道存储RGB图像数据为 256 256 3 u i n t 8 256\times256 \times3\quad uint8 2562563uint8&#xff0c;其中 256 256 256\times256 256256表示长和宽的像素个数&…

彩色图像转换灰度图像

数字图像 现在我们所接触到的图像绝大多数都是数字图像&#xff0c;图像数字化后&#xff0c;每个像素点就可以看作是一个小方格&#xff0c;每个小方格里面存储的就是图像的像素信息。如果把一副数字图像抽象出来&#xff0c;就是一个二维矩阵&#xff08;灰度图&#xff09;或…