您的位置:

ESP32OTA详解

ESP32OTA是一款轻量级的OTA(Over-The-Air)升级方案,为ESP32设备的在线升级提供了便利。本文将从多个方面对ESP32OTA做详细阐述,包括升级、分区无效、升级问题、判断程序崩溃以及无factory APP等方面。

一、ESP32OTA升级

ESP32OTA支持通过HTTP服务器、FTP服务器、本地文件系统等多种方式进行升级。其中,HTTP服务器是最为常见的一种方式,可通过以下代码实现:

 ESPhttpUpdate.update("http://yourserver/firmware.bin");

此外,ESP32OTA还支持MD5校验,可以确保升级文件的完整性:

ESPhttpUpdate.update("http://yourserver/firmware.bin", "", "5b589af0f0db3ebd6750ec0f623d1e7d");

此处的第二个参数为空,表示使用ESP32自带的MD5功能进行校验。而第三个参数为升级文件的MD5校验值,如果升级文件与此处给定的MD5值不符,ESP32OTA会放弃升级。

二、ESP32OTA分区无效

如果在升级时出现“OTA partition invalid”错误,这意味着升级过程中出现了问题。通常,这种问题可能是由于未正确设置ESP32的分区表所致。解决方法如下:

// 定义OTA分区起始位置
#define OTA_PARTITION_ADDRESS 0x200000
...
// 在setup()函数中初始化OTA分区
esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, "ota");
if (partition == NULL) {
    ESP_LOGE(TAG, "OTA partition not found.");
    return;
}
if (partition->address != OTA_PARTITION_ADDRESS) {
    esp_err_t err = esp_ota_set_boot_partition(partition);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Failed to set boot partition.");
        return;
    }
    ESP_LOGI(TAG, "Set boot partition to OTA partition.");
}

此处,我们使用esp_partition_find_first()函数查找首个名为“ota”的分区,然后通过esp_ota_set_boot_partition()函数将其设置为启动分区。

三、ESP32OTA升级问题

如果在升级时出现任何错误,可以使用ESP32OTA库的回滚功能进行处理。ESP32OTA库会在升级前自动为您备份旧的应用程序,以便需要回滚时可以快速恢复。

// 尝试进行OTA升级...
if (ESPhttpUpdate.update("http://yourserver/firmware.bin") == ESP_OK) {
    // 升级成功
} else {
    // 升级失败,尝试回滚到旧程序
    ESPhttpUpdate.rebootToLastApp();
}

此外,ESP32OTA还提供了一个重载的函数,您可以在需要时指定回滚应用程序的分区表子类型。

ESPhttpUpdate.rebootToLastApp(partition_subtype);

四、ESP32OTA如何判断程序崩溃

在使用ESP32OTA时,您可能会遇到程序崩溃的情况。当程序崩溃时,ESP32会自动重启,但重启后可能无法正常工作。解决方法如下:

// 定义CheckForCrash函数检测程序崩溃
bool CheckForCrash() {
    if (esp_ota_get_last_upgrade_failed() == ESP_OK) {
        esp_app_desc_t new_app_info;
        if (esp_ota_get_partition_description("ota", &new_app_info) == ESP_OK) {
            ESP_LOGW(TAG, "Last boot crashed. Current firmware version: %s", new_app_info.version);
            // 在此处执行必要的操作
            return true;
        }
    }
    return false;
}

此处,我们通过esp_ota_get_last_upgrade_failed()函数判断是否存在升级失败的记录。如果升级失败,我们使用esp_ota_get_partition_description()函数获取当前应用程序的描述信息,然后可以进行必要的操作(如回滚)。

五、ESP32OTA无Factory APP

如果您使用ESP-IDF开发框架构建应用程序,则还可以轻松地为ESP32设置Factory APP。Factory APP是设备出厂时的初始版本,通常包含设备的基本功能。

在使用ESP-IDF构建应用程序时,可以通过以下命令生成Factory APP:

idf.py factory

这将根据当前的应用程序生成Factory APP,并将其添加到Partition Table中。之后,您可以使用ESP32OTA库轻松安装工厂APP:

ESPhttpUpdate.update("http://yourserver/factory.bin", "", "", ESP_OTA_IMG_FACTORY);

此处,我们通过第四个参数指定了该应用程序为工厂应用程序。此外,我们还可以添加MD5校验等操作。

六、ESP32OTA-A4E57CDA3CDC local选取

在本地测试环境中,或者将升级文件存储在ESP32的文件系统中时,可以使用ESP32OTA-A4E57CDA3CDC库中的特定函数进行升级:

String host = "http://192.168.1.123/";
String update_bin = "/file/firmware.bin";
String update_md5 = "/file/firmware.md5";

EspOta espOta(host, update_bin, update_md5);
espOta.execUpdate();

此处,我们使用EspOta类封装了ESP32OTA的升级操作,并通过execUpdate()函数执行升级操作。此外,我们还需要提供服务器地址、升级文件以及MD5校验文件。

总结

本文对ESP32OTA进行了详细的阐述,从升级、分区无效、升级问题、判断程序崩溃以及无Factory APP等方面进行了介绍。通过了解ESP32OTA的各种功能和用法,您可以更好地管理ESP32设备的在线升级,提高设备的可靠性和稳定性。