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

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

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

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

問題: 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
  • リアルタイム対応アプリケーション

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

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

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

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

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

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

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

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

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

オプション:

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

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

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

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

  • デバッグ出力を Azure IoT Hub/Azure IoT Central に送信する

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

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

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

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

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

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

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