ESP32 固件更新OTA

乐鑫最新的代码下载地址

一、esp32 OTA的配置

我是在esp-idf\examples\system\ota\simple_ota_example例子上面修改的

进入simple_ota_example文件夹里面make menuconfig  选择partition Table ->Factory app,two OTA definitions

ESP32 固件更新OTA_第1张图片

选择好之后保存退出。并且编译(我之前用的是esp8266不带系统的,做OTA的时候要生成2个文件,esp32这里生成的是一个文件。已经合并了,并且函数接口已经官方写好,使用非常简单)

 

二、程序修改

1、在例子里面 修改URL 为自己本机http服务器的地址

void simple_ota_example_task(void *pvParameter)
{
    ESP_LOGI(TAG, "Starting OTA example");
    printf("-----------等待wifi连接成功-----------\n");
    app_wifi_wait_connected();
    printf("-----------wifi连接成功-----------\n");
    esp_http_client_config_t config = {
        .url = "http://192.168.43.95:8070/get/simple_ota.bin",
        //.cert_pem = (char *)server_cert_pem_start,
        .event_handler = _http_event_handler,
    };
    esp_err_t ret = esp_https_ota(&config);//调用这个自动完成更新
    if (ret == ESP_OK) {
    	printf("------------------------success-------------------------------------\n");
        esp_restart();
    } else {
    	printf("------------------------error:%x-------------------------------------\n",ret);
        ESP_LOGE(TAG, "Firmware Upgrades Failed");
    }
    while (1) {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

2、注释掉esp_https_ota_begin的如下代码(不同版本可能注释掉的不一样,我之前用的是3.1.3注释的不是这里)

 /*   if (!ota_config->http_config->cert_pem) {
        ESP_LOGE(TAG, "Server certificate not found in esp_http_client config");
        *handle = NULL;
        return ESP_ERR_INVALID_ARG;
    }*/

这个是要配置服务器证书,我们用不到,在上面的的配置里面已经注释掉了 //.cert_pem = (char *)server_cert_pem_start,

三、启动HTTP 服务器

1、首先编译刚才配置好的工程,然后再工程里面会多出一个build文件夹,在CMD里面进入到build文件夹,在build里面新建一个文件夹get,然后把生存的simple_ota.bin文件拷贝进去,如下图 esp32生成的只有一个文件 ,他们文件合并了。

ESP32 固件更新OTA_第2张图片

2、启动http服务

首先启动http服务一定要到build文件夹的路径,否则程序更新的时候回产生esp_ota_write failed! err=0x5379错误,如下图启动http服务

ESP32 固件更新OTA_第3张图片

启动http服务之后就可以在浏览器上面打开,打开服务器运行后,构建目录的内容可以通过网址 http://localhost:8070/ 浏览到。

ESP32 固件更新OTA_第4张图片

四、程序下载

程序的下载根据编译的结果下载四个文件就行,如下图

ESP32 固件更新OTA_第5张图片

ESP32 固件更新OTA_第6张图片

五、运行结果

ESP32 固件更新OTA_第7张图片

从这里可以看到,更新是成功的,我在程序的开始还加了一个

    const esp_partition_t *running = esp_ota_get_running_partition();

    // Display the running partition
    ESP_LOGI(TAG, "\n\nRunning partition: %s\n", running->label);

 

然后再串口上面可以看到 不断的更新,打印出来的信息是 Running partition: ota_0 和Running partition: ota_1 说明一直在不停的自动更新。

 

 

你可能感兴趣的:(ESP32)