如何使用 ESP32 微控制器及其 ESP-IDF 执行空中下载 (OTA) 更新?

作者:Jacob Beningo

投稿人:DigiKey 北美编辑

物联网 (IoT) 产品的设计者需要不断地评估平台和组件的选择,以降低成本和功率,同时提高性能和加快连接应用的设计。目前有相当多的解决方案可供选择,但设计者面临的挑战是,一旦部署,如何进行无线空中下载 (OTA) 更新以保持设备固件的更新。

关键是要看一下现有的平台,看看它们有哪些额外的工具和支持来支持 OTA 更新。这样的支持可以大大简化过程,但前期可能需要一些关注。

本文讨论了 OTA 基本原理,以及为什么它是几乎每个物联网系统都需要支持的关键功能,尽管开发者面临着诸多挑战。然后以 Espressif SystemsESP32 支持蓝牙和 Wi-Fi 的微控制器以及相关模块、套件和 ESP 物联网开发框架 (ESP-IDF) 为例,展示如何打造一个 OTA 分区,并利用 otatool.py 脚本在应用仍在运行时执行固件更新。

OTA 更新介绍

大多数开发团队的核心重点是实现其产品的特定功能,也就是产品差异化业务逻辑。然而,每个物联网产品都有一个基本功能集,需要在设备的整个生命周期内进行部署、配置和维护。安全更新是一个很好的例子。鉴于需要执行这些更新,在评估一个合适的开发平台时,一个重要但容易被忽视的功能是引导程序或固件 OTA (FOTA) 更新(有时只称为 OTA)能力。

OTA 为工程师提供了根据技术和业务要求远程维护和升级其产品的能力,而不需要派维护人员到设备上或让终端客户主动对设备做一些更新。相反,所有这些成本都可以通过让设备在后台默默地或在半夜操作之类“停工”时间内升级其固件方式来消除。

OTA 架构可以有许多不同的形式和配置,从定制的解决方案一直到云提供商提供的标准实现方案。图 1 中可以看到一个典型的架构实例。

OTA 架构概览展示了更新应用固件的示例过程示意图图 1:OTA 架构概览展示在现场向所部署设备更新应用固件的示例过程。(图片来源:Beningo Embedded Group)

在这个例子中,一个 OEM 使用亚马逊网络服务 (AWS) 物联网内核上传新的固件版本,然后使用内置的作业功能将更新部署到现场的设备。这只是众多例子中的一个,几乎每个云供应商都有类似的解决方案。

今天有许多支持 OTA 的微控制器可供选择。一个广受低成本系统和制造商欢迎的微控制器是 ESP32。ESP32 之所以如此受欢迎,有以下几个原因:

  • 它有一个集成的微控制器,有 Wi-Fi/蓝牙认证模块可用
  • 低成本
  • 开源开发环境和软件框架,如 ESP-IDF 和 ESP 音频开发框架 (ESP-ADF)
  • 许多现有的应用实例可在网上免费获得

选择一个 ESP32 模块进行 OTA 测试

有几种不同的 ESP32 模块和开发板可供用户购买,以便了解 OTA 实例。以 Adafruit 3405 ESP32 Huzzah Feather 板为例(图 2)。这是一块低成本的开发板,包括对 ESP32 进行编程的所有电路,并通过一个 USB 连接器为其供电。

Adafruit 3405 Huzzah Feather Board 图片图 2:3405 Huzzah Feather 板包含一个 ESP32 WROOM-32D 认证型 Wi-Fi/蓝牙模块,带 4 Mb 闪存。该板包括所有必要的硬件,可通过 USB 编程和与模块通信。(图片来源:Adafruit)

3405 的核心是一个 ESP32-WROOM-32D 模块,它配备了 4 Mb 闪存、Wi-Fi、蓝牙和一套完整的外设,几乎适用于任何应用。

