OTA的例子
注: 本指南适用于所有ota示例
概述
ESP32应用程序可以在运行时通过Wi-Fi或以太网从特定的服务器下载新图像,然后将其闪存到某些分区中,从而进行升级。在ESP-IDF中有两种方式可以进行空中(OTA)升级:
- 使用
app_update
组件提供的本地api. - 使用
esp_https_ota
组件提供的简化api,它在原生OTA api上添加了一个抽象层,以便使用HTTPS协议进行升级。
分别在native_ota_example
和simple_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
- 注意: 这个URL的服务器部分(例如
192.168.2.106
)必须匹配生成证书和密钥时使用CN字段。
- 注意: 这个URL的服务器部分(例如
构建和烧录
运行 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”打印到控制台,然后:
- 使用配置好的SSID和密码(Wi-Fi情况)或以太网连接到AP.
- 连接到HTTPS服务器并下载新映像.
- 将映像写入flash,并从该映像配置下一个引导.
- 重新启动
如果您想在升级之后回滚到工厂应用程序(或者当工厂分区不存在时回滚到第一个OTA分区),那么运行命idf.py erase_otadata
。它可以将ota_data分区擦除到初始状态.
注意: 这假设该项目的分区表是设备上的分区表.
HTTPS服务器的输出
代码语言:javascript复制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
, 添加了代码来演示如何检查应用程序的版本并防止无限的固件更新。只有新版本的应用程序才能下载。版本检查是在收到第一个固件映像包之后执行的,其中包含有关固件版本的数据。申请版本可从以下三个地方选取:
- 如果在项目
PROJECT_VER
文件中设置PROJECT_VER变量,则使用它的值. - 否则,如果
$PROJECT_PATH/version.txt
存在,它的内容将用作PROJECT_VER
. - 否则,如果项目位于Git存储库中,则使用
git describe
的输出. - 否则,
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
。