/****************************************************************************** * 作者:kerwincui * 时间:2021-06-08 * 邮箱:164770707@qq.com * 源码地址:https://gitee.com/kerwincui/wumei-smart * author: kerwincui * create: 2021-06-08 * email:164770707@qq.com * source:https://github.com/kerwincui/wumei-smart ******************************************************************************/ #include "https_ota.h" static const char *TAG = "advanced_https_ota"; 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"); #define OTA_URL_SIZE 256 static esp_err_t validate_image_header(esp_app_desc_t *new_app_info) { if (new_app_info == NULL) { return ESP_ERR_INVALID_ARG; } const esp_partition_t *running = esp_ota_get_running_partition(); esp_app_desc_t running_app_info; if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK) { ESP_LOGI(TAG, "Running firmware version: %s", running_app_info.version); } // #ifndef CONFIG_EXAMPLE_SKIP_VERSION_CHECK // if (memcmp(new_app_info->version, running_app_info.version, sizeof(new_app_info->version)) == 0) { // ESP_LOGW(TAG, "Current running version is the same as a new. We will not continue the update."); // return ESP_FAIL; // } // #endif return ESP_OK; } void advanced_ota_task(void *pvParameter) { ESP_LOGI(TAG, "Starting Advanced OTA"); esp_err_t ota_finish_err = ESP_OK; esp_http_client_config_t config = { .url = CONFIG_FIRMWARE_UPG_URL, .cert_pem = (char *)server_cert_pem_start, .timeout_ms = CONFIG_OTA_RECV_TIMEOUT, }; #ifdef CONFIG_SKIP_COMMON_NAME_CHECK config.skip_cert_common_name_check = true; #endif 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 (err != ESP_OK) { ESP_LOGE(TAG, "ESP HTTPS OTA Begin failed"); vTaskDelete(NULL); } esp_app_desc_t app_desc; err = esp_https_ota_get_img_desc(https_ota_handle, &app_desc); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_https_ota_read_img_desc failed"); goto ota_end; } err = validate_image_header(&app_desc); if (err != ESP_OK) { ESP_LOGE(TAG, "image header verification failed"); goto ota_end; } while (1) { err = esp_https_ota_perform(https_ota_handle); if (err != ESP_ERR_HTTPS_OTA_IN_PROGRESS) { break; } //监控OTA升级的进度,提供目前为止镜像数据的大小 ESP_LOGD(TAG, "Image bytes read: %d", esp_https_ota_get_image_len_read(https_ota_handle)); } if (esp_https_ota_is_complete_data_received(https_ota_handle) != true) { //OTA镜像没有接收完成 ESP_LOGE(TAG, "Complete data was not received."); } ota_end: ota_finish_err = esp_https_ota_finish(https_ota_handle); if ((err == ESP_OK) && (ota_finish_err == ESP_OK)) { ESP_LOGI(TAG, "ESP_HTTPS_OTA upgrade successful. Rebooting ..."); vTaskDelay(1000 / portTICK_PERIOD_MS); esp_restart(); } else { if (ota_finish_err == ESP_ERR_OTA_VALIDATE_FAILED) { ESP_LOGE(TAG, "Image validation failed, image is corrupted"); } ESP_LOGE(TAG, "ESP_HTTPS_OTA upgrade failed %d", ota_finish_err); vTaskDelete(NULL); } } void app_main(void) { // 初始化nvs esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { // OTA app分区表比非OTA分区表具有更小的NVS分区大小。这种大小不匹配可能会导致NVS初始化失败。 //如果发生这种情况,我们擦除NVS分区并再次初始化NVS ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } ESP_ERROR_CHECK( err ); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_wifi_set_ps(WIFI_PS_NONE); xTaskCreate(&advanced_ota_task, "advanced_ota_task", 1024 * 8, NULL, 5, NULL); }