翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
coreHTTP 基本マルチスレッドのデモ
重要
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、ここから始めることをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「Amazon-FreeRTOS Github リポジトリ移行ガイド」を参照してください。
序章
このデモでは、FreeRTOS のスレッドセーフキュー
-
メインタスクは、リクエストがリクエストキューに表示されるのを待ちます。表示されたリクエストをネットワーク経由で送信し、レスポンスをレスポンスキューに配置します。
-
リクエストタスクは、サーバーに送信する HTTP ライブラリリクエストオブジェクトを作成し、リクエストキューに配置します。各リクエストオブジェクトには、アプリケーションにダウンロードするように設定されている S3 ファイルのバイト範囲を指定します。
-
レスポンスタスクは、レスポンスがレスポンスキューに表示されるのを待ちます。受信したすべてのレスポンスをログに記録します。
この基本マルチスレッドのデモは、サーバー認証のみを使用する TLS 接続を使用するように設定されています。これは Amazon S3 HTTP サーバーの要件です。アプリケーションレイヤー認証は、署名付き URL クエリの署名バージョン 4 パラメータを使用して実行されます。
ソースコードの編成
デモプロジェクトの名前は http_demo_s3_download_multithreaded.c
で、
ディレクトリと GitHubfreertos
/demos/coreHTTP/
デモプロジェクトを構築する
このデモプロジェクトでは、Visual Studio の無料のコミュニティエディション
-
Visual Studio IDE 内から
mqtt_multitask_demo.sln
Visual Studio ソリューションファイルを開きます。 -
IDE の [Build] (構築) メニューから [Build Solution] (ソリューションの構築) を選択します。
注記
Microsoft Visual Studio 2017 以前を使用している場合は、お使いのバージョンと互換性があるプラットフォームツールセットを選択する必要があります ([Project] (プロジェクト) -> [RTOSDemos Properties] (RTOSDemos プロパティ) -> [Platform Toolset] (プラットフォームツールセット) )。
デモプロジェクトを設定する
このデモでは、FreeRTOS+TCP TCP/IP スタック
-
前提条件コンポーネント
(WinPCap など) をインストールします。 -
オプションで MAC アドレスを設定します
。 -
ホストマシンのイーサネットネットワークインターフェイスを選択します
。 -
重要: HTTP デモを実行する前にネットワーク接続をテストします
。
Amazon S3 HTTP サーバー接続の設定
coreHTTP 基本ダウンロードのデモの Amazon S3 HTTP サーバー接続の設定 の指示に従います。
機能
このデモでは、合計 3 つのタスクを作成します。
リクエストを送信し、ネットワーク経由でレスポンスを受信するタスク。
送信するリクエストを作成するタスク。
受信したレスポンスを処理するタスク。
このデモのメインタスクの動作:
リクエストキューとレスポンスキューを作成します。
サーバーへの接続を作成します。
リクエストタスクとレスポンスタスクを作成します。
リクエストキューがネットワーク経由でリクエストを送信するのを待ちます。
ネットワーク経由で受信したレスポンスをレスポンスキューに配置します。
リクエストタスクの動作:
各範囲リクエストを作成します。
レスポンスタスクの動作:
受信した各レスポンスを処理します。
Typedefs
このデモでは、マルチスレッドをサポートするために次の構造を定義しています。
リクエスト項目
次の構造で、リクエストキューに配置するリクエスト項目を定義します。リクエスト項目は、リクエストタスクが HTTP リクエストを作成した後、キューにコピーされます。
/** * @brief Data type for the request queue. * * Contains the request header struct and its corresponding buffer, to be * populated and enqueued by the request task, and read by the main task. The * buffer is included to avoid pointer inaccuracy during queue copy operations. */ typedef struct RequestItem { HTTPRequestHeaders_t xRequestHeaders; uint8_t ucHeaderBuffer[ democonfigUSER_BUFFER_LENGTH ]; } RequestItem_t;
レスポンス項目
次の構造で、レスポンスキューに配置するレスポンス項目を定義します。レスポンス項目は、メインの HTTP タスクがネットワーク経由でレスポンスを受信した後、キューにコピーされます。
/** * @brief Data type for the response queue. * * Contains the response data type and its corresponding buffer, to be enqueued * by the main task, and interpreted by the response task. The buffer is * included to avoid pointer inaccuracy during queue copy operations. */ typedef struct ResponseItem { HTTPResponse_t xResponse; uint8_t ucResponseBuffer[ democonfigUSER_BUFFER_LENGTH ]; } ResponseItem_t;
メインの HTTP 送信タスク
メインのアプリケーションタスクの動作:
ホストアドレスの署名付き URL を解析して、Amazon S3 HTTP サーバーとの接続を確立します。
S3 バケット内のオブジェクトへのパスの署名付き URL を解析します。
サーバー認証と TLS を使用して Amazon S3 HTTP サーバーに接続します。
リクエストキューとレスポンスキューを作成します。
リクエストタスクとレスポンスタスクを作成します。
prvHTTPDemoTask()
関数でこのセットアップを行い、デモのステータスを返します。この関数のソースコードは、GitHub
prvDownloadLoop()
関数では、メインタスクがリクエストキューからのリクエストをブロックして待機します。リクエストを受信すると、API 関数 HTTPClient_Send()
を使用してリクエストを送信します。この API 関数が成功すると、レスポンスをレスポンスキューに配置します。
prvDownloadLoop()
のソースコードは、GitHub
HTTP リクエストタスク
リクエストタスクは prvRequestTask
関数で指定されます。この関数のソースコードは、GitHub
リクエストタスクは、Amazon S3 バケット内のファイルのサイズを取得します。これは prvGetS3ObjectFileSize
関数で実行されます。Amazon S3 へのこのリクエストには、レスポンスの送信後も接続を開いたままにするために「Connection: keep-alive」ヘッダーが追加されます。Amazon S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの Content-Range
ヘッダーフィールドに含まれています。206 Partial Content
レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。
prvGetS3ObjectFileSize
のソースコードは、GitHub
ファイルサイズを取得した後も、リクエストタスクはファイルの各範囲のリクエストを続けます。各範囲リクエストはリクエストキューに配置され、メインタスクによって送信されます。ファイル範囲は、デモユーザーがマクロ democonfigRANGE_REQUEST_LENGTH
で設定します。範囲リクエストは、HTTPClient_AddRangeHeader
関数を使用するときに HTTP クライアントライブラリ API でネイティブにサポートされます。prvRequestS3ObjectRange
関数は、HTTPClient_AddRangeHeader()
の使用方法を示します。
prvRequestS3ObjectRange
関数のソースコードは、GitHub
HTTP レスポンスタスク
レスポンスタスクは、ネットワーク経由で受信されたレスポンスのレスポンスキューで待ちます。メインタスクは、HTTP レスポンスを正常に受信するとレスポンスキューに配置します。このタスクは、ステータスコード、ヘッダー、および本文をログに記録してレスポンスを処理します。実世界のアプリケーションは、例えばレスポンス本体をフラッシュメモリに書き込んでレスポンスを処理できます。レスポンスステータスコードが 206 partial content
でない場合、このタスクはデモが失敗することをメインタスクに通知します。レスポンスタスクは prvResponseTask
関数で指定されます。この関数のソースコードは、GitHub