coreHTTP 基本マルチスレッドのデモ - 無料RTOS

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

coreHTTP 基本マルチスレッドのデモ

重要

このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、ここから始めることをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「Amazon-FreeRTOS Github リポジトリ移行ガイド」を参照してください。

序章

このデモでは、FreeRTOS のスレッドセーフキューを使用して、処理を待機しているリクエストとレスポンスを保持します。このデモでは、3 つのタスクに注目してください。

  • メインタスクは、リクエストがリクエストキューに表示されるのを待ちます。表示されたリクエストをネットワーク経由で送信し、レスポンスをレスポンスキューに配置します。

  • リクエストタスクは、サーバーに送信する HTTP ライブラリリクエストオブジェクトを作成し、リクエストキューに配置します。各リクエストオブジェクトには、アプリケーションにダウンロードするように設定されている S3 ファイルのバイト範囲を指定します。

  • レスポンスタスクは、レスポンスがレスポンスキューに表示されるのを待ちます。受信したすべてのレスポンスをログに記録します。

この基本マルチスレッドのデモは、サーバー認証のみを使用する TLS 接続を使用するように設定されています。これは Amazon S3 HTTP サーバーの要件です。アプリケーションレイヤー認証は、署名付き URL クエリ署名バージョン 4 パラメータを使用して実行されます。

ソースコードの編成

デモプロジェクトの名前は http_demo_s3_download_multithreaded.cで、 freertos/demos/coreHTTP/ ディレクトリと GitHubウェブサイトにあります。

デモプロジェクトを構築する

このデモプロジェクトでは、Visual Studio の無料のコミュニティエディションを使用します。次の手順でデモを構築します。

  1. Visual Studio IDE 内から mqtt_multitask_demo.sln Visual Studio ソリューションファイルを開きます。

  2. IDE の [Build] (構築) メニューから [Build Solution] (ソリューションの構築) を選択します。

注記

Microsoft Visual Studio 2017 以前を使用している場合は、お使いのバージョンと互換性があるプラットフォームツールセットを選択する必要があります ([Project] (プロジェクト) -> [RTOSDemos Properties] (RTOSDemos プロパティ) -> [Platform Toolset] (プラットフォームツールセット) )。

デモプロジェクトを設定する

このデモでは、FreeRTOS+TCP TCP/IP スタックを使用します。TCP/IP スタータープロジェクトの指示に従って、次の手順を実行します。

Amazon S3 HTTP サーバー接続の設定

coreHTTP 基本ダウンロードのデモの Amazon S3 HTTP サーバー接続の設定 の指示に従います。

機能

このデモでは、合計 3 つのタスクを作成します。

  • リクエストを送信し、ネットワーク経由でレスポンスを受信するタスク。

  • 送信するリクエストを作成するタスク。

  • 受信したレスポンスを処理するタスク。

このデモのメインタスクの動作:

  1. リクエストキューとレスポンスキューを作成します。

  2. サーバーへの接続を作成します。

  3. リクエストタスクとレスポンスタスクを作成します。

  4. リクエストキューがネットワーク経由でリクエストを送信するのを待ちます。

  5. ネットワーク経由で受信したレスポンスをレスポンスキューに配置します。

リクエストタスクの動作:

  1. 各範囲リクエストを作成します。

レスポンスタスクの動作:

  1. 受信した各レスポンスを処理します。

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 送信タスク

メインのアプリケーションタスクの動作:

  1. ホストアドレスの署名付き URL を解析して、Amazon S3 HTTP サーバーとの接続を確立します。

  2. S3 バケット内のオブジェクトへのパスの署名付き URL を解析します。

  3. サーバー認証と TLS を使用して Amazon S3 HTTP サーバーに接続します。

  4. リクエストキューとレスポンスキューを作成します。

  5. リクエストタスクとレスポンスタスクを作成します。

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 に記載されています。