coreHTTP 基本 S3 ダウンロードのデモ
重要
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、ここから始めることをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「Amazon FreeRTOS Github リポジトリ移行ガイド」を参照してください。
序章
このデモでは、範囲リクエストHTTPClient_AddRangeHeader を使用して HTTP リクエストを作成するときに coreHTTP API でネイティブにサポートされます。マイクロコントローラ環境では、範囲リクエストを使用することを強くお勧めします。単一のリクエストはなく、個別の複数の範囲リクエストで大きなファイルをダウンロードすることで、ネットワークソケットをブロックすることなくファイルの各セクションを処理できます。範囲リクエストを使用すると、パケットがドロップされて TCP 接続での再送が必要になるリスクが低くなるため、デバイスの消費電力が改善されます。
この例で使用するネットワークトランスポートインターフェイス
注記
FreeRTOS デモをセットアップして実行するには、FreeRTOS の開始方法 の手順に従います。
シングルスレッドとマルチスレッド
coreHTTP には、シングルスレッドとマルチスレッド (マルチタスク) の 2 つの使用モデルがあります。このデモは、このセクションでは 1 つのスレッドで HTTP ライブラリを実行しますが、実際にはシングルスレッド環境で coreHTTP を使用する方法を示しています (このデモでは、1 つのタスクのみが HTTP API を使用します)。シングルスレッドアプリケーションは HTTP ライブラリを繰り返し呼び出す必要がありますが、マルチスレッドアプリケーションは、代わりにエージェント (またはデーモン) タスク内でバックグラウンドで HTTP リクエストを送信できます。
ソースコードの編成
デモプロジェクトの名前は http_demo_s3_download.c です。このプロジェクトは、 ディレクトリと GitHubfreertos/demos/coreHTTP/
Amazon S3 HTTP サーバー接続の設定
このデモでは、署名付き URL を使用して Amazon S3 HTTP サーバーに接続し、ダウンロードするオブジェクトへのアクセスを許可します。Amazon S3 HTTP サーバーの TLS 接続では、サーバー認証のみが使用されます。アプリケーションレベルでは、オブジェクトへのアクセスは、署名付き URL クエリのパラメータを使用して認証されます。以下のステップに従って、AWS への接続を設定します。
-
AWS アカウントを次のようにセットアップします。
-
まだ行っていない場合は、AWS アカウントを作成してアクティブ化
します。 -
アカウントとアクセス権限は、AWS Identity and Access Management (IAM) を使用して設定します。IAM では、アカウント内の各ユーザーのアクセス権限を管理できます。デフォルトでは、ルート所有者によって付与されるまで、ユーザーにはアクセス権限がありません。
-
ユーザーを AWS アカウントに追加する方法については、「IAM ユーザーガイド」を参照してください。
-
これらのポリシーを追加して、AWS アカウントに FreeRTOS と AWS IoT にアクセスする権限を付与します。
-
AmazonS3FullAccess
-
-
-
-
Amazon Simple Storage Service Console ユーザーガイドの S3 バケットを作成する方法に従って、S3 にバケットを作成します。
-
S3 バケットにファイルとフォルダをアップロードする方法のステップに従って、S3 にファイルをアップロードします。
-
FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.pyファイルにあるスクリプトを使用して、署名付き URL を生成します。使用手順については、「FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md」を参照してください。
機能
このデモは、まずファイルのサイズを取得します。次に、各バイト範囲をループ内で順番にリクエストします。範囲サイズは democonfigRANGE_REQUEST_LENGTH で指定します。
デモのソースコードは GitHub
Amazon S3 HTTP サーバーに接続する
connectToServerWithBackoffRetries()connectToServerWithBackoffRetries() は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。
prvConnectToServer() 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c
prvConnectToServer() のソースコードは、GitHub
範囲リクエストを作成する
HTTPClient_AddRangeHeader() API 関数は、バイト範囲を HTTP リクエストヘッダーにシリアル化して、範囲リクエストを形成することをサポートします。このデモでは、範囲リクエストを使用して、ファイルサイズを取得し、ファイルの各セクションをリクエストします。
prvGetS3ObjectFileSize() 関数は、S3 バケットのファイルのサイズを取得します。Amazon S3 へのこの最初のリクエストには、レスポンスの送信後も接続を開いたままにするために Connection: keep-alive ヘッダーが追加されます。S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの Content-Range ヘッダーフィールドに含まれています。206 Partial Content レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。
prvGetS3ObjectFileSize() のソースコードは、GitHub
このデモは、ファイルサイズを取得した後、ダウンロードするファイルのバイト範囲ごとに新しい範囲リクエストを作成します。ファイルの各セクションについて HTTPClient_AddRangeHeader() を使用します。
範囲リクエストの送信とレスポンスの受信
prvDownloadS3ObjectFile() 関数は、ファイル全体がダウンロードされるまで、範囲リクエストをループ内で送信します。HTTPClient_Send() API 関数は、リクエストの送信とレスポンスの受信を同期的に行います。関数からのレスポンスは xResponse で受信されます。その後、ステータスコードが 206 Partial Content であることが検証され、これまでにダウンロードされたバイト数の増加が Content-Length ヘッダー値で表されます。
prvDownloadS3ObjectFile() のソースコードは、GitHub