

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 HTTP 進行 OTA 更新的先決條件
<a name="ota-http-freertos"></a>

本節描述使用 HTTP 執行無線 (OTA) 更新的一般需求。從 201912.00 版開始，FreeRTOS OTA 可以使用 HTTP 或 MQTT 通訊協定，將韌體更新映像從 傳輸 AWS IoT 到 裝置。

**注意**  
雖然 HTTP 通訊協定可能用於傳輸韌體映像，但仍然需要 coreMQTT Agent 程式庫，因為與 的其他互動 AWS IoT Core 會使用 coreMQTT Agent 程式庫，包括傳送或接收任務執行通知、任務文件和執行狀態更新。
當您為 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 程式庫。

****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。

## 裝置政策
<a name="ota-http-freertos-device-policy"></a>

此政策可讓您使用 MQTT 或 HTTP 來進行 OTA 更新。

每部使用 HTTP 接收 OTA 更新的裝置都必須註冊為 AWS IoT 中的物件，且該物件必須有連接的政策，如此處列出的政策所示。如需 `"Action"` 和 `"Resource"` 物件中的項目的詳細資訊，請參閱 [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)。

**備註**
+ `iot:Connect` 許可允許您的裝置透過 MQTT 連接至 AWS IoT 。
+  AWS IoT 任務 (`.../jobs/*`) 主題的 `iot:Subscribe`和 `iot:Publish`許可允許連線的裝置接收任務通知和任務文件，以及發佈任務執行的完成狀態。
+ `iot:Receive` 許可允許 AWS IoT Core 在這些主題上發佈訊息到目前連線的裝置。每次交付 MQTT 訊息時，都會檢查此許可。您可以使用此許可來撤銷目前訂閱主題之用戶端的存取權。