使用 HTTP 的 OTA 更新的先决条件 - FreeRTOS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 HTTP 的 OTA 更新的先决条件

此部分介绍了使用 HTTP 执行无线 (OTA) 更新的一般要求。从版本 201912.00 开始,FreeRTOS OTA 可使用 HTTP 或 MQTT 协议将固件更新映像从 AWS IoT 传输到设备。

注意
  • 虽然 HTTP 协议可用于传输固件映像,但仍需要 MQTT 库,因为与 AWS IoT Core 进行的其他交互将使用 MQTT 库,包括发送或接收作业执行通知、作业文档和执行状态更新。

  • 在为 OTA 更新作业同时指定 MQTT 和 HTTP 协议时,每个设备上的 OTA 代理软件的设置将确定用于传输固件映像的协议。要将 OTA 代理从默认 MQTT 协议方法更改为 HTTP 协议,可以修改用于编译设备的 FreeRTOS 源代码的标头文件。

  • 仅当资源拥有者具有 ICP 许可证时,预签名 URL 才起作用。您的请求必须显式提供证书。任何其他形式的请求(包括预签名 URL)都会视为是匿名的。仅当资源拥有者具有 ICP 许可证时,才允许进行匿名请求。因为签名版本 4 中的签名密钥仅在七天内有效,所以预签名 URL 也最多在七天内有效。

最低要求

  • 设备固件必须包含必要的 FreeRTOS 库(MQTT、HTTP、OTA 代理及其依赖关系)。

  • 要求安装 FreeRTOS 版本 201912.00 或更高版本来更改 OTA 协议的配置,以便启用通过 HTTP 传输 OTA 数据。

配置

请参阅 \vendors\boards\board\aws_demos\config_files\aws_ota_agent_config.h 文件中的以下 OTA 协议配置。

/** * @brief The protocol selected for OTA control operations. * This configuration parameter sets the default protocol for all the OTA control * operations like requesting an OTA job, updating the job status, and so on. * * Note - Only MQTT is supported at this time for control operations. */ #define configENABLED_CONTROL_PROTOCOL ( OTA_CONTROL_OVER_MQTT ) /** * @brief The protocol selected for OTA data operations. * This configuration parameter sets the protocols selected for the data operations * like requesting file blocks from the service. * * Note - Both MQTT and HTTP are supported for data transfer. This configuration parameter * can be set to the following - * Enable data over MQTT - ( OTA_DATA_OVER_MQTT ) * Enable data over HTTP - ( OTA_DATA_OVER_HTTP) * Enable data over both MQTT & HTTP ( OTA_DATA_OVER_MQTT | OTA_DATA_OVER_HTTP ) */ #define configENABLED_DATA_PROTOCOLS ( OTA_DATA_OVER_MQTT ) /** * @brief The preferred protocol selected for OTA data operations. * * Primary data protocol will be the protocol used for downloading files if more than * one protocol is selected while creating OTA job. Default primary data protocol is MQTT * and the following update here switches to HTTP as primary. * * Note - use OTA_DATA_OVER_HTTP for HTTP as primary data protocol. */ #define configOTA_PRIMARY_DATA_PROTOCOL ( OTA_DATA_OVER_MQTT )

启用通过 HTTP 进行的 OTA 数据传输

  1. configENABLED_DATA_PROTOCOLS 更改为 OTA_DATA_OVER_HTTP

  2. 在进行 OTA 更新时,您可以指定两项协议以便能够使用 MQTT 协议或 HTTP 协议。您可以通过将 configOTA_PRIMARY_DATA_PROTOCOL 更改为 OTA_DATA_OVER_HTTP 来将设备所使用的主协议设置为 HTTP。

注意

OTA 数据操作仅支持 HTTP。对于控制操作,您必须使用 MQTT。

设备特定的配置

ESP32

由于 RAM 量是有限的,因此,在将 HTTP 作为 OTA 数据协议启用时,必须关闭 BLE。在 vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h 文件中,仅将 configENABLED_NETWORKS 更改为 AWSIOT_NETWORK_TYPE_WIFI

/** * @brief Configuration flag which is used to enable one or more network interfaces for a board. * * The configuration can be changed any time to keep one or more network enabled or disabled. * More than one network interfaces can be enabled by using 'OR' operation with flags for * each network types supported. Flags for all supported network types can be found * in "aws_iot_network.h" * */ #define configENABLED_NETWORKS ( AWSIOT_NETWORK_TYPE_WIFI )

内存使用量

在将 MQTT 用于数据传输时,MQTT 连接不需要额外的堆内存,因为它将在控制操作和数据操作之间共享。不过,通过 HTTP 启用数据需要额外的堆内存。以下是使用 FreeRTOS xPortGetFreeHeapSize API 计算的所有受支持平台的堆内存使用情况数据。您必须确保有足够的 RAM 才能使用 OTA 库。

Texas Instruments CC3220SF-LAUNCHXL

控制操作 (MQTT):12 KB

数据操作 (HTTP):10 KB

注意

TI 使用更少的 RAM,因为它在硬件上使用 SSL,所以它不使用 mbedtls 库。

Microchip Curiosity PIC32MZEF

控制操作 (MQTT):65 KB

数据操作 (HTTP):43 KB

Espressif ESP32

控制操作 (MQTT):65 KB

数据操作 (HTTP):45 KB

注意

ESP32 上的 BLE 使用约 87 KB 的 RAM。RAM 不足,无法启用所有这些操作,上面的特定于设备的配置中已说明这一点。

Windows 模拟器

控制操作 (MQTT):82 KB

数据操作 (HTTP):63 KB

Nordic nrf52840-dk

不支持 HTTP。

设备策略

通过此策略,您能够使用 MQTT 或 HTTP 进行 OTA 更新。

每个使用 HTTP 接收 OTA 更新的设备都必须在 AWS IoT 中注册为事物,并且该设备必须具有类似此处所列策略的附加策略。您可以在 AWS IoT 核心策略操作AWS IoT 核心操作资源"Action""Resource" 对象中找到有关这些项的更多信息。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:partition:iot:region:account:client/${iot:Connection.Thing.ThingName}" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:partition:iot:region:account:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*" ] }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive" ], "Resource": [ "arn:partition:iot:region:account:topic/$aws/things/${iot:Connection.Thing.ThingName}/jobs/*" ] } ] }

备注

  • 利用 iot:Connect 权限,您的设备可以通过 MQTT 连接到 AWS IoT。

  • 利用 AWS IoT 作业 (.../jobs/*) 主题的 iot:Subscribeiot:Publish 权限,连接的设备能够接收作业通知和作业文档,并发布作业执行的完成状态。

  • 利用 iot:Receive 权限,AWS IoT Core 能够将有关这些主题的消息发布到当前连接的设备。每次传输 MQTT 消息时,都将检查此权限。您可以使用此权限,撤消对当前订阅主题的客户端的访问权限。