Azure Sphere デバイスのデバッグ出力の取得

IoT ソリューションを開発するときは、多くの場合、デバイスからの出力をデバッグするためのアクセス権が必要です。 これは、Visual Studio/Code ( へのデバッグ接続を介して実現できますが>コマンド ラインから実現することもできますが、Visual Studio/Code に接続されていないデバイスのデバッグ出力を表示する必要がある場合もあります。 このようなデバイスは、長期的なテストを実行しているか、場合によっては運用環境に展開されている可能性があります。 デバッグ データにアクセスするには、いくつかのオプションがあります。

  • 開発用 PC に接続されているデバイスからデバッグ出力を取得する
  • 開発用 PC に接続されていないデバイスのデバッグ出力の取得
  • 外部ストレージへのログ記録
  • Azureへのログ記録

開発用 PC に接続されているデバイスからデバッグ出力を取得する

Problem: Visual Studio/Visual Code を使用してデバッグするときにデバッグ出力を取得する方法

オプション:

  • 高度なアプリケーション

    Azure Sphereの高度なアプリケーションでは、Log_Debug API を使用して、デバッグ中に、printf スタイルの書式設定を使用してデバッグ出力を接続された PC に送信できます。 この出力は、Visual Studio または Visual Studio Code デバッグ ウィンドウ、またはコマンド ラインからを使用して表示できます。

    アプリケーションでデバッグ詳細度フラグを設定し、CMake コンパイル定義を使用して、アプリケーションの実行時に表示されるデバッグ出力の量を制御することを検討してください。 CMakeLists.txt ファイルでは、コンパイル時の定義を作成できます。

    add_compile_definitions(DEBUG_FLAG)

    高度なアプリケーション コードでは、次のように、 #ifdefを使用して、アプリケーションによって表示されるデバッグ出力の量を増減できます。

    #ifdef DEBUG_FLAG
        Log_Debug("My Message\n");
    #endif
  • リアルタイム対応アプリケーション

    Azure Sphereリアルタイム対応アプリケーション (M4 コアのいずれかで実行) は、デバッグ/ログ情報を dedicated M4 送信専用 UART に書き込むことができます。 これには、 FTDI Friend などの USB/シリアル アダプターと ターミナル エミュレーターが必要です。

    Azure Sphere Hello World サンプルは、M4 デバッグ UART に出力する方法を示しています。

    CodeThink と MediaTek から使用できるサンプル アプリケーションもあります。

    デバッグ フラグコンパイル時の定義は、リアルタイム対応 (M4) アプリケーションでも使用できます。

  • コア間通信を使用してリアルタイム対応アプリケーションから高度なアプリケーションに状態を送信する

    高度なリアルタイム対応アプリケーションを組み合わせたシステムを構築する場合は、上位レベルのアプリケーションを使用して、両方のアプリケーションのシステム状態をログに記録することができます。 これにはコア間通信を使用できます。Azure Sphereコア間通信サンプルは、高レベルおよびリアルタイム対応アプリケーション間でメッセージを渡すためのシンプルなインターフェイスを実装しています。

    このAzure Sphere学習モジュールでは、コア間メッセージング モデルと組み合わせてAzure SphereとAzure RTOSを使用して、コア間でカスタム メッセージを渡す方法を示します。

開発用 PC に接続されていないデバイスのデバッグ出力の取得

問題: デバイスが開発用 PC に接続されていない場合にデバッグ出力をログに記録する方法

オプション:

  • ネットワークまたは UART 経由でデバッグ出力を送信する

    デバイスが開発用 PC に接続されているときにデバッグ ログ情報を取得するのは非常に簡単です。 ただし、デバイスが PC に接続されていない場合は、デバッグ/ログ情報を収集することもできます。 たとえば、一連のデバイスで長期的なテストが実行されている場合があります。

    デバイスがネットワークに接続されている場合は、情報を収集して分析できるアプリケーションに、ネットワーク経由でデバッグ出力を送信できます。 このAzure Sphere ギャラリー アプリケーションは、UDP ソケット経由でその出力を送受信する既定のLog_Debug動作をオーバーライドする方法を示しています。

    既定の high-evel アプリケーションの Log_Debug 動作をオーバーライドするために使用するメカニズムは、デバッグ ログ情報を別の場所に送信するためにも使用できます。たとえば、Azure Sphere の UART のいずれかにデータを出力できます。 このUART サンプルを UDPDebugLog ギャラリー アプリケーションと組み合わせて UART にメッセージを記録するための参照として使用できます。

  • デバッグ出力を Azure IoT Hub/Azure IoT Central

    出力のデバッグは問題が発生したときに診断するのに役立ちますが、後処理のためにデバイスからのテレメトリ/ログ情報を格納する場合にも役立ちます。

    Azure IoT Hub または Azure IoT Central のインスタンスを設定すると、ビジネス ロジックの一部として使用できるデバイステレメトリ データを送信するエンドポイントが提供されます。また、テレメトリ/ビジネス データとは別に処理できるデバイスの状態/ログ情報を送信することもできます。

    Logging to Azure サンプルでは、ログ メッセージを IoT Hub テレメトリとして転送し、高度なクエリを実行できるように Azure Data Explorer クラスター内に保存する方法を示します。

    • Azure IoT Hub

      Azure IoT Hub インスタンスは、ストレージ/分析のためにデータを Azure Database に送信するように構成できます。また、EventHub と Azure 関数を使用して実現できるメッセージをフィルター処理することもできます。

      Azure IoT Hubの場合は、メッセージを処理できるAzure関数にデータを送信できます。 Azure Functions 向け Azure IoT Hub トリガーの記事では、Azure Function を Azure IoT Hub インスタンスに接続する方法について説明します。

    • Azure IoT Central

      Azure IoT Central には、次のようなさまざまなエンドポイントにデータを継続的にエクスポートする機能が含まれています。

      • Azure Event Hubs
      • Azure Service Bus キュー
      • Azure Service Busトピック
      • Azure Blob Storage
      • Webhook

      WebHook は、作成する REST API エンドポイントであり、Azure関数である可能性があります。

    データを送信しているデバイス ID に基づいて Azure 関数内のメッセージをフィルター処理する場合があります。Azure関数で次のコードを使用してデバイス ID を取得できます。

    public static async Task Run(EventData message, ILogger log)
    {
        var deviceId=message.SystemProperties["iothub-connection-device-id"];

        // Code to filter the messages goes here...
    }

Azure IoT HubおよびAzure IoT Centralは、Device Twins をサポートします。これには、必要な状態 (IoT Hub/Central アプリケーションで設定)、および報告された状態 (デバイスからの状態) が含まれます。 Azure IoT Hub/Central Device Twin を使用して、ログ データの詳細度 (ログの頻度の増減、またはログ データの豊富さ) に必要な状態を設定できます。 Azure IoT サンプルは、Device Twin Desired State の変更を処理する方法を示しています。

ストレージへのデータのログ記録

Azure Sphereは、高度なアプリケーションに対して最大 64 KB の不変ストレージをサポートします。これは、設定、アプリケーションの状態、またはその他のデータを保持するために使用できます。アプリケーション開発者は、データを変更可能なストレージにシリアル化/逆シリアル化する役割を担います- Azure Sphereギャラリーには、project が含まれています。これは、キーと値のペア (ディクショナリ) を使用して、変更可能なストレージに状態を書き込む/読み取る方法を示します (アプリケーション マニフェストの構成方法に応じて最大 64 KB)。

64 KB を超えるログ/状態データを何らかの形式の外部ストレージに書き込むことができます。これは、断続的な接続を持つデバイスや、64 KB を超えるデータを格納/取得する必要があるデバイスに役立ちます。

1 つのオプションは、外部ストレージを追加することです。たとえば、SPI フラッシュを使用してデータを格納するこのプロジェクト は SPI フラッシュを使用してダウンストリーム デバイスの Over-the-air 更新を格納し、Azure Sphere アプリケーションからのテレメトリ/状態データのログ記録をサポートするように変更できます。