2022.05 ESP32 空中升级 OTA

本文详细介绍了如何在ESP32-C3设备上进行OTA(Over-The-Air)升级,包括创建升级包、配置升级参数、实现升级过程及显示下载进度。作者在过程中遇到ESP32-C3重启问题,并分享了简单的OTA示例代码分析,展示了如何自定义函数以获取下载进度信息。


前言

我使用的IDF版本是V4.4,
OTA需要有一个服务器才行,
这个例程使用的是本地服务器,实现OTA升级


一、先准备一个升级包

这里我使用的是 hello_world 例程作为升级后的程序
什么也不用修改,直接编译工程,然后进入 build

cd .\build\

在这里插入图片描述
再执行

python -m http.server 8070

在这里插入图片描述
在你的电脑浏览器上输入IP地址+端口(8070)就可以进入网页
在这里插入图片描述
进入网页后,这里主要是复制hello_world.bin的地址
在这里插入图片描述
我这里复制到的地址如下所示,这就是新固件的下载地址待会需要用到

http://192.168.0.140:8070/hello_world.bin

1.到此升级包准备工作已经完成
2.那个http服务端需要一直打开,不能关闭
3.你的电脑必须是在2.4G频段的wifi,否则ESP32无法和电脑在同一个局域网内
4.点击hello_world.bin,看看能不能下载,如果不能下载,可能是电脑的防火墙拦截了,可以关闭防火墙试试。否则你的ESP32也是不能下载到固件的
在这里插入图片描述

二、OTA升级

使用的是 simple_ota_example 例程
需要修改5个地方

  1. 修改为4M的flash
  2. 修改为2_OTA分区
  3. WiFi账号
  4. WIFI密码
  5. 固件的下载地址

1.打开 simple_ota_example 例程进入 menuconfig 设置
在这里插入图片描述
在这里插入图片描述
修改完之后,建议打开sdkconfig看看是否对应,我的WiFi带有中文,会出现乱码
在这里插入图片描述
编译烧录即可

三、效果


在这里插入图片描述

四、simple_ota_example 源码分析

在源码中esp_https_ota(&config) 已经将所有OTA相关的东西都处理了,如果你想获取更多OTA过程的信息,需要修改esp_https_ota()函数

    esp_err_t ret = esp_https_ota(&config); // HTTPS OTA固件升级

    if (ret == ESP_OK)
    {
        ESP_LOGW(TAG, "固件升级成功");
        vTaskDelay(5 * 1000 / portTICK_PERIOD_MS);
        esp_restart();
    }
    else
    {
        ESP_LOGE(TAG, "固件升级失败");
        vTaskDelete(NULL);
    }

例如:在OTA的过程中,我读取固件下载的进度,固件信息。。。

1、显示下载进度

复制esp_https_ota函数,重新命名函数

显示进度主要使用到两个函数即可

esp_https_ota_get_image_size// 获取固件大小

esp_https_ota_get_image_len_read// 已经下载

esp_err_t user_esp_https_ota(const esp_http_client_config_t *config)
{
    int image_size, download_size;
    if (!config)
    {
        ESP_LOGE(TAG, "esp_http_client config not found");
        return ESP_ERR_INVALID_ARG;
    }

    esp_https_ota_config_t ota_config = {
        .http_config = config,
    };

    esp_https_ota_handle_t https_ota_handle = NULL;
    esp_err_t err = esp_https_ota_begin(&ota_config, &https_ota_handle);
    if (https_ota_handle == NULL)
    {
        return ESP_FAIL;
    }
    image_size = esp_https_ota_get_image_size(https_ota_handle); // 获取固件大小
    while (1)
    {

        err = esp_https_ota_perform(https_ota_handle);
        if (err != ESP_ERR_HTTPS_OTA_IN_PROGRESS)
        {
            break;
        }
        download_size = esp_https_ota_get_image_len_read(https_ota_handle); // 已经下载           
        ESP_LOGI(TAG, "Image bytes read: %d/%d--- %0.2f%%",
                 download_size,
                 image_size,
                 (float)download_size * 100 / image_size);// 下载进度(百分比)
    }

    if (err != ESP_OK)
    {
        esp_https_ota_abort(https_ota_handle);
        return err;
    }

    esp_err_t ota_finish_err = esp_https_ota_finish(https_ota_handle);
    if (ota_finish_err != ESP_OK)
    {
        return ota_finish_err;
    }
    return ESP_OK;
}

注意:esp_https_ota这个函数不要直接拷贝我上面的代码,IDF4.4 / 5.3不同的版本,esp_https_ota函数有些许差异,直接拷贝编译会报错

拓展

我提供了一个Python脚本
将.bin文件和start_server.py放在同一个目录下,运行start_server.py脚本
就可以直接创建本地服务器了
在这里插入图片描述

start_server.py

import os
import subprocess

def start_http_server():
    try:
        # 获取脚本所在的目录
        script_directory = os.path.dirname(os.path.abspath(__file__))
        print(f"Starting HTTP server on port 8070 in directory: {script_directory}")
        subprocess.run(["python", "-m", "http.server", "8070"], cwd=script_directory)
    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    start_http_server()
<think>嗯,用户想了解ESP32OTA更新实现方法或指南。首先,我需要回忆ESP32OTA相关知识。记得ESP-IDF框架支持OTA功能,可以通过HTTP、HTTPS或者蓝牙等方式进行无线更新。用户可能需要基本的步骤和代码示例。 首先,应该解释OTA的基本概念,说明它的重要性,比如无需物理连接就能更新固件,这对远程设备非常有用。然后,需要分步骤介绍实现方法。可能包括配置分区表、选择OTA方式(这里常见的是基于HTTP的),然后编写代码。 记得要确保代码示例正确,并且符合用户的开发环境,比如使用Arduino或ESP-IDF。可能需要提到使用AsyncElegantOTA库,因为它简化了流程,适合初学者。同时,要提醒用户注意分区表的大小,确保有足够的空间存储OTA数据,否则可能导致更新失败。 另外,安全方面也不能忽视,建议使用HTTPS和签名验证,防止中间人攻击或固件被篡改。可能还需要提到常见的错误码,比如OTA过程中可能出现的错误,以及如何排查,比如检查网络连接、分区设置等。 用户可能遇到的问题包括分区不足、网络不稳定、签名验证失败等,需要给出相应的解决方法。同时,生成相关问题时,要考虑用户可能进一步的需求,比如性能优化、安全加固、故障排除等。 最后,确保引用正确,参考了ESP-IDF的文档和相关资源,保证信息的可靠性。还要检查是否符合用户的要求,比如使用中文回答,数学公式的正确格式,但这个问题可能涉及较少数学内容,不过代码块和步骤需要清晰。</think>### ESP32 OTA更新实现指南 ESP32OTA(Over-the-Air)更新功能允许通过Wi-Fi网络更新设备固件,无需物理连接[^1]。以下是实现的关键步骤: #### 一、基础配置 1. **分区表设置** 在`partitions.csv`中定义两个OTA分区(ota_0和ota_1),示例配置: ``` # Name, Type, SubType, Offset, Size ota_0, 0, ota_0, 0x10000, 0x140000 ota_1, 0, ota_1, 0x150000, 0x140000 ``` 2. **选择OTA模式** 支持`native API`(底层控制)和`Simple OTA`(简化流程),推荐后者快速实现。 #### 二、HTTP OTA实现(ESP-IDF) ```c #include <esp_https_ota.h> void ota_task(void *pvParameter) { esp_http_client_config_t config = { .url = "http://your-server.com/firmware.bin", .cert_pem = NULL // HTTPS需配置证书 }; esp_https_ota(&config); esp_restart(); // 重启生效 } ``` #### 三、Arduino简化实现 通过AsyncElegantOTA库快速搭建: ```cpp #include <AsyncElegantOTA.h> void setup(){ AsyncElegantOTA.begin(&server); // 启动OTA服务端 server.begin(); } ``` #### 四、安全注意事项 1. **HTTPS加密**:避免固件被劫持 2. **签名验证**:使用`esp_ota_set_boot_partition()`前校验固件签名 3. **回滚机制**:通过`esp_ota_get_last_invalid_partition()`检测无效更新 #### 五、错误排查 - **ESP_ERR_NO_MEM**:检查分区表空间 - **ESP_ERR_OTA_VALIDATE_FAILED**:固件签名不匹配 - **ESP_ERR_NOT_FOUND**:服务器固件路径错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值