下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

通过 HTTP 运行 OTA
使用 coreMQTT Agent 和代码签名


序言

虽然此演示使用 AWS IoT OTA 更新服务,但 FreeRTOS 是通用 MIT 授权的开源软件, 可用于任何适合您的 OTA 机制。 但我们还是建议, 无论您选择哪种 OTA 方法,您最好对您的固件进行数字签名。 这样一来,收到新的可执行映像的设备可以验证它来自授权来源, 并且没有被修改过。您可以使用 AWS IoT 代码签名 来签署您的固件,也可以用您自己的代码签名工具来签署。

简介

此示例演示了 OTA 更新过程,即使用 MQTT 协议与 AWS IoT OTA 更新服务进行通信,并使用 HTTP 协议从 S3 预签名的网址下载文件。此示例使用 coreMQTT Agent 来接收挂起 OTA 更新作业的通知,以及固件映像的 S3 预签名网址。使用 coreMQTT Agent 可以使 OTA 更新功能在后台运行,与共享同一 MQTT 连接的其他任务同时进行。使用 coreHTTP 实现从 S3 预签名网址下载。该示例还演示了使用代码签名来验证下载的固件映像没有被篡改,并且来自受信任的发送方。

有关其他信息,请参阅源目录功能部分中每份 C 文件顶部的注释。

说明

入门

首先,将 MQTT Agent 主文档页上所述的一个简单的 MQTT Agent 示例连接到 AWS IoT MQTT 代理。 这将确保与 AWS IoT 的连接正常工作, 然后再继续设置 OTA 服务。

一旦与非 OTA 演示的连接运行正常,请按照下方说明进行操作:

  • 设置云服务,以便能够存储固件映像并将其发送到设备。
  • 配置设备并运行 OTA 客户端以接收更新。
  • 准备并创建 OTA 更新作业以将固件发送到设备。

设置云服务

开始使用 AWS 控制台

此演示应用程序使用 AWS 控制台来创建一个 IoT 事物,存储一个固件映像,并安排一个 OTA 作业。 您需要一个 AWS 帐户才能获得授权以执行这些操作。 点击此处 开始创建和配置帐户

使用 OTA Update Manager Service 的前提条件

创建事物

AWS IoT 事物,或简称“事物”,是设备的云表示。通过将您的物理设备注册为一个“事物”,您能够为它存储安全证书,为您的设备分配权限(它在云中能和不能做什么 或访问什么),并在发送 OTA 更新时选择它。在此演示中,FreeRTOS Windows 模拟器的“设备” 将由一个 IoT 事物表示,并将从 AWS 控制台向其发送一个 OTA 作业。

在将一个非 OTA 演示连接到 AWS IoT 时,已经创建了一个事物,所以无需额外的步骤。


设置设备(OTA 客户端)

如果您已按照上述建议使用其他 MQTT agent 示例中的一个 来连接 AWS IoT,那么您已经拥有源文件,并已配置 网络和 AWS IoT 连接。

应用程序版本

若要客户端接受 OTA 更新,其收到的更新的版本号必须高于 当前正在运行的固件的版本号。

使用宏 “APP_VERSION_MAJOR”、“APP_VERSION_MINOR” 和 “APP_VERSION_BUILD” 在 “demo_config.h” 源文件中 设置设备软件的应用程序版本 。这几个宏的默认设置 分别为 0、9 和 2。目前无需更改这些设置,但会在以后的步骤中进行修改。

OTA 控制协议

OTA 控制协议设置管理用于 AWS IoT 服务控制操作协议,例如作业 通知、更新作业状态和报告进度。对于控制操作,当前仅支持 MQTT 。

此设置由 “configENABLED_CONTROL_PROTOCOL” 宏控制,该宏可在 “ota_config.h” 头文件中找到。此宏的默认值为 “OTA_DATA_OVER_HTTP”,无需为此演示进行修改。

OTA 数据协议

OTA 数据协议定义了用于 over-the-air 与设备之间传输数据格式。目前 支持 MQTT 和 HTTPS。

通过设置 “configENABLED_DATA_PROTOCOLS” 宏来控制此选项,该宏可在 在 “ota_config.h” 头文件中找到。此宏的默认设置为 "OTA_DATA_OVER_HTTP",无需为此演示进行更改。

代码签名

代码签名用于确认作者,并保证代码自签名以来没有被篡改或损坏。作为 OTA 过程的一部分,完全下载文件签名后会对其进行验证。

