AWS IoT Device Defender デモ - FreeRTOS

AWS IoT Device Defender デモ

重要

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

序章

このデモでは、AWS IoT Device Defender に接続している AWS IoT Device Defender ライブラリの使用方法を示します。デモでは、coreMQTT ライブラリを使用して、AWS IoT MQTT ブローカーおよび coreJSON ライブラリとの TLS 経由の MQTT 接続 (相互認証) を確立し、AWS IoT Device Defender サービスから受信した応答を検証して解析します。デモでは、デバイスから収集されたメトリクスを使用して JSON 形式のレポートを作成する方法と、作成したレポートを AWS IoT Device Defender サービスに送信する方法を示します。デモでは、コールバック関数を coreMQTT ライブラリに登録して、AWS IoT Device Defender サービスからの応答を処理し、送信されたレポートが受け入れられたか拒否されたかを確認します。

注記

FreeRTOS デモをセットアップして実行するには、FreeRTOS の開始方法 の手順に従います。

機能

このデモでは、1 つのアプリケーションタスクを作成して、メトリクスを収集し、Device Defender レポートを JSON 形式で作成し、AWS IoT MQTT ブローカーへのセキュアな MQTT 接続を介して AWS IoT Device Defender サービスにレポートを送信する方法を説明します。デモには、標準のネットワークメトリクスとカスタムメトリクスが含まれています。カスタムメトリクスの場合、デモには以下が含まれます。

  • FreeRTOS タスク ID のリストを示す「task_numbers」というメトリクス。このメトリクスのタイプは「数値のリスト」です。

  • デモアプリケーションタスクのスタックハイウォーターマークを示す「stack_high_water_mark」というメトリクス。このメトリクスのタイプは「数値」です。

ネットワークメトリクスの収集方法は、使用している TCP/IP スタックによって異なります。FreeRTOS+TCP およびサポートされている lwIP 設定には、デバイスから実際のメトリクスを収集して AWS IoT Device Defender レポートでメトリクスを送信する、メトリクス収集の実装を提供しています。GitHub から、FreeRTOS+TCPlwIP の実装を入手できます。

他の TCP/IP スタックを使用するボード向けに、すべてのネットワークメトリクスに対してゼロを返すメトリック収集関数のスタブ定義を提供しています。freertos/demos/device_defender_for_aws/metrics_collector/stub/metrics_collector.c で機能を実装し、ネットワークスタックが実際のメトリクスを送信するようにしてください。このファイルも GitHub ウェブサイトから入手できます。

ESP32 の場合、デフォルトの lwIP 設定はコアロックを使用しないため、デモではスタブメトリクスが使用されます。参照 lwIP メトリクス収集の実装を使用する場合は、lwiopts.h に次のマクロを定義します。

#define LINK_SPEED_OF_YOUR_NETIF_IN_BPS 0 #define LWIP_TCPIP_CORE_LOCKING 1 #define LWIP_STATS 1 #define MIB2_STATS 1

以下に、デモを実行したときの出力例を示します。

コンソールログ出力で DemoThing アプリケーションの MQTT 接続、発行、メモリ使用量イベントを示します。

ボードが FreeRTOS+TCP またはサポートされている lwIP 設定を使用していない場合、出力は次のようになります。

ログメッセージで、デモアプリケーションの MQTT 接続確立、トピックサブスクリプション試行、ペイロードの発行、パケット処理を示します。

デモのソースコードは、freertos/demos/device_defender_for_aws/ ディレクトリのダウンロード内、または GitHub ウェブサイトにあります。

AWS IoT Device Defender トピックをサブスクライブする

subscribeToDefenderTopics 関数は、MQTT トピックをサブスクライブして、発行された Device Defender レポートに対する応答を受信します。ここでは、マクロ DEFENDER_API_JSON_ACCEPTED を使用して、受け入れた Device Defender レポートの応答を受信するトピック文字列を作成します。ここでは、マクロ DEFENDER_API_JSON_REJECTED を使用して、拒否した Device Defender レポートの応答を受信するトピック文字列を作成します。

デバイスメトリクスを収集する

collectDeviceMetrics 関数は、metrics_collector.h で定義されている関数を使用してネットワークメトリクスを収集します。送受信されたバイト数とパケット数、開いている TCP ポート、開いている UDP ポート、確立された TCP 接続に関するメトリクスが収集されます。

AWS IoT Device Defender レポートを生成する

generateDeviceMetricsReport 関数は、report_builder.h で定義されている関数を使用して Device Defender レポートを生成します。この関数は、ネットワークメトリックとバッファを取得し、AWS IoT Device Defender が要求する形式の JSON ドキュメントを作成し、指定されたバッファに書き込みます。AWS IoT Device Defender が想定している JSON ドキュメントの形式は、AWS IoT 開発者ガイドのデバイス側のメトリクスに記載されています。

AWS IoT Device Defender レポートを発行する

AWS IoT Device Defender レポートは、JSON AWS IoT Device Defender レポート発行用の MQTT トピック上に発行されます。レポートは、GitHub ウェブサイトのこのコードスニペットに示したように、マクロ DEFENDER_API_JSON_PUBLISH を使用して作成されます。

応答を処理するコールバック

publishCallback 関数は、受信する MQTT 発行メッセージを処理します。Defender_MatchTopic ライブラリの AWS IoT Device Defender API を使用して、受信した MQTT メッセージが AWS IoT Device Defender サービスからのものかどうかを確認します。メッセージが AWS IoT Device Defender サービスのものである場合は、受信した JSON レスポンスを解析し、レスポンス内のレポート ID を抽出します。その後、レポート ID は、レポート内に送信されたものと同じかどうか検証されます。