另一块可以使用的开发板是 Espressif Systems 的 ESP32-LYRATD-SYNA 音频板(图 3)。该开发板包括 ESP32-WROVER-B 模块。

Espressif Systems ESP32-LYRATD-SYNA 板图片图3 :ESP32-LYRATD-SYNA 板基于 ESP32 WROVER-B 认证型 Wi-Fi/蓝牙模块,带 4 Mb 闪存。除了能够让设计者通过 USB 编程和与模块通信外,它还具有开发音频应用所需的电路。(图片来源:Espressif Systems)

ESP32-LYRATD-SYNA 模块也有 4 Mb 闪存,以及用于音频应用的所有电路。该板包括一个音频编解码器、一个音频放大器以及耳机和扬声器插孔,以全面测试音频应用。

最后一块可用于 OTA 测试的开发板是 Espressif 的 ESP32-S2-SAOLA-1RI 开发板(图 4)。说到开发板,这款最不昂贵的。该板包含一个 ESP32 Wrover 模块,以及对该芯片进行编程的电路。除了它所包含的引脚可以很容易地放到试验板上进行测试外,没有任何其他的装饰。

基于 Wrover 模块的 Espressif Systems ESP32-S2-SAOLA-1RI 图片图 4:基于 Wrover 模块的 ESP32-S2-SAOLA-1RI 是一块裸开发板,成本低,但包括足够的电路来对板载模块编程。(图片来源:Espressif Systems)

为测试而选择的具体板子并不太重要,因为每个 ESP32 模块都利用了 ESP-IDF。这个框架旨在通过包括驱动程序、中间件、RTOS 以及对本文而言很重要的引导程序和 OTA 库,从而为开发者简化了软件开发活动。

引导程序允许开发者利用 OTA 更新,并在主要应用仍在运行时对内存进行分区以更新固件,这有助于最大限度地减少停机时间。引导程序的设置一开始可能看起来很复杂,但如果指导得当,是很简单的。

OTA 开发工作流

ESP32 的 OTA 开发工作流将根据业务需求和产品组件选择而略有不同。例如,一个利用 AWS 的团队可能会使用 AWS 的入门指南和例子来启动其 ESP32 OTA 解决方案。另一方面,一个正在定制自己解决方案的公司也可能会利用 ESP32 的说明文档。在这篇文章中,我们要看的是 ESP32 层面内容,而不是在云端。原因是这些内容是通用的,适用于 ESP32 的 OTA,无论使用哪个云提供商或解决方案。

一般来说,在 ESP32 上设置 OTA 更新的过程包括以下步骤:

  1. 配置 ESP32 分区表
  2. 下载支持 OTA 的固件
  3. 开发一个工具,充当服务器,推送新的固件
  4. 将最新的固件下载到 ESP32 上
  5. 调换到新应用

很明显,这是简化的方法。开发人员应再次查看图 1 以了解整个固件更新过程。这个过程可能相当复杂,所以建议利用位于 GitHub 上的现有 ESP32 OTA 实例。这些例子提供了几个关键实例,如:

  • HTTPS OTA
  • 本地 OTA
  • 简单 OTA
  • OTA 工具(python 脚本示例)

图 5 显示了部署和更新过程的步骤。开发者需要先执行红色的步骤,将 OTA 解决方案部署到 ESP32 模块上。橙色的步骤是下一步,执行这些步骤是为了推进 OTA 更新。

Espressif Systems OTA 更新实例示意图图 5:位于 GitHub 上的 Espressif Systems OTA 更新例子为开发者提供了几个简单的例子,以让其 ESP32 执行 OTA 更新。(图片来源:Espressif Systems)

为 OTA 配置一个 ESP32 应用程序

ESP32 包含一个分区表,描述了什么类型的数据位于微控制器上以及它的位置。例如,一个标准的 ESP32 分区表看起来像表 1。

标准 ESP32 分区表图片表 1:标准 ESP32 分区表显示了数据的类型及其在微控制器上的位置。(表格来源:Beningo Embedded)