在执行 over-the-air 更新之前,需要设置用于验证文件的证书。如果要使用存储在 设备上的证书来验证文件,则必须在后面的步骤中输入证书的路径。若要配置代码签名证书,请在 "aws_ota_codesigner_certificate.h" 头文件中设置 "signingcredentialSIGNING_CERTIFICATE_PEM" 变量。

其他 OTA 库配置

请参阅其他 OTA 库配置。无需为此演示更改这些配置值。

验证项目是否成功构建并运行

在继续之前,请验证您是否能够构建和运行该项目。您可在 Visual Studio 演示项目中按 F5, 或导航至 “Debug” 选项卡并单击 “Start Debugging” 来完成此操作。


准备创建 OTA 更新作业

若要发送 OTA 作业,需要更新存储在 S3 存储桶中的固件映像。AWS IoT OTA Manager Service 将从此存储桶中读取映像并将其发送到设备。要使设备接受映像,则接收到的映像的版本号必须高于设备上已执行的映像的版本号。FreeRTOS Windows 模拟器用于构建和运行演示,但无法同时完成这两项操作。因此,我们需要以下工作流程(记录在项目符号列表下方):

  1. 设置应用程序版本号并构建项目可执行文件。
  2. 验证可执行文件是否可以正确构建和运行。
  3. 将可执行文件 /build/VisualStudio/Demo/RTOSDemo.exe 上传至 S3。
  4. 将应用程序版本号设置为低于步骤 1 中使用的版本号。
  5. 使用降低的版本号来构建演示。
  6. 运行更新后的演示,让其在等待 OTA 作业时继续运行。
注意:生产工作流程的示例为:
  1. 编写 MCU 固件,集成 OTA 客户端库源代码。
  2. 使用初始固件对设备硬件 (MCU) 进行编程。
  3. 在本地更改和测试固件。
  4. 为新版本的固件生成二进制文件。
  5. 将新版本上传到 S3,并使用 OTA 作业将其发送至 MCU。
设置应用程序版本

想要模拟拥有“新”固件映像的情况,请递增版本号。对于此演示,请更新以下 可以在 “demo.config” 源文件中找到的宏值,如下所示:

#define APP_VERSION_MAJOR 0
#define APP_VERSION_MINOR 9
#define APP_VERSION_BUILD 2

构建“新”固件映像

通过构建项目生成固件映像。要执行此操作,请按 "Ctrl + Shift + b" 或导航 至 "Build" 选项卡,然后在 Visual Studio 项目中按 "BUILD" 按钮。这将生成以下可执行文件:

/build/VisualStudio/Demo/RTOSDemo.exe

因为演示在 FreeRTOS Windows 模拟器上运行,因此在这种情况下,“固件映像”是 Windows 可执行文件。

验证项目是否成功构建并运行

在通过 OTA 更新发送固件之前,最好先在本地验证此固件。请参阅“验证 项目是否构建并运行”章节,以了解更多信息。

将固件映像上传至 S3 存储桶

  1. 登录 Amazon S3 控制台,网站链接为 https://console.aws.amazon.com/s3/
  2. 单击在之前的步骤中创建的存储桶。
  3. 点击 “Overview” 选项卡下的 “Upload” 按钮。
  4. 将 “RTOSDemo.exe” 拖入存储桶。
  5. 单击 “Upload” 将可执行文件添加到存储桶中。

降低应用程序版本

降低应用程序版本。对于此演示,请更新下列 可在 “demo_config.h” 源文件中找到的宏值,如下所示:

#define APP_VERSION_MAJOR 0
#define APP_VERSION_MINOR 9
#define APP_VERSION_BUILD 1

构建并运行 OTA 客户端

按 “Local Windows Debugger” 按钮构建并运行演示。允许客户端 在等待从 AWS IoT OTA Manager service 接收 OTA 作业时继续运行。


使用 AWS IoT 控制台创建 OTA 更新作业

此时,您应该已经:

  • 使用 AWS IoT Service 创建 AWS IoT 事物。
  • 设置 S3 存储桶并管理各种服务的权限。
  • 将“更新”的固件映像上传到 S3 存储桶。
  • 完成代码签名所需的设置。
  • 配置了在您的设备上运行的 OTA 客户端。

创建 OTA 更新作业

