ESP32 OTA详解-中文翻译版

时间:2022-07-23
本文章向大家介绍ESP32 OTA详解-中文翻译版,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

OTA的例子

注: 本指南适用于所有ota示例

概述

ESP32应用程序可以在运行时通过Wi-Fi或以太网从特定的服务器下载新图像,然后将其闪存到某些分区中,从而进行升级。在ESP-IDF中有两种方式可以进行空中(OTA)升级:

  • 使用app_update组件提供的本地api.
  • 使用esp_https_ota组件提供的简化api,它在原生OTA api上添加了一个抽象层,以便使用HTTPS协议进行升级。

分别在native_ota_examplesimple_ota_example下的OTA演示中演示了这两种方法。

为了简单起见,OTA示例通过在menuconfig中启用CONFIG_PARTITION_TABLE_TWO_OTA选项来选择预定义的分区表,该选项支持三个应用程序分区:工厂分区、OTA_0分区和OTA_1分区。有关分区表的更多信息,请参阅分区表.

在第一次引导时,引导加载程序将加载工厂应用程序图像(即示例图像),然后触发OTA升级。它将从HTTPS服务器下载一个新映像并将其保存到OTA_0分区。它还会自动更新ota_data分区,以指示下一次重置时应该从哪个应用程序启动。引导加载程序将读取ota_data分区中的内容并运行所选的应用程序。

OTA工作流程如下图所示:

如何使用这些例子

硬件要求

要运行OTA示例,您需要一个ESP32开发板(例如ESP32- wrover Kit)或ESP32核心板(例如ESP32- devkitc)。如果您想用以太网测试OTA,请确保您的板正确地设置了以太网。有关设置以太网的更多信息,请参阅以太网示例.

配置项目

打开项目配置菜单(idf.py menuconfig).

Example Connection Configuration 菜单中:

  • 根据您的板在Connect using中选择网络接口。目前我们同时支持Wi-Fi和以太网。
  • 如果你选择了Wi-Fi接口,你还必须设置:
    • 您的ESP32将连接到的Wi-Fi SSID和Wi-Fi密码
  • 如果你选择了以太网接口,你还必须:
    • 在以太网物理层设备选项下设置物理层模型,如IP101。

Example Configuration 菜单中:

  • Firmware Upgrade URL选项中设置要下载的新固件的URL,其格式应该是https://<host-ip-address>:<host-port>/<firmware-image-filename>,例如https://192.168.2.106:8070/hello-world.bin

构建和烧录

运行 idf.py -p PORT flash monitor 来构建和flash项目. 这个命令将查找分区表是否具有ota_data分区(在我们的示例中),然后ota_data将擦除为initial。它允许从一个工厂分区运行新加载的应用程序。

(要退出串行监视器,请键入 Ctrl-])

有关配置和使用ESP-IDF构建项目的完整步骤,请参阅入门指南

示例输出

HTTPS服务器运行

成功构建之后,我们需要创建一个自签名证书,并运行一个简单的HTTPS服务器,如下所示:

  • 输入一个包含HTTPS服务器根目录的目录,例如 cd build.
  • 要创建一个新的自签名证书和密钥,只需运行命令 openssl req -x509 -newkey rsa:2048 -keyout ca_key.pem -out ca_cert.pem -days 365 -nodes.
    • 当提示输入Common Name (CN)时,输入ESP32将连接到的服务器的名称。对于这个示例,它可能是IP地址。HTTPS客户机将确保CN与HTTPS URL中给出的地址匹配。
  • 要启动HTTPS服务器,只需运行命令 openssl s_server -WWW -key ca_key.pem -cert ca_cert.pem -port 8070.
  • 在同一个目录中,应该有ESP32稍后将下载的固件(例如hello-world.bin)。它也可以是任何其他的ESP-IDF应用程序,只要您还在menuconfig中更新Firmware Upgrade URL。惟一的区别是,当通过串行flash二进制文件时,二进制文件将flash到“工厂”应用程序分区,OTA更新将flash到OTA应用程序分区.
  • 注意: 如果您运行的防火墙软件将阻止对端口8070的传入访问,请将其配置为在运行示例时允许访问。
  • 注意: 对于Windows用户,您应该在 openssl命令之前添 winpty :
    • winpty openssl req -x509 -newkey rsa:2048 -keyout ca_key.pem -out ca_cert.pem -days 365 -nodes
    • winpty openssl s_server -WWW -key ca_key.pem -cert ca_cert.pem -port 8070

