

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

# coreHTTP のデモ
<a name="core-http-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

これらのデモは、coreHTTP ライブラリの使い方を学習するのに役立ちます。

**Topics**
+ [coreHTTP 相互認証のデモ](core-http-ma-demo.md)
+ [coreHTTP 基本 Amazon S3 アップロードのデモ](core-http-s3-upload-demo.md)
+ [coreHTTP 基本 S3 ダウンロードのデモ](core-http-s3-download-demo.md)
+ [coreHTTP 基本マルチスレッドのデモ](core-http-bmt-demo.md)

# coreHTTP 相互認証のデモ
<a name="core-http-ma-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-ma-demo-intro"></a>

coreHTTP (相互認証) デモプロジェクトでは、クライアントとサーバー間で TLS と相互認証を使用して HTTP サーバーへの接続を確立する方法を示します。このデモでは、mbedTLS ベースのトランスポートインターフェイス実装を使用して、サーバーおよびクライアントに認証された TLS 接続を確立します。また、HTTP でのリクエストレスポンスワークフローを示します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

## 機能
<a name="core-http-ma-demo-functionality"></a>

このデモでは、以下のステップを実行する方法を示す単一のアプリケーションタスクと例を作成します。
+  AWS IoT エンドポイントの HTTP サーバーに接続します。
+ POST リクエストを送信する。
+ レスポンスを受信する。
+ サーバーから切断する。

これらのステップを完了すると、このデモによって以下のスクリーンショットのような出力が生成されます。

![\[AWS IoT デモの初期化、TLS セッション確立、HTTP POST リクエスト、デモが正常に完了したことを示すメモリメトリクスを示すログ出力。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coreHTTP.output.png)


 AWS IoT コンソールは、次のスクリーンショットのような出力を生成します。

![\[AWS IoT 2020 年 11 月 20 日 19:09:09 UTC にトピックに発行された AWS IoT 「コンソールからこんにちは」メッセージを示す コンソール。\]](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coreHTTP.console.png)


## ソースコードの編成
<a name="core-http-s3-ma-demo-source-code-organization"></a>

デモソースファイルの名前は `http_demo_mutual_auth.c` です。このファイルは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_mutual_auth.c) ウェブサイトにあります。

## HTTP AWS IoT サーバーへの接続
<a name="core-http-ma-demo-connecting"></a>

[ connectToServerWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は、HTTP サーバーへの相互認証された TLS AWS IoT 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`RetryUtils_BackoffAndSleep` 関数は、指数関数的に増加するタイムアウト値を提供し、最大試行回数に達したときに `RetryUtilsRetriesExhausted` を返します。`connectToServerWithBackoffRetries` 関数は、設定された試行回数に達してもブローカーへの TLS 接続を確立できない場合に、失敗ステータスを返します。

## HTTP リクエストの送信とレスポンスの受信
<a name="core-http-ma-demo-send-receive"></a>

[ prvSendHttpRequest](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_mutual_auth.c#L402-L507) 関数は、POST リクエストを HTTP AWS IoT サーバーに送信する方法を示します。で REST API にリクエストを行う方法の詳細については AWS IoT、[「デバイス通信プロトコル - HTTPS](https://docs.aws.amazon.com/iot/latest/developerguide/http.html)」を参照してください。レスポンスは、同じ coreHTTP API 呼び出しである `HTTPClient_Send` で受信されます。

# coreHTTP 基本 Amazon S3 アップロードのデモ
<a name="core-http-s3-upload-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-s3-upload-demo-intro"></a>

この例では、Amazon Simple Storage Service (Amazon S3) HTTP サーバーに PUT リクエストを送信し、小さなファイルをアップロードする方法を示します。また、アップロード後に GET リクエストを実行して、ファイルのサイズを確認します。この例で使用する[ネットワークトランスポートインターフェイス](https://freertos.org/network-interface.html)は、mbedTLS を使用して、coreHTTP を実行する IoT デバイスクライアントと Amazon S3 HTTP サーバー間に相互認証された接続を確立します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

### シングルスレッドとマルチスレッド
<a name="core-http-s3-upload-demo-threads"></a>

coreHTTP には、シングルスレッドとマルチスレッド (マルチタスク) の 2 つの使用モデルがあります。****このデモは、このセクションでは 1 つのスレッドで HTTP ライブラリを実行しますが、実際にはシングルスレッド環境で coreHTTP を使用する方法を示しています。このデモでは、1 つのタスクのみが HTTP API を使用します。シングルスレッドアプリケーションは HTTP ライブラリを繰り返し呼び出す必要がありますが、マルチスレッドアプリケーションは、代わりにエージェント (またはデーモン) タスク内でバックグラウンドで HTTP リクエストを送信できます。

## ソースコードの編成
<a name="core-http-s3-upload-demo-source-code-organization"></a>

デモソースファイルの名前は `http_demo_s3_upload.c` です。このファイルは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c) ウェブサイトにあります。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-s3-upload-demo-configure-server"></a>

このデモでは、署名付き URL を使用して Amazon S3 HTTP サーバーに接続し、ダウンロードするオブジェクトへのアクセスを許可します。Amazon S3 HTTP サーバーの TLS 接続では、サーバー認証のみが使用されます。アプリケーションレベルでは、オブジェクトへのアクセスは、署名付き URL クエリのパラメータを使用して認証されます。以下のステップに従って、 AWSへの接続を設定します。

1.  AWS アカウントをセットアップします。

   1. まだ作成していない場合は、 [AWS アカウントを作成します](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)。

   1. アカウントとアクセス許可は AWS Identity and Access Management (IAM) を使用して設定されます。IAM は、アカウント内の各ユーザーのアクセス権限の管理に使用します。デフォルトでは、ルート所有者によって付与されるまで、ユーザーにはアクセス権限がありません。

      1.  AWS アカウントにユーザーを追加するには、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/)を参照してください。

      1. このポリシー AWS IoT を追加して、FreeRTOS および にアクセスするアクセス許可を AWS アカウントに付与します。
         + AmazonS3FullAccess

1. *Amazon Simple Storage Service ユーザーガイド*の [S3 バケットを作成する方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)に従って、Amazon S3 にバケットを作成します。

1. [S3 バケットにファイルとフォルダをアップロードする方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)のステップに従って、Amazon S3 にファイルをアップロードします。

1. `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` ファイルを参照してください。

## 機能
<a name="core-http-s3-upload-demo-functionality"></a>

このデモでは、まず TLS サーバー認証を使用して Amazon S3 HTTP サーバーに接続します。次に、HTTP リクエストを作成して、`democonfigDEMO_HTTP_UPLOAD_DATA` に指定されているデータをアップロードします。ファイルをアップロードした後、ファイルのサイズをリクエストして、ファイルが正常にアップロードされたことを確認します。デモのソースコードは [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c) ウェブサイトに記載されています。

### Amazon S3 HTTP サーバーに接続する
<a name="core-http-s3-upload-demo-connecting"></a>

[connectToServerWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は HTTP サーバーへの TCP 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`connectToServerWithBackoffRetries` 関数は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。

`prvConnectToServer` 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、`FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c` ファイルで実装されている mbedTLS ベースのインターフェイスを使用します。`prvConnectToServer` の定義は、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c#L306-L366) ウェブサイトに記載されています。

### データをアップロードする
<a name="core-http-s3-upload-demo-upload-data"></a>

`prvUploadS3ObjectFile` 関数は、PUT リクエストの作成方法とアップロードするファイルの指定方法を示します。ファイルのアップロード先の Amazon S3 バケットと、アップロードするファイルの名前は、署名付き URL に指定されます。メモリを節約するために、リクエストヘッダーとレスポンスの受信の両方に同じバッファが使用されます。レスポンスは、`HTTPClient_Send` API 関数を使用して同期的に受信されます。`200 OK` レスポンスステータスコードが Amazon S3 HTTP サーバーから返されることが想定されます。その他のステータスコードはエラーです。

`prvUploadS3ObjectFile()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c#L539-L632) ウェブサイトに記載されています。

### アップロードを検証する
<a name="core-http-s3-upload-demo-verifying-data"></a>

`prvVerifyS3ObjectFileSize` 関数は、`prvGetS3ObjectFileSize` を呼び出して S3 バケットのオブジェクトのサイズを取得します。Amazon S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの `Content-Range` ヘッダーフィールドに含まれています。`206 Partial Content` レスポンスがサーバーから返されることが想定されます。その他のレスポンスステータスコードはエラーです。

`prvGetS3ObjectFileSize()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_upload.c#L370-L535) ウェブサイトに記載されています。

# coreHTTP 基本 S3 ダウンロードのデモ
<a name="core-http-s3-download-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-s3-download-demo-intro"></a>

このデモでは、[範囲リクエスト](https://tools.ietf.org/html/rfc7233)を使用して Amazon S3 HTTP サーバーからファイルをダウンロードする方法を示します。範囲リクエストは、`HTTPClient_AddRangeHeader` を使用して HTTP リクエストを作成するときに coreHTTP API でネイティブにサポートされます。マイクロコントローラ環境では、範囲リクエストを使用することを強くお勧めします。単一のリクエストはなく、個別の複数の範囲リクエストで大きなファイルをダウンロードすることで、ネットワークソケットをブロックすることなくファイルの各セクションを処理できます。範囲リクエストを使用すると、パケットがドロップされて TCP 接続での再送が必要になるリスクが低くなるため、デバイスの消費電力が改善されます。

この例で使用する[ネットワークトランスポートインターフェイス](https://freertos.org/network-interface.html)は、mbedTLS を使用して、coreHTTP を実行する IoT デバイスクライアントと Amazon S3 HTTP サーバー間に相互認証された接続を確立します。

**注記**  
FreeRTOS デモをセットアップして実行するには、[FreeRTOS の開始方法](freertos-getting-started.md) の手順に従います。

### シングルスレッドとマルチスレッド
<a name="core-http-s3-download-demo-threads"></a>

coreHTTP には、シングルスレッドとマルチスレッド (マルチタスク) の 2 つの使用モデルがあります。****このデモは、このセクションでは 1 つのスレッドで HTTP ライブラリを実行しますが、実際にはシングルスレッド環境で coreHTTP を使用する方法を示しています (このデモでは、1 つのタスクのみが HTTP API を使用します)。シングルスレッドアプリケーションは HTTP ライブラリを繰り返し呼び出す必要がありますが、マルチスレッドアプリケーションは、代わりにエージェント (またはデーモン) タスク内でバックグラウンドで HTTP リクエストを送信できます。

## ソースコードの編成
<a name="core-http-s3-download-demo-source-code"></a>

デモプロジェクトの名前は `http_demo_s3_download.c` です。このプロジェクトは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c) ウェブサイトにあります。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-s3-download-demo-configure-server"></a>

このデモでは、署名付き URL を使用して Amazon S3 HTTP サーバーに接続し、ダウンロードするオブジェクトへのアクセスを許可します。Amazon S3 HTTP サーバーの TLS 接続では、サーバー認証のみが使用されます。アプリケーションレベルでは、オブジェクトへのアクセスは、署名付き URL クエリのパラメータを使用して認証されます。以下のステップに従って、 AWSへの接続を設定します。

1.  AWS アカウントをセットアップします。

   1. まだ作成していない場合は、[AWS アカウントを作成してアクティブ化します](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)。

   1. アカウントとアクセス許可は AWS Identity and Access Management (IAM) を使用して設定されます。IAM では、アカウント内の各ユーザーのアクセス権限を管理できます。デフォルトでは、ルート所有者によって付与されるまで、ユーザーにはアクセス権限がありません。

      1.  AWS アカウントにユーザーを追加するには、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/)を参照してください。

      1. これらのポリシー AWS IoT を追加して、FreeRTOS および にアクセスするためのアクセス許可を AWS アカウントに付与します。
         + AmazonS3FullAccess

1. Amazon Simple Storage Service Console ユーザーガイドの [S3 バケットを作成する方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)に従って、S3 にバケットを作成します。**

1. [S3 バケットにファイルとフォルダをアップロードする方法](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)のステップに従って、S3 にファイルをアップロードします。

1. `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`」を参照してください。

## 機能
<a name="core-http-s3-download-demo-functionality"></a>

このデモは、まずファイルのサイズを取得します。次に、各バイト範囲をループ内で順番にリクエストします。範囲サイズは `democonfigRANGE_REQUEST_LENGTH` で指定します。

デモのソースコードは [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c) ウェブサイトに記載されています。

### Amazon S3 HTTP サーバーに接続する
<a name="core-http-s3-download-demo-connecting"></a>

[connectToServerWithBackoffRetries()](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) 関数は HTTP サーバへの TCP 接続を試みます。接続が失敗すると、タイムアウト後に接続を再試行します。タイムアウト値は、最大試行回数に達するか、最大タイムアウト値に達するまで、指数関数的に増加します。`connectToServerWithBackoffRetries()` は、設定された試行回数に達してもサーバーへの TCP 接続を確立できない場合に、失敗ステータスを返します。

`prvConnectToServer()` 関数は、サーバー認証のみを使用して Amazon S3 HTTP サーバーへの接続を確立する方法を示します。この関数は、[FreeRTOS-Plus/Source/Application-Protocols/network\$1transport/freertos\$1plus\$1tcp/using\$1mbedtls/using\$1mbedtls.c](https://github.com/FreeRTOS/FreeRTOS/blob/202012.00/FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c) ファイルに実装されている mbedTLS ベースのトランスポートインターフェイスを使用します。

`prvConnectToServer()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L273-L333) に記載されています。

### 範囲リクエストを作成する
<a name="core-http-s3-download-demo-creating-range-request"></a>

`HTTPClient_AddRangeHeader()` API 関数は、バイト範囲を HTTP リクエストヘッダーにシリアル化して、範囲リクエストを形成することをサポートします。このデモでは、範囲リクエストを使用して、ファイルサイズを取得し、ファイルの各セクションをリクエストします。

`prvGetS3ObjectFileSize()` 関数は、S3 バケットのファイルのサイズを取得します。Amazon S3 へのこの最初のリクエストには、レスポンスの送信後も接続を開いたままにするために `Connection: keep-alive` ヘッダーが追加されます。S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの `Content-Range` ヘッダーフィールドに含まれています。`206 Partial Content` レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。

`prvGetS3ObjectFileSize()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L337-L502) に記載されています。

このデモは、ファイルサイズを取得した後、ダウンロードするファイルのバイト範囲ごとに新しい範囲リクエストを作成します。ファイルの各セクションについて `HTTPClient_AddRangeHeader()` を使用します。

### 範囲リクエストの送信とレスポンスの受信
<a name="core-http-s3-download-demo-send-request"></a>

`prvDownloadS3ObjectFile()` 関数は、ファイル全体がダウンロードされるまで、範囲リクエストをループ内で送信します。`HTTPClient_Send()` API 関数は、リクエストの送信とレスポンスの受信を同期的に行います。関数からのレスポンスは `xResponse` で受信されます。その後、ステータスコードが `206 Partial Content` であることが検証され、これまでにダウンロードされたバイト数の増加が `Content-Length` ヘッダー値で表されます。

`prvDownloadS3ObjectFile()` のソースコードは、[GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L506-L651) に記載されています。

# coreHTTP 基本マルチスレッドのデモ
<a name="core-http-bmt-demo"></a>

**重要**  <a name="deprecation-message-demo"></a>
このデモは、非推奨の Amazon-FreeRTOS リポジトリでホストされています。新しいプロジェクトを作成するときは、[ここから始める](freertos-getting-started-modular.md)ことをお勧めします。現在非推奨の Amazon-FreeRTOS リポジトリをベースにした既存の FreeRTOS プロジェクトが既にある場合は、「[Amazon FreeRTOS Github リポジトリ移行ガイド](github-repo-migration.md)」を参照してください。

## 序章
<a name="core-http-bmt-demo-intro"></a>

このデモでは、[FreeRTOS のスレッドセーフキュー](https://freertos.org/a00018.html)を使用して、処理を待機しているリクエストとレスポンスを保持します。このデモでは、3 つのタスクに注目してください。
+ メインタスクは、リクエストがリクエストキューに表示されるのを待ちます。表示されたリクエストをネットワーク経由で送信し、レスポンスをレスポンスキューに配置します。
+ リクエストタスクは、サーバーに送信する HTTP ライブラリリクエストオブジェクトを作成し、リクエストキューに配置します。各リクエストオブジェクトには、アプリケーションにダウンロードするように設定されている S3 ファイルのバイト範囲を指定します。
+ レスポンスタスクは、レスポンスがレスポンスキューに表示されるのを待ちます。受信したすべてのレスポンスをログに記録します。

この基本マルチスレッドのデモは、サーバー認証のみを使用する TLS 接続を使用するように設定されています。これは Amazon S3 HTTP サーバーの要件です。アプリケーションレイヤー認証は、[署名付き URL クエリ](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html)の[署名バージョン 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) パラメータを使用して実行されます。

## ソースコードの編成
<a name="core-http-bmt-demo-source"></a>

デモプロジェクトの名前は `http_demo_s3_download_multithreaded.c` です。このプロジェクトは、`freertos/demos/coreHTTP/` ディレクトリと [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download_multithreaded.c) ウェブサイトにあります。

## デモプロジェクトを構築する
<a name="core-http-bmt-demo-building"></a>

このデモプロジェクトでは、[Visual Studio の無料のコミュニティエディション](https://visualstudio.microsoft.com/vs/community/)を使用します。次の手順でデモを構築します。

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

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

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

## デモプロジェクトを設定する
<a name="core-http-bmt-demo-configuring"></a>

このデモでは、[FreeRTOS\$1TCP TCP/IP スタック](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html)を使用します。[TCP/IP スタータープロジェクト](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html)の指示に従って、次の手順を実行します。

1. [前提条件コンポーネント](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#prerequisites) (WinPCap など) をインストールします。

1. オプションで[静的または動的 IP アドレス、ゲートウェイアドレス、ネットマスクを設定します](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#static-dynamic)。

1. オプションで [MAC アドレスを設定します](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#mac-addr)。

1. ホストマシンの[イーサネットネットワークインターフェイスを選択します](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#network-interface)。

1. **重要**: HTTP デモを実行する前に[ネットワーク接続をテストします](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html#connectivity-test)。

## Amazon S3 HTTP サーバー接続の設定
<a name="core-http-bmt-demo-configuring-connection"></a>

coreHTTP 基本ダウンロードのデモの [Amazon S3 HTTP サーバー接続の設定](core-http-s3-download-demo.md#core-http-s3-download-demo-configure-server) の指示に従います。**

## 機能
<a name="core-http-bmt-demo-functionality"></a>

このデモでは、合計 3 つのタスクを作成します。
+ リクエストを送信し、ネットワーク経由でレスポンスを受信するタスク。
+ 送信するリクエストを作成するタスク。
+ 受信したレスポンスを処理するタスク。

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

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

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

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

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

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

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

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

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

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

## Typedefs
<a name="core-http-bmt-demo-typedefs"></a>

このデモでは、マルチスレッドをサポートするために次の構造を定義しています。

**リクエスト項目**

次の構造で、リクエストキューに配置するリクエスト項目を定義します。リクエスト項目は、リクエストタスクが 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 送信タスク
<a name="core-http-bmt-demo-main-task"></a>

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

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

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

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

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

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

`prvHTTPDemoTask()` 関数でこのセットアップを行い、デモのステータスを返します。この関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L451-L650) に記載されています。

`prvDownloadLoop()` 関数では、メインタスクがリクエストキューからのリクエストをブロックして待機します。リクエストを受信すると、API 関数 `HTTPClient_Send()` を使用してリクエストを送信します。この API 関数が成功すると、レスポンスをレスポンスキューに配置します。

`prvDownloadLoop()` のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L1071-L1174) に記載されています。

## HTTP リクエストタスク
<a name="core-http-bmt-demo-request-task"></a>

リクエストタスクは `prvRequestTask` 関数で指定されます。この関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L778-L876) に記載されています。

リクエストタスクは、Amazon S3 バケット内のファイルのサイズを取得します。これは `prvGetS3ObjectFileSize` 関数で実行されます。Amazon S3 へのこのリクエストには、レスポンスの送信後も接続を開いたままにするために「Connection: keep-alive」ヘッダーが追加されます。Amazon S3 HTTP サーバーは、現在署名付き URL を使用した HEAD リクエストをサポートしていないため、0 番目のバイトがリクエストされます。ファイルのサイズは、レスポンスの `Content-Range` ヘッダーフィールドに含まれています。`206 Partial Content` レスポンスがサーバーから返されることが想定されます。受信するその他のレスポンスステータスコードはエラーです。

`prvGetS3ObjectFileSize` のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L757-L774) に記載されています。

ファイルサイズを取得した後も、リクエストタスクはファイルの各範囲のリクエストを続けます。各範囲リクエストはリクエストキューに配置され、メインタスクによって送信されます。ファイル範囲は、デモユーザーがマクロ `democonfigRANGE_REQUEST_LENGTH` で設定します。範囲リクエストは、`HTTPClient_AddRangeHeader` 関数を使用するときに HTTP クライアントライブラリ API でネイティブにサポートされます。`prvRequestS3ObjectRange` 関数は、`HTTPClient_AddRangeHeader()` の使用方法を示します。

`prvRequestS3ObjectRange` 関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L694-L753) に記載されています。

## HTTP レスポンスタスク
<a name="core-http-bmt-demo-response-task"></a>

レスポンスタスクは、ネットワーク経由で受信されたレスポンスのレスポンスキューで待ちます。メインタスクは、HTTP レスポンスを正常に受信するとレスポンスキューに配置します。このタスクは、ステータスコード、ヘッダー、および本文をログに記録してレスポンスを処理します。実世界のアプリケーションは、例えばレスポンス本体をフラッシュメモリに書き込んでレスポンスを処理できます。レスポンスステータスコードが `206 partial content` でない場合、このタスクはデモが失敗することをメインタスクに通知します。レスポンスタスクは `prvResponseTask` 関数で指定されます。この関数のソースコードは、[GitHub](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/HTTP_S3_Download_Multithreaded/DemoTasks/S3DownloadMultithreadedHTTPExample.c#L961-L1047) に記載されています。