OTA 客户端运行和云服务设置完成后,下一步是 创建 OTA 作业,向设备发送新的固件映像。首先转到 AWS IoT 控制台

  1. 在 AWS IoT 控制台的导航窗格中,选择 Manage,然后选择 Jobs然后按 Create a Job


    创建作业——点击放大

  2. Create a FreeRTOS OTA update job 下, 选择 Create OTA update job


    创建 OTA 更新作业——点击放大

  3. OTA job properties 页面上,输入 Job name, ——FreeRTOS OTA 更新作业的名称(例如,“WIN_SIM_UPDATE”)。您可以选择输入描述并添加 添加 Tags。然后按 Next 继续。


    OTA 作业属性 - 点击放大

  4. 您可在单个设备或一组设备上部署 OTA 更新。在 OTA file configuration 页面上,在 Devices to update 下, 选择与您要更新的设备相关联的事物或事物组。在 Select the protocol for file transfer 下, 选择 HTTP 旁边的复选框。


    选择要更新的设备——点击放大

  5. Sign and choose your file 下,让默认选项 Sign a new file for me 一直处于选中状态。在 Code signing profile 下,按 Create new profile 按钮, 该按钮就在 Existing code signing profile 旁边。


    选择要 OTA 的文件——点击放大

  6. Create a code signing profile 页面,在 Profile name 下,输入 "winsim_codesigning"。在 Device hardware platform 下,选择 "Windows Simulator"。在 Code signing certificate 下,更改默认值并选中 Select an existing certificate 复选框。在 Certificates 下,选择 您之前生成的证书和证书私钥。如果您遵循了建议, 那它们将被命名为 "ecdsasigner.crt" 和 "ecdsasigner.key"。然后按 Import 按钮。

    设备上代码签名证书的路径名下,输入您刚导入的 "ecdsasigner.crt" 证书的路径。但是,如果在上一步中设置了变量 "signingcredentialSIGNING_CERTIFICATE_PEM", 则应在此处输入"/"作为路径。

    最后,点击创建按钮创建代码签名配置文件。


    创建代码签名配置文件 - 点击放大

  7. 返回 OTA file configuration 页面,在 File 下,更改默认值 并选中 Select an existing file 的复选框,然后按 Browse S3 按钮并选择您在上一步骤中上传至 S3 的可执行文件。在 Path name of file on device 下,输入 "./NewRTOSDemo.exe"。此路径是在 OTA 更新期间用来保存下载文件的位置 。

    注意:文件类型功能在 OTA 库 v2.0.0 版或更高版本中受到支持。


    在设备上选择 S3 文件和位置——点击放大

  8. IAM role 下,选择为 OTA 进程创建的 IAM 角色。然后,按 Next 继续。


    选择 IAM 角色——点击放大

  9. OTA job configuration 下,保留为 Job run type (快照)、Job start rollout configuration (恒定速率)和 Job run timeout configuration (无超时)选择的默认设置。然后按 Create job 按钮以完成 OTA 更新作业的创建。


    OTA 作业配置 - 点击放大

  10. 您可以通过按 View Job 弹出式选单或 在 AWS IoT 控制台中导航到 Manage > Jobs 来监控此作业的状态。作业将显示为 IN PROGRESS 直到设备成功重启。 

OTA 作业状态 - 点击放大



接收并激活更新

创建作业后,设备应开始下载更新。可以通过查看 Visual Studio 控制台来检测下载进度。以下是进度更新的例子:

Current State=[WaitingForFileBlock], Event=[RequestFileBlock], New state=[WaitingForFileBlock]
Received valid file block: Block index=96, Size=2048
Number of blocks remaining: 3

收到下载的最后一个块后,下列消息将被打印到监视器上:

Received final block of the update.

此时,演示将验证下载的代码签名。如果成功,则下列消息会被打印到控制台上:

sig-sha256-ecdsa signature verification passed.

演示会在成功下载更新后尝试激活新映像。就此演示而言,需要通过手动运行下载的可执行文件来激活更新。演示将会显示下列消息提示这一点:

Failed to activate new image: activateNewImage returned error: Manual reset required: OtaPalStatus_t=OtaPalSuccess

成功验证更新后,演示将退出并提供以下信息。

OTA agent task stopped. Exiting OTA demo.

如果映像已成功下载,则其随时可激活。停止调试会话并关闭窗口。检查您先前指定的目录,看看是否有通过 over-the-air 下载的新的可执行文件。如果您在创建作业时键入 “./NewRTOSDemo.exe”,那新的可执行文件将与 Visual Studio 解决方案位于同一目录中。运行此可执行文件。新的可执行文件启动后,设备将开始验证映像。如果此过程成功,则下列消息将被打印到控制台上:

New image validation succeeded in self test mode.

作业过程完成后, IoT 控制台中的作业状态将从 “IN PROGRESS” 改为 “COMPLETED”。如果设备已成功通过自检流程,作业的状态则将改为 “Succeeded”。


