

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

# coreMQTT Mutual Authentication デモ
<a name="mqtt-demo-ma"></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="mqtt-demo-ma-introduction"></a>

coreMQTT Mutual Authentication デモプロジェクトでは、クライアントとサーバー間の相互認証で TLS を使用して MQTT ブローカーへの接続を確立する方法を説明します。このデモでは mbedTLS ベースのトランスポートインターフェイスの実装を使用して、サーバーとクライアント間の認証 TLS 接続を確立し、[QoS 1](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Toc442180914) レベルでの MQTT のサブスクライブおよび公開ワークフローについて説明します。トピックフィルターをサブスクライブし、フィルターに一致するトピックに公開し、QoS 1 レベルでサーバからそれらのメッセージを受信するまで待機します。ブローカーに公開し、ブローカーから同じメッセージを受信するこのサイクルは、無限に繰り返されます。このデモのメッセージは QoS 1 で送信され、MQTT 仕様に従って少なくとも 1 つの配信が保証されます。

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

## ソースコード
<a name="mqtt-demo-ma-source-code"></a>

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

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

デモでは、ブローカーに接続し、ブローカーのトピックをサブスクライブし、ブローカーのトピックに公開し、最後にブローカーから切断する方法を示す一連の例をループ処理する 1 つのアプリケーションタスクを作成します。デモアプリケーションは、同じトピックをサブスクライブし、公開します。デモが MQTT ブローカーにメッセージを公開するたびに、ブローカーは同じメッセージをデモアプリケーションに送り返します。

デモが正常に完了すると、次の図のような出力が生成されます。

![正常に完了した場合の MQTT デモ端末の出力](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coremqtt-mad-output.png)


 AWS IoT コンソールは、次のイメージのような出力を生成します。

