2022.05 ESP32 空中升级 OTA


前言

我使用的IDF版本是V4.4
使用ESP32测试正常
使用ESP32C3测试会一直重启,目前还没空去研究是什么问题
这个例程没有太大的实用性,只是帮助我们了解一下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(const esp_http_client_config_t *config)函数,重新命名函数明
显示进度主要使用到两个函数即可
esp_https_ota_get_image_size(https_ota_handle);// 获取固件大小
esp_https_ota_get_image_len_read(https_ota_handle);// 已经下载

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;
}
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ESP32是一种具有低功耗的WiFi和蓝牙双模片,它可广泛应用于物联网项目中。而Arduino是一款开源的电子原型平台,提供简单易用的软件和硬件。在ESP32和Arduino的结合下,可以实现蓝牙OTA(Over-The-Air)功能,即通过无线方式对固件进行升级。 蓝牙OTA是一种方便且灵活的升级方式,不需要使用USB或串口进行连接,使得固件升级更加简便。使用ESP32 Arduino库,我们可以轻松地在ESP32上实现蓝牙OTA功能。 要使用蓝牙OTA功能,首先需要确保ESP32正常连接到蓝牙设备上。可以使用ESP32的BluetoothSerial库来简化蓝牙串口通信。然后,我们需要准备新的固件文件并将其传输到ESP32。可以使用ESP32的WirelessUpdate库,该库提供了OTA功能所需的基本函数和方法。 在传输固件文件期间,我们需要确保蓝牙连接的稳定性和数据传输的完整性。可以在代码中使用一些检查和验证机制,如CRC校验,以确保固件的正确传输。 最后,需要在ESP32上配置OTA服务器的相关参数,如服务器的IP地址和固件文件的位置。一旦配置完成,ESP32就可以通过蓝牙连接到OTA服务器,并根据指令进行固件升级。 总结起来,ESP32 Arduino蓝牙OTA功能是一种方便且灵活的固件升级方式,可以通过无线方式进行升级,而不需要使用USB或串口连接。通过使用ESP32 Arduino库和WirelessUpdate库,我们可以轻松地在ESP32上实现蓝牙OTA功能,并通过蓝牙连接到OTA服务器进行固件升级。这为物联网项目的开发和维护提供了便利和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值