OTA 作业状态——点击放大


功能

此演示说明了如何使用 OTA 库(该库使用 coreMQTT AgentcoreHTTP 库)来构建一个应用程序。利用 coreMQTT Agent 可以使 OTA Agent 与其他任务共享同一个 MQTT 代理连接。coreHTTP 库用于通过预签名的 S3 网址下载文件。

演示设置

此示例应用程序包括 OTA 库所需的资源和接口实现。关于这些接口的详细信息,请参阅 OTA 库设计文档

OTA PAL 实现

OTA PAL 接口是一组用于存储、管理和验证下载的 API。本演示提供了 Windows 模拟器平台的示例实现。

移植的详细信息可以在 GitHub 上的 Win32 存储库中找到。

OTA 操作系统函数式接口实现

OTA 库通过调用操作系统函数式接口实现来执行通常由操作系统提供的操作。这些操作包括事件管理、定时器和内存分配。此演示使用这些接口的 FreeRTOS 实现。

移植的详细信息可以在 GitHub 上的 ota_os_freertos.h 文件中找到。

OTA HTTP 接口实现

OTA 库使用 OTA HTTP 接口来从 S3 服务连接请求文件块。OTA 库使用 HTTP 协议来从接收到的 S3 预签名 AWS IoT OTA 服务中下载固件映像。

移植的详细信息可以在 GitHub 上的 OtaOverHttpDemoExample.c 文件中找到。

OTA 应用程序回调实现

OTA 库提供了一种在接收作业后调用用户定义函数的方法。当 OTA agent 完成更新作业以及设备在激活映像后重启并执行自检时,调用此函数。通常,如果更新作业成功,则设备将会重置以启动新映像。如果作业被拒绝,此回调通常会在不做任何事情的情况下返回,并等待另一个作业。

有关实现的详细信息,请参阅 GitHub 上的 OtaOverHttpDemoExample.c 文件。

内存分配设置

OTA Agent 需要内存来下载、解码和存储作业和文件。除非用户提供的缓冲区不足,否则 OTA Agent 将使用用户提供的缓冲区。在这种情况下,它将动态分配由 OTA 操作系统函数式接口实现定义的内存抽象函数所需的内存。

用户配置

演示需要特定于运行它的设备的某些配置。详情请参阅之前的演示步骤

演示的入口点

OTA 演示源代码可在 GitHub 上的 OtaOverHttpDemoExample.c 文件中找到。此函数是管理 over-the-air 下载过程的主要线程。它执行以下步骤:

初始化 OTA Agent

为了使用 OTA Agent,在开始事件处理任务之前,您需要向 "OTA_Init" API 提供接口实现、缓冲区和应用程序回调函数。

您可以在 GitHub 上的 OtaOverHttpDemoExample.c 文件中查看此示例。

OTA 回调

创建 OTA agent 事件处理任务

OTA agent 通过管理跟踪下载过程的当前状态的状态计算机来运行。状态机因接收源自内部调用或主应用程序的事件而受到影响。OTA agent 需要运行一个循环来接收和处理这些传入事件,然后才能启动。此演示在一个单独的线程中运行这个处理循环,该线程调用 OTA 库所定义的 “OTA_EventProcessingTask” API。

您可以在 GitHub 上的 OtaOverHttpDemoExample.c 文件中查看此示例。

启动 OTA Agent

配置 OTA Agent 并启动事件处理任务后,OTA Agent 可以开始下载过程。这是通过使用 "OTA_SignalEvent" API 向 OTAAgent 发送一个具有 “OtaAgentEventStart” ID 的事件来实现的。

您可以在 GitHub 上的 OtaOverHttpDemoExample.c 文件中查看此示例。

监测 OTA Agent 统计信息

OTA Agent 启动后,它将继续在后台运行下载进程,直至其关闭。OTA 库提供 "OTA_GetStatistics" API,用于接收与下载进度相关的统计信息。这些统计信息包括已接收、排队、处理和丢弃的数据包数量。

您可以在 GitHub 上的 OtaOverHttpDemoExample.c 文件中查到轮询和打印这些统计信息的示例。

关闭 OTA Agent

OTA agent 将继续在后台运行,直至其收到关闭事件。OTA 库提供了一个用于发送此事件的 API(称为 “OTA_Shutdown”)。演示在接收并激活作业后调用此 API 以关闭 OTA Agent。

您可以在 Github 上的 OtaOverHttpDemoExample.c 文件中查看此示例。


故障排除

下列章节包含帮助您解决 OTA 更新问题的信息。  

主题

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.