coreHTTP 基本 S3 下載示範 - FreeRTOS

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

coreHTTP 基本 S3 下載示範

重要

這是 FreeRTOS 使用者指南的封存版本,可與 FreeRTOS 版本 202210.00 搭配使用。如需本文件的最新版本,請參閱 FreeRTOS 使用者指南

簡介

此示範示範如何使用範圍請求從 Amazon S3 HTTP 伺服器下載檔案。當您使用 HTTPClient_AddRangeHeader建立 HTTP 請求時,coreHTTP API 原生支援範圍請求。對於微型控制器環境,強烈建議提出範圍請求。透過下載不同範圍的大型檔案,而不是單一請求,可以在不封鎖網路通訊端的情況下處理檔案的每個區段。範圍請求可降低捨棄封包的風險,這需要在 TCP 連線上重新傳輸,因此可改善裝置的耗電量。

此範例使用使用 mbedTLS 的網路傳輸界面,在執行 coreHTTP 的 IoT 裝置用戶端與 Amazon S3 HTTP 伺服器之間建立相互驗證的連線。

注意

若要設定和執行 FreeRTOS 示範,請遵循中的步驟FreeRTOS 入門

單一執行緒與多執行緒

有兩種 coreHTTP 使用模型:單一執行緒多執行緒 (多任務)。雖然本節中的示範會在執行緒中執行 HTTP 程式庫,但實際上示範如何在單一執行緒環境中使用 coreHTTP (示範中只有一個任務使用 HTTP API)。雖然單一執行緒應用程式必須重複呼叫 HTTP 程式庫,但多執行緒應用程式可以改為在代理程式 (或協助程式) 任務的背景中傳送 HTTP 請求。

原始碼組織

示範專案名為 http_demo_s3_download.c,可在 freertos/demos/coreHTTP/目錄和 GitHub 網站上找到。

設定 Amazon S3 HTTP 伺服器連線

此示範使用預先簽章的 URL 來連線至 Amazon S3 HTTP 伺服器,並授權物件的存取權進行下載。Amazon S3 HTTP 伺服器的 TLS 連線只會使用伺服器身分驗證。在應用程式層級,會使用預先簽章 URL 查詢中的參數來驗證物件的存取權。請依照下列步驟設定您的連線 AWS。

註冊 AWS 帳戶

如果您沒有 AWS 帳戶,請完成下列步驟來建立一個。

註冊 AWS 帳戶
  1. 開啟 https://portal.aws.amazon.com/billing/signup

  2. 請遵循線上指示進行。

    註冊程序的一部分包括接聽電話或文字訊息,並在電話鍵盤上輸入驗證碼。

    當您註冊 時 AWS 帳戶,AWS 帳戶根使用者會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務,請將管理存取權指派給使用者,並且僅使用根使用者來執行需要根使用者存取權的任務

AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 https://aws.amazon.com/ 並選擇我的帳戶,以檢視您目前的帳戶活動並管理帳戶。

建立具有管理存取權的使用者

註冊 後 AWS 帳戶,請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立管理使用者,以免將根使用者用於日常任務。

保護您的 AWS 帳戶根使用者
  1. 選擇根使用者並輸入 AWS 帳戶 您的電子郵件地址,以帳戶擁有者AWS Management Console身分登入 。在下一頁中,輸入您的密碼。

    如需使用根使用者登入的說明,請參閱 AWS 登入 使用者指南中的以根使用者身分登入

  2. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

    如需說明,請參閱《IAM 使用者指南》中的為您的 AWS 帳戶 根使用者 (主控台) 啟用虛擬 MFA 裝置

建立具有管理存取權的使用者
  1. 啟用 IAM Identity Center。

    如需指示,請參閱《AWS IAM Identity Center 使用者指南》中的啟用 AWS IAM Identity Center

  2. 在 IAM Identity Center 中,將管理存取權授予使用者。

    如需使用 IAM Identity Center 目錄 做為身分來源的教學課程,請參閱AWS IAM Identity Center 《 使用者指南》中的使用預設值設定使用者存取 IAM Identity Center 目錄

