概述
【ESP32 乐鑫 离线环境搭建】
【ESP32-S2】乐鑫离线环境 与IDF4.3构建自己的项目以及自定义目录
【ESP32-S2】OTA升级代码移植以及APP之间的切换
【ESP32-S2】使用http_cliten 相关API 主动循环下载bin文件
【ESP32-S2】ESP32-S2从服务器下载STM32F103ZET6的bin固件再使用Ymodem通讯实现bootloader
本项目基于2个官方例程1个服务器jar包 idf4.3
1、advanced_https_ota
2、hello_world
3、file-demo-0.0.1-SNAPSHOT.jar
链接:https://pan.baidu.com/s/1hhCDLQSoWAvyNpdD_OcpNA
提取码:n9kz
流程概述:
0x110000的APP1代码远程连接服务器下载其配置的APP2的bin到0x210000地址作为APP2。
然后重启自动运行APP2。
APP2中移植了APP1的OTA部分代码实现远程下载APPx到0x110000,手动重启自动运行APPx。
APPx正常运行一段时间后使用esp_ota_mark_app_invalid_rollback_and_reboot();函数
直接重启回滚 到APP2,之后重启都是运行APP2
注意回滚的意思是当前APP不用了,用上一个好的APP。如果不存在上一个好的则函数无效。
也就是说每一个代码都应该包含该函数保证能回滚到之前正常的app版本
1、首先修改 advanced_https_ota 工程的相关配置
设置WiFi账号密码
服务器链接
跳过证书
跳过版本检测
使能OTA的http访问下载
将最后的代码下载到0x110000地址
无需修改代码,其中URL的下载文件为后面工程编译的而不是自带的hellowold
2、修改hello_world配置
代码中修改服务器链接
代码中修改WiFi账号密码
代码中注释掉证书相关的部分
使能OTA的http访问下载
1、【advanced_https_ota】工程操作如下
设置当前工程为ESP32S2项目
注意:远程更新后若要重新下载,需要先擦除。
2、【hello_world】工程操作如下
注释掉证书相关的代码,WiFi的连接使用sta的代码连接路由器
注意:#define HELLOWOLD 1
使用该宏定义则编译后的bin为hellowold.bin(APP2)
不使用该宏定义则编译后的bin为hellowold1.bin(APPx)此版本不带下载功能,只做APP回退测试用
原始的APP1为advanced_https_ota.bin,运行APP2之后下载的APPx覆盖了APP1
/* Hello World Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_log.h"
#include "esp_event.h"
#include "esp_http_client.h"
#include "esp_https_ota.h"
#include "esp_ota_ops.h"
#include "esp_wifi.h"
static const char *TAG = "advanced_https_ota_example";
//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 CONFIG_EXAMPLE_SKIP_COMMON_NAME_CHECK 1
#define CONFIG_EXAMPLE_SKIP_VERSION_CHECK 1
#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
#ifdef CONFIG_BOOTLOADER_APP_ANTI_ROLLBACK
/**
* Secure version check from firmware image header prevents subsequent download and flash write of
* entire firmware image. However this is optional because it is also taken care in API
* esp_https_ota_finish at the end of OTA update procedure.
*/
const uint32_t hw_sec_version = esp_efuse_read_secure_version();
if (new_app_info->secure_version < hw_sec_version) {
ESP_LOGW(TAG, "New firmware security version is less than eFuse programmed, %d < %d", new_app_info->secure_version, hw_sec_version);
return ESP_FAIL;
}
#endif
return ESP_OK;
}
static esp_err_t _http_client_init_cb(esp_http_client_handle_t http_client)
{
esp_err_t err = ESP_OK;
/* Uncomment to add custom headers to HTTP request */
// err = esp_http_client_set_header(http_client, "Custom-Header", "Value");
return err;
}
void advanced_ota_example_task(void *pvParameter)
{
ESP_LOGI(TAG, "Starting Advanced OTA example");
esp_err_t ota_finish_err = ESP_OK;
esp_http_client_config_t config = {
.url = "http://192.168.216.98:8080/downloadFile/hello-world1.bin",
//.cert_pem = (char *)server_cert_pem_start,
.timeout_ms = 5000,
.keep_alive_enable = true,
};
#ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL_FROM_STDIN
char url_buf[OTA_URL_SIZE];
if (strcmp(config.url, "FROM_STDIN") == 0) {
example_configure_stdin_stdout();
fgets(url_buf, OTA_URL_SIZE, stdin);
int len = strlen(url_buf);
url_buf[len - 1] = '