有一个工厂应用,然后是 NVS 库和物理层 (PHY) 初始化 (init) 数据部分。为了使用 OTA 功能,该表需要更新,以便除了主要(工厂)应用外,还要为 OTA 更新固件指定存储器位置。对于 OTA,通常有两个分区被分配用于更新。一个是正在更新的固件,一个是正在下载的固件,它将成为最新版本。这使得工厂应用能够保持不变。更新后的 OTA 分区表将看起来像表 2。

典型的 ESP32 更新 OTA 分区表图片表2:典型的 ESP32 更新 OTA 分区表。(表格来源:Beningo Embedded)

如表所示,现在有一个 ota_0 和 一个ota_1 应用部分,其大小为 1Mb,此外还有一个数据部分 (otadata),是为更新过程分配的 RAM。这个表可以由开发者修改和更新,以适应应用。

为了运行 OTA 例子,有一套简单的说明,列在 GitHub 的“如何使用实例”部分。该部分描述了如何构建应用并对其进行编程。

还有 otatool,可以用来更新固件。这个脚本通常用于:

  • 读取、写入和擦除 OTA 分区
  • 切换引导分区
  • 切换到工厂分区

该示例脚本可以通过使用命令在终端运行该示例来执行。

./otatool_example.sh

或者使用 Python。

python otatool_example.py

当谈到为 OTA 配置 ESP32 时,确保分区的设置是一个关键步骤。

使用的技巧和诀窍

EPS32 OTA 解决方案可以加速和简化开发者的固件更新方案。为了防止解决方案成为开发负担,有几个“技巧和诀窍”应该牢记在心。

  • 如果可能的话,利用该公司的云供应商所包含的现有 OTA 框架。这可以极大地简化开发和集成。
  • 使用低成本的开发板来测试 OTA 功能和引导程序。ESP32 有几个选项,可能需要一些实验来确定哪一个是最适合手头的应用。
  • 对于定制解决方案,可利用 GitHub 上的 ESP32 OTA 实例。
  • 对于产品作为 Wi-Fi 路由器或集线器的应用,考虑将固件镜像下载到外部存储器,并从大容量存储设备执行更新。
  • 花一些时间查看关于分区表的 ESP32 说明文档。这与典型的微控制器实现有点不同。
  • 出于安全考虑,最好禁用应用回滚。如果应用可以回滚到以前的版本,潜在的攻击者就有可能推送一个带有已知漏洞的版本,并破坏系统。

遵循这些“技巧和决窍”的开发者会发现,当他们试图利用 ESP32 或任何其他 OTA 解决方案时,他们可以节省大量的时间并免受煎熬。

结语

OTA 更新是越来越多的物联网和嵌入式系统的一个重要功能。开发人员需要很好地掌握这种功能的有效实现方法,以便在设计和开发过程中以及在产品出厂后节省前期时间。

ESP32 无线微控制器已经广泛用于各种类型的设备,如上所述,它有一个现成的 OTA 解决方案。通过利用 ESP-IDF 和相关的模块和平台,并使用一些基于经验的技巧和决窍,开发者可以大大减轻他们的设计时间,并完成他们的 OTA 解决方案并使之可靠地运行。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Jacob Beningo

Jacob Beningo 是一位嵌入式软件顾问,目前与十几个国家的客户保持合作,通过帮助客户改善产品质量、降低成本和加快上市时间来大幅改变他们的业务。Jacob 先后发表了 200 多篇关于嵌入式软件开发技术的文章,是一位广受欢迎的演讲者和技术培训师。他拥有三个学位,其中包括密歇根大学的工程硕士学位。如有需要,欢迎随时通过 jacob@beningo.com 与其联系,也可访问其网站 www.beningo.com,并订阅其月度 Embedded Bytes Newsletter

关于此出版商

DigiKey 北美编辑