以具有管理存取權的使用者身分登入
  • 若要使用您的 IAM Identity Center 使用者簽署,請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

    如需使用 IAM Identity Center 使用者登入的說明,請參閱AWS 登入 《 使用者指南》中的登入 AWS 存取入口網站

指派存取權給其他使用者
  1. 在 IAM Identity Center 中,建立一個許可集來遵循套用最低權限的最佳實務。

    如需指示,請參閱《AWS IAM Identity Center 使用者指南》中的建立許可集

  2. 將使用者指派至群組,然後對該群組指派單一登入存取權。

    如需指示,請參閱《AWS IAM Identity Center 使用者指南》中的新增群組

若要提供存取權,請新增權限至您的使用者、群組或角色:

  • 中的使用者和群組 AWS IAM Identity Center:

    建立權限合集。請按照 AWS IAM Identity Center 使用者指南 中的 建立權限合集 說明進行操作。

  • 透過身分提供者在 IAM 中管理的使用者:

    建立聯合身分的角色。遵循「IAM 使用者指南」的為第三方身分提供者 (聯合) 建立角色中的指示。

  • IAM 使用者:

  1. 遵循《Amazon Simple Storage Service 主控台使用者指南》中的如何建立 S3 儲存貯體?中的步驟,在 S3 中建立儲存貯體。 S3

  2. 遵循如何將檔案和資料夾上傳至 S3 儲存貯體中的步驟,將檔案上傳至 S3?。 S3

  3. 使用位於 的指令碼產生預先簽章的 URLFreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py。如需使用說明,請參閱 FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md

功能

示範會先擷取檔案大小。然後,它會在迴圈中依序請求每個位元組範圍,範圍大小為 democonfigRANGE_REQUEST_LENGTH

您可以在 GitHub 網站上找到示範的原始程式碼。

連線至 Amazon S3 HTTP 伺服器

函數 connectToServerWithBackoffRetries() 會嘗試與 HTTP 伺服器建立 TCP 連線。如果連線失敗,則會在逾時後重試。逾時值會呈指數增加,直到達到最大嘗試次數或最大逾時值為止。如果在設定的嘗試次數之後無法建立與伺服器的 TCP 連線,則 會connectToServerWithBackoffRetries()傳回失敗狀態。

函數prvConnectToServer()示範如何使用伺服器身分驗證建立與 Amazon S3 HTTP 伺服器的連線。它使用在 FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c 檔案中實作的 mbedTLS 型傳輸界面。

您可以在 GitHubprvConnectToServer()找到 的原始碼。

建立範圍請求

API 函數HTTPClient_AddRangeHeader()支援將位元組範圍序列化為 HTTP 請求標頭,以形成範圍請求。此示範會使用範圍請求來擷取檔案大小,並請求檔案的每個區段。

函數會prvGetS3ObjectFileSize()擷取 S3 儲存貯體中檔案大小。Connection: keep-alive 標頭會新增至 Amazon S3 的第一個請求,以在傳送回應後保持連線開啟。S3 HTTP 伺服器目前不支援使用預先簽章 URL 的 HEAD 請求,因此請求第 0 個位元組。檔案的大小包含在回應的Content-Range標頭欄位中。預期來自伺服器的206 Partial Content回應;收到的任何其他回應狀態碼都是錯誤。

您可以在 GitHubprvGetS3ObjectFileSize()找到 的原始碼。

擷取檔案大小後,此示範會為要下載檔案的每個位元組範圍建立新的範圍請求。它會HTTPClient_AddRangeHeader()針對 檔案的每個區段使用 。

傳送範圍請求和接收回應

函數會在迴圈中prvDownloadS3ObjectFile()傳送範圍請求,直到下載整個檔案為止。API 函數HTTPClient_Send()會傳送請求並同步接收回應。當函數傳回時,回應會在 中收到xResponse。然後,狀態碼會驗證為 ,206 Partial Content而且到目前為止下載的位元組數會以Content-Length標頭值遞增。

您可以在 GitHubprvDownloadS3ObjectFile()找到 的原始碼。