Flash证书到ESP32

在flash示例之前,请确保将生成的证书复制到OTA示例目录中的server_certs目录,以便将其与固件(例如cp ca_cert)一起flash到ESP32中。比如:cp ca_cert.pem ../server_certs/.

cp ca_cert.pem /path/to/ota/example/server_certs/

OTA示例的内部工作流

当示例启动时,它会将“start OTA example”打印到控制台,然后:

  1. 使用配置好的SSID和密码(Wi-Fi情况)或以太网连接到AP.
  2. 连接到HTTPS服务器并下载新映像.
  3. 将映像写入flash,并从该映像配置下一个引导.
  4. 重新启动

如果您想在升级之后回滚到工厂应用程序(或者当工厂分区不存在时回滚到第一个OTA分区),那么运行命idf.py erase_otadata。它可以将ota_data分区擦除到初始状态.

注意: 这假设该项目的分区表是设备上的分区表.

HTTPS服务器的输出

FILE:hello-world.bin
ACCEPT

支持回滚

如果应用程序无法运行,此功能允许您回滚到以前的固件。 选项 CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE 允许跟踪应用程序的第一次引导(请参阅OTA文章). 对于 native_ota_example,添加了一些代码来演示回滚是如何工作的。要使用它,您需要在menuconfig和CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE子菜单下启用CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE选项来设置“用于诊断的GPIO输入的数量”,以管理回滚过程.

要触发回滚,必须在在第一个启动时的消息诊断(5秒)…之前将GPIO拉低。如果GPIO没有拉低,那么应用程序的可操作性将得到确认.

支持应用程序的版本

对于 native_ota_example, 添加了代码来演示如何检查应用程序的版本并防止无限的固件更新。只有新版本的应用程序才能下载。版本检查是在收到第一个固件映像包之后执行的,其中包含有关固件版本的数据。申请版本可从以下三个地方选取:

  1. 如果在项目 PROJECT_VER 文件中设置PROJECT_VER变量,则使用它的值.
  2. 否则,如果 $PROJECT_PATH/version.txt 存在,它的内容将用作 PROJECT_VER.
  3. 否则,如果项目位于Git存储库中,则使用 git describe的输出.
  4. 否则, PROJECT_VER 将为 “1”.

native_ota_example中, $PROJECT_PATH/version.txt 用于定义应用程序的版本. 更改文件中的版本以编译新固件.

故障排除

  • 检查你的电脑是否可以在它的IP上能ping ESP32,并且在menuconfig中IP、AP和其他配置设置是否正确。
  • 检查是否有防火墙软件在阻止PC上的传入连接。
  • 通过检查 curl -v https://<host-ip-address>:<host-port>/<firmware-image-filename>命令的输出,检查是否可以看到配置的文件(默认hello-world.bin)
  • 如果您有另一台PC或电话,请尝试从单独的主机查看文件列表。

错误 “ota_begin error err=0x104”

如果您看到这个错误,那么检查分区表中配置的(和实际的)闪存大小是否足够大,默认的“两个OTA插槽”分区表只能处理4MB的flash大小。要使用较小flash大小的OTA,请创建一个自定义分区表CSV(查看components/partition_table)并在menuconfig中配置它。

如果更改分区布局,通常明智的做法是在步骤之间运行idf.py erase_flash