OTA远程升级固件
作者:追风剑情 发布于:2026-6-23 14:40 分类:物联网
一、新建分区配置文件
在项目根目录下创建 partitions.csv,内容如下:
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
otadata, data, ota, 0xf000, 0x2000,
phy_init, data, phy, 0x11000, 0x1000,
ota_0, app, ota_0, 0x20000, 0x180000,
ota_1, app, ota_1, 0x1A0000,0x180000,
storage, data, fat, 0x320000,0x200000,
ota_0 与 ota_1 分区大小需要根据ESP32芯片的实际容量来分配。可用命令 python -m esptool --port COM3 flash_id 来查看ESP32芯片闪存容量。
二、修改 sdkconfig
| 字段修饰符 | ||
| 字段名 | 值 | 说明 |
| CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP | =y | 允许使用 HTTP 协议进行 OTA(而非强制 HTTPS) |
| CONFIG_PARTITION_TABLE_CUSTOM | =y | 启用自定义分区表 |
| CONFIG_PARTITION_TABLE_CUSTOM_FILENAME | ="partitions.csv" | 指定自定义分区表文件名 |
| CONFIG_PARTITION_TABLE_FILENAME | ="partitions.csv" | 覆盖默认分区表文件名 |
| CONFIG_ESPTOOLPY_FLASHSIZE | ="8MB" | 适配实际 8MB 闪存容量,为双 OTA 分区提供空间。注意:这里需要根据手上的ESP32开发板提供的实际闪存容量来配置。作者手上的 ESP32-WROOM-32 是 8MB 闪存。 |
三、OTA固件服务器
编译后的固件在: {项目文件夹}/build/项目文件名.bin。
可以在build目录下启动个http服务器供ESP32下载.bin文件。python -m http.server 8070
四、ESP32端OTA升级模块
ota_control.h
#ifndef OTA_CONTROL_H #define OTA_CONTROL_H /** * @brief 初始化 OTA 模块(创建互斥锁) * 应在系统启动时调用一次。 */ void ota_control_init(void); /** * @brief 执行 OTA 升级的主任务 * @param pvParameter 未使用 */ void ota_task(void *pvParameter); #endif
ota_control.c
#include "ota_control.h"
#include "esp_log.h"
#include "esp_https_ota.h"
#include "esp_system.h"
#include "esp_crt_bundle.h"
#include <string.h>
#include "mqtt_control.h"
#include "freertos/semphr.h"
static const char *TAG = "OTA";
static bool ota_in_progress = false;
static SemaphoreHandle_t ota_mutex = NULL;
// 固件下载地址(根据实际情况修改)
#define OTA_URL "http://192.168.31.227:8070/LedFlash.bin"
// 用于嵌入证书(如果使用自定义证书)
extern const uint8_t server_cert_pem_start[] asm("_binary_ca_cert_pem_start");
extern const uint8_t server_cert_pem_end[] asm("_binary_ca_cert_pem_end");
// 初始化 OTA 模块(创建互斥锁)
void ota_control_init(void) {
if (ota_mutex == NULL) {
ota_mutex = xSemaphoreCreateMutex();
if (ota_mutex != NULL) {
ESP_LOGI(TAG, "OTA mutex created successfully");
} else {
ESP_LOGE(TAG, "Failed to create OTA mutex");
}
} else {
ESP_LOGW(TAG, "OTA mutex already exists");
}
}
// OTA 升级任务
void ota_task(void *pvParameter) {
// 检查互斥锁是否已初始化
if (ota_mutex == NULL) {
ESP_LOGE(TAG, "OTA mutex not initialized, call ota_control_init() first");
vTaskDelete(NULL);
return;
}
// 获取互斥锁,检查并设置标志
if (xSemaphoreTake(ota_mutex, pdMS_TO_TICKS(100)) == pdTRUE) {
if (ota_in_progress) {
xSemaphoreGive(ota_mutex);
ESP_LOGW(TAG, "OTA already in progress, ignoring duplicate request.");
vTaskDelete(NULL);
return;
}
ota_in_progress = true;
xSemaphoreGive(ota_mutex);
} else {
ESP_LOGE(TAG, "Failed to take OTA mutex");
vTaskDelete(NULL);
return;
}
ESP_LOGI(TAG, "Starting OTA upgrade from: %s", OTA_URL);
mqtt_publish_status("{\"action\":\"OTA_START\"}");
// 配置 HTTP 客户端
esp_http_client_config_t http_config = {
.url = OTA_URL,
.crt_bundle_attach = esp_crt_bundle_attach, // 使用内置证书包
.timeout_ms = 10000, // 10秒超时
.keep_alive_enable = true,
};
esp_https_ota_config_t ota_config = {
.http_config = &http_config,
};
esp_err_t ret = esp_https_ota(&ota_config);
if (ret == ESP_OK) {
ESP_LOGI(TAG, "OTA Succeed! Rebooting...");
mqtt_publish_status("{\"action\":\"OTA_SUCCESS\"}");
// 成功时设备重启,无需重置标志
esp_restart();
} else {
ESP_LOGE(TAG, "OTA Failed: %s", esp_err_to_name(ret));
mqtt_publish_status("{\"action\":\"OTA_FAILED\"}");
// 失败时重置标志,允许重试
if (xSemaphoreTake(ota_mutex, pdMS_TO_TICKS(100)) == pdTRUE) {
ota_in_progress = false;
xSemaphoreGive(ota_mutex);
}
}
// 任务结束(仅当失败时执行到此处)
vTaskDelete(NULL);
} 标签: IoT
日历
最新文章
随机文章
热门文章
分类
存档
- 2026年6月(12)
- 2026年5月(29)
- 2026年4月(7)
- 2026年3月(15)
- 2026年2月(3)
- 2026年1月(6)
- 2025年12月(1)
- 2025年11月(1)
- 2025年9月(3)
- 2025年7月(4)
- 2025年6月(5)
- 2025年5月(1)
- 2025年4月(5)
- 2025年3月(4)
- 2025年2月(3)
- 2025年1月(1)
- 2024年12月(5)
- 2024年11月(5)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
- Open CASCADE
- CascadeStudio
- OpenClaw中文社区
- three.js manual
- SVG官方文档
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号