![正常に完了した場合の MQTT デモコンソールの出力](http://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/images/coremqtt-mad-console.png)


## エクスポネンシャルバックオフとジッターを使用してロジックを再試行する
<a name="mqtt-demo-ma-retry-logic"></a>

[prvBackoffForRetry](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L671-L717) 関数は、TLS 接続や MQTT サブスクライブ要求など、サーバーでの失敗したネットワークオペレーションを、エクスポネンシャルバックオフとジッターでどのように再試行できるかを示します。この関数は次の再試行のバックオフ時間を計算し、再試行回数がまだ残っている場合にバックオフ遅延を実行します。バックオフ時間の計算には乱数の生成が必要なため、この関数は PKCS11 モジュールを使用して乱数を生成します。PKCS11 モジュールを使用すると、ベンダーのプラットフォームで真性乱数生成器 (TRNG) がサポートされている場合、真性乱数生成器にアクセスできます。接続再試行中のデバイスからの衝突の可能性を軽減するため、乱数生成器にデバイス固有のエントロピーソースをシードすることをお勧めします。

## MQTT ブローカーへの接続
<a name="mqtt-demo-ma-connecting"></a>

[prvConnectToServerWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L721-L782) 関数は、MQTT ブローカーへの相互認証された TLS 接続の確立を試みます。接続が失敗すると、バックオフ時間の後に再試行されます。バックオフ時間は最大試行回数に達するか、最大バックオフ時間に達するまで、指数関数的に増加します。`BackoffAlgorithm_GetNextBackoff` 関数は指数関数的に増加するバックオフ値を提供し、最大試行回数に達した場合に `RetryUtilsRetriesExhausted` を返します。`prvConnectToServerWithBackoffRetries` 関数は、設定された試行回数に達してもブローカーへの TLS 接続を確立できない場合に、失敗ステータスを返します。

[prvCreateMQTTConnectionWithBroker](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L785-L848) 関数は、クリーンセッションで MQTT ブローカーへの MQTT 接続を確立する方法を示します。これは TLS トランスポートインターフェイスを使用し、TLS トランスポートインターフェイスは `FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c` ファイルで実装されます。ブローカーのキープアライブ (秒) は `xConnectInfo` で設定することに注意してください。

次の関数は、TLS トランスポートインターフェイスと time 関数が `MQTT_Init` 関数を使って MQTT コンテキストでどのように設定されるかを示します。また、イベントコールバック関数ポインタ (`prvEventCallback`) の設定方法も表しています。このコールバックは、受信メッセージのレポートに使用されます。

## MQTT トピックのサブスクライブ
<a name="mqtt-demo-ma-subscribing"></a>

[prvMQTTSubscribeWithBackoffRetries](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L871-L969) 関数は、MQTT ブローカーのトピックフィルターをサブスクライブする方法を示しています。この例では、1 つのトピックフィルターをサブスクライブする方法について説明しますが、同じサブスクライブ API コールでトピックフィルターのリストを渡して、複数のトピックフィルターをサブスクラブすることも可能です。また、MQTT ブローカーがサブスクリプション要求を拒否した場合、`RETRY_MAX_ATTEMPTS` に関してサブスクリプションはエクスポネンシャルバックオフで再試行します。

## トピックへの公開
<a name="mqtt-demo-ma-publishing"></a>

[prvMQTTPublishToTopic](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L972-L1004) 関数は、MQTT ブローカーのトピックに公開する方法を示しています。

## 受信メッセージの受信
<a name="mqtt-demo-ma-receiving"></a>

アプリケーションは前述のように、ブローカーに接続する前にイベントコールバック関数を登録します。`prvMQTTDemoTask` 関数は `MQTT_ProcessLoop` 関数を呼び出して受信メッセージを受信します。受信 MQTT メッセージを受信すると、受信 MQTT メッセージはアプリケーションが登録したイベントコールバック関数を呼び出します。[prvEventCallback](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1139-L1154) 関数は、このようなイベントコールバック関数の一例です。`prvEventCallback` は受信パケットタイプを調べ、適切なハンドラを呼び出します。以下の例では、関数は受信した発行メッセージを処理する `prvMQTTProcessIncomingPublish()`、確認 (ACK) を処理する `prvMQTTProcessResponse()` のいずれかを呼び出します。

## 受信 MQTT 公開パケットの処理
<a name="mqtt-demo-ma-processing"></a>

[prvMQTTProcessIncomingPublish](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1108-L1135) 関数は、MQTT ブローカーから公開パケットを処理する方法を示しています。

## トピックからのサブスクリプションの解除
<a name="mqtt-demo-ma-unsubscribing"></a>

ワークフローの最後のステップは、ブローカーが `mqttexampleTOPIC` から発行されたメッセージを送信しないように、トピックのサブスクライブを解除することです。[prvMQTTUnsubscribeFromTopic](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1007-L1043) 関数の定義は次のとおりです。

## デモで使用するルート CA の変更
<a name="mqtt-demo-ma-root-ca"></a>

デフォルトでは、FreeRTOS デモは Amazon ルート CA 1 証明書 (RSA 2048 ビットキー) を使用して AWS IoT Core サーバーで認証します。Amazon Root CA 3 証明書 (ECC 256 ビットキー) など、他の[サーバー認証用の CA 証明書](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html#server-authentication-certs)も使用できます。coreMQTT Mutual Authentication デモのルート CA を変更するには、次の手順を実行します。

1. テキストエディタで、`{{freertos}}/vendors/{{vendor}}/boards/{{board}}/aws_demos/config_files/mqtt_demo_mutual_auth_config.h` ファイルを開きます。

1. ファイルで、次の行を見つけます。

   ```
    * #define democonfigROOT_CA_PEM    "...insert here..." 
   ```

   この行のコメントを解除し、必要に応じてコメントブロックの末尾 ` */` まで移動させます。

1. 使用する CA 証明書をコピーし、`"...insert here..."` テキストに貼り付けます。結果は次の例のようになります。

   ```
   #define democonfigROOT_CA_PEM   "-----BEGIN CERTIFICATE-----\n"\
   "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\
   "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\
   "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\
   "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\
   "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\
   "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\
   "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\
   "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\
   "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\
   "YyRIHN8wfdVoOw==\n"\
   "-----END CERTIFICATE-----\n"
   ```

1. (オプション) 他のデモのルート CA を変更できます。`{{freertos}}/vendors/{{vendor}}/boards/{{board}}/aws_demos/config_files/{{demo-name}}_config.h` ファイルごとに、ステップ 1〜3 を繰り返します。