

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 HTTP 的 OTA 更新的先决条件
<a name="ota-http-freertos"></a>

本节介绍使用 HTTP 执行 over-the-air (OTA) 更新的一般要求。从 201912.00 版本开始，FreeRTOS OTA 可以使用 HTTP 或 MQTT 协议将固件更新映像从设备传输到设备。 AWS IoT 

**注意**  
尽管可以使用 HTTP 协议来传输固件映像，但仍然需要 CoreMQTT 代理库，因为与之的其他交互都 AWS IoT Core 使用 CoreMQTT 代理库，包括发送或接收任务执行通知、作业文档和执行状态更新。
在为 OTA 更新作业同时指定 MQTT 和 HTTP 协议时，每个设备上的 OTA 代理软件的设置将确定用于传输固件映像的协议。要将 OTA 代理从默认 MQTT 协议方法更改为 HTTP 协议，可以修改用于编译设备的 FreeRTOS 源代码的标头文件。

## 最低要求
<a name="ota-http-freertos-min-requirements"></a>
+ 设备固件必须包含必要的 FreeRTOS 库（coreMQTT 代理、HTTP、OTA 代理及其依赖项）。
+ 要求安装 FreeRTOS 版本 201912.00 或更高版本来更改 OTA 协议的配置，以便启用通过 HTTP 传输 OTA 数据。

## 配置
<a name="ota-http-freertos-config"></a>

请参阅 [https://github.com/aws/amazon-freertos/blob/main/vendors/vendor/boards/board/aws_demos/config_files/ota_config.h](https://github.com/aws/amazon-freertos/blob/main/vendors/vendor/boards/board/aws_demos/config_files/ota_config.h) 文件中的以下 OTA 协议配置。

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

1. 将 `configENABLED_DATA_PROTOCOLS` 更改为 `OTA_DATA_OVER_HTTP`。

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

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

## 设备特定的配置
<a name="ota-http-freertos-device-configuration"></a>

**ESP32**  
由于 RAM 量是有限的，因此，在将 HTTP 作为 OTA 数据协议启用时，必须关闭 BLE。在 [https://github.com/aws/amazon-freertos/blob/main/vendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h](https://github.com/aws/amazon-freertos/blob/main/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 )
```

## 内存使用量
<a name="ota-http-freertos-memory"></a>

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

****德州仪器 CC3220 SF-LAUNCHXL****  
控制操作 (MQTT)：12 KB  
数据操作 (HTTP)：10 KB  
 TI 使用更少的 RAM，因为它在硬件上使用 SSL，所以它不使用 mbedtls 库。

****微芯片好奇号 PIC32 MZEF****  
控制操作 (MQTT)：65 KB  
数据操作 (HTTP)：43 KB

****Espressif ESP32****  
控制操作 (MQTT)：65 KB  
数据操作 (HTTP)：45 KB  
BLE ESP32 开启需要大约 87 KB 的内存。RAM 不足，无法启用所有这些操作，上面的特定于设备的配置中已说明这一点。

****Windows 模拟器****  
控制操作 (MQTT)：82 KB   
数据操作 (HTTP)：63 KB 

****Nordic nrf52840-dk****  
不支持 HTTP。

## 设备策略
<a name="ota-http-freertos-device-policy"></a>

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

每个使用 HTTP 接收 OTA 更新的设备都必须在 AWS IoT 中注册为事物，并且该设备必须具有类似此处所列策略的附加策略。您可以在 [AWS IoT 核心策略操作](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-actions.html)和 [AWS IoT 核心操作资源](https://docs.aws.amazon.com/iot/latest/developerguide/iot-action-resources.html)中找到有关 `"Action"` 和 `"Resource"` 对象中项目的更多信息。

**注意**
+ 利用 `iot:Connect` 权限，您的设备可以通过 MQTT 连接到 AWS IoT 。
+  AWS IoT 任务主题的`iot:Subscribe`和`iot:Publish`权限 (`.../jobs/*`) 允许连接的设备接收作业通知和作业文档，并发布任务执行的完成状态。
+ 这些`iot:Receive`权限 AWS IoT Core 允许将有关这些主题的消息发布到当前连接的设备。每次传输 MQTT 消息时，都将检查此权限。您可以使用此权限，撤消对当前订阅主题的客户端的访问权限。