適用対象: IoT Edge 1.1
重要
IoT Edge 1.1 サポート終了日は 2022 年 12 月 13 日でした。 本製品、サービス、テクノロジ、または API のサポート内容については、Microsoft 製品のライフサイクルに関するページをご確認ください。 最新バージョンの IoT Edge への更新の詳細については、「IoT Edgeの更新」を参照してください。
この記事では、もう一度、シミュレートされたデバイスとして開発 VM を使用します。 ただし、デバイスは IoT Hub に直接データを送信する代わりに、透過的なゲートウェイとして構成された IoT Edge デバイスにデータを送信します。
シミュレートされたデバイスがデータを送信している間、IoT Edge デバイスの動作を監視します。 デバイスの実行が完了したら、ストレージ アカウント内のデータを調べて、すべてが期待どおりに動作したことを検証します。
この手順は、通常、クラウドまたはデバイス開発者によって実行されます。
チュートリアルのこのセクションでは、次の方法について説明します。
- ダウンストリーム デバイスをビルドして実行します。
- 生成されたデータが Azure Blob Storage に格納されていることを確認します。
- 機械学習モデルがデバイス データを分類したことを検証します。
前提条件
この記事は、Azure Machine Learning on IoT Edge の使用に関するチュートリアルのシリーズの一部です。 シリーズの各記事は、前の記事の作業に基づいています。 この記事に直接アクセスした場合は、シリーズの 最初の記事 を参照してください。
デバイス ハーネスを確認する
DeviceHarness プロジェクトを再利用して、ダウンストリーム デバイスをシミュレートします。 透過的ゲートウェイに接続するには、次の 2 つの追加事項が必要です。
- ダウンストリーム IoT デバイスが IoT Edge ランタイムで使用されている証明機関を信頼するように証明書を登録します。 ここでは、ダウンストリーム デバイスが開発 VM です。
- エッジ ゲートウェイの完全修飾ドメイン名 (FQDN) をデバイス接続文字列に追加します。
コードを見て、これら 2 つの項目がどのように実装されているかを確認します。
開発用コンピューターで Visual Studio Code を開きます。
File>Open Folder... を使用して C:\source\IoTEdgeAndMlSample\DeviceHarness を開きます。
Program.csの InstallCertificate() メソッドを確認します。
コードで証明書のパスが見つかると、CertificateManager.InstallCACert メソッドが呼び出され、コンピューターに証明書がインストールされることに注意してください。
次に、TurbofanDevice クラスの GetIotHubDevice メソッドを確認します。
ユーザーが "-g" オプションを使用してゲートウェイの FQDN を指定すると、その値が
gatewayFqdn
変数としてこのメソッドに渡され、デバイス接続文字列に追加されます。connectionString = $"{connectionString};GatewayHostName={gatewayFqdn.ToLower()}";
ダウンストリーム デバイスをビルドして実行する
Visual Studio Code で DeviceHarness プロジェクトがまだ開いている状態で、プロジェクトをビルドします。 [ターミナル] メニューの [ビルド タスクの実行] を選択し、[ビルド] を選択します。
Azure portal で IoT Edge デバイス (Linux VM) に移動し、概要ページから DNS 名 の値をコピーして、エッジ ゲートウェイの完全修飾ドメイン名 (FQDN) を見つけます。
IoTデバイス(Linux VM)がまだ実行されていない場合は、起動してください。
Visual Studio Code ターミナルを開きます。 [ターミナル] メニューから [新しいターミナル] を選択し、次のコマンドを実行します。
<edge_device_fqdn>
は、IoT Edge デバイス (Linux VM) からコピーした DNS 名に置き換えます。dotnet run -- --gateway-host-name "<edge_device_fqdn>" --certificate C:\edgecertificates\certs\azure-iot-test-only.root.ca.cert.pem --max-devices 1
アプリケーションは、開発用コンピューターに証明書のインストールを試みます。 その場合は、セキュリティ警告を受け入れます。
IoT Hub 接続文字列の入力を求められたら、Azure IoT Hub デバイス パネルの省略記号 (...) をクリックし、[ IoT Hub 接続文字列のコピー] を選択します。 ターミナルに値を貼り付けます。
次のような出力が表示されます。
Found existing device: Client_001 Using device connection string: HostName=<your hub>.azure-devices.net;DeviceId=Client_001;SharedAccessKey=xxxxxxx; GatewayHostName=iotedge-xxxxxx.<region>.cloudapp.azure.com Device: 1 Message count: 50 Device: 1 Message count: 100 Device: 1 Message count: 150 Device: 1 Message count: 200 Device: 1 Message count: 250
デバイス接続文字列に "GatewayHostName" が追加されていることに注意してください。これにより、デバイスは IoT Edge 透過的ゲートウェイを介して IoT Hub 経由で通信します。
出力を確認する
IoT Edge デバイスの出力
avroFileWriter モジュールからの出力は、IoT Edge デバイスを調べることで簡単に確認できます。
IoT Edge 仮想マシンに SSH 接続します。
ディスクに書き込まれたファイルを探します。
find /data/avrofiles -type f
コマンドの出力は次の例のようになります。
/data/avrofiles/2019/4/18/22/10.avro
実行のタイミングによっては、複数のファイルが含まれる場合があります。
タイムスタンプに注意してください。 avroFileWriter モジュールは、最後の変更時刻が過去 10 分を超えると、クラウドにファイルをアップロードします (avroFileWriter モジュールの uploader.py のMODIFIED_FILE_TIMEOUTを参照)。
10 分が経過すると、モジュールはファイルをアップロードする必要があります。 アップロードが成功すると、ディスクからファイルが削除されます。
Azure Storage
データがルーティングされると予想されるストレージ アカウントを調べることで、ダウンストリーム デバイスがデータを送信した結果を確認できます。
開発用コンピューターで Visual Studio Code を開きます。
探索ウィンドウの [AZURE STORAGE] パネルで、ツリー内を移動してストレージ アカウントを見つけます。
[BLOB コンテナー] ノードを展開します。
チュートリアルの前の部分で行った作業から、 ruldata コンテナーには RUL を含むメッセージが含まれている必要があります。 ruldata ノードを展開します。
<IoT Hub Name>/<partition>/<year>/<month>/<day>/<hour>/<minute>
のような名前の 1 つ以上の BLOB ファイルが表示されます。いずれかのファイルを右クリックし、[BLOB の ダウンロード ] を選択して、開発用コンピューターにファイルを保存します。
次に、 uploadturbofanfiles ノードを 展開します。 前の記事では、この場所を avroFileWriter モジュールによってアップロードされたファイルのターゲットとして設定しました。
ファイルを右クリックし、[ BLOB のダウンロード ] を選択して開発用コンピューターに保存します。
Avro ファイルの内容を読み取る
Avro ファイルを読み取り、ファイル内のメッセージの JSON 文字列を返す簡単なコマンド ライン ユーティリティが含まれています。 このセクションでは、インストールして実行します。
Visual Studio Code (ターミナル>New ターミナル) でターミナルを開きます。
hubavroreader をインストールします。
pip install c:\source\IoTEdgeAndMlSample\HubAvroReader
hubavroreader を使用して、 ruldata からダウンロードした Avro ファイルを読み取ります。
hubavroreader <avro file with ath> | more
メッセージの本文は、デバイス ID と予測 RUL で想定どおりに表示されることに注意してください。
{ "Body": { "ConnectionDeviceId": "Client_001", "CorrelationId": "3d0bc256-b996-455c-8930-99d89d351987", "CycleTime": 1.0, "PredictedRul": 170.1723693909444 }, "EnqueuedTimeUtc": "<time>", "Properties": { "ConnectionDeviceId": "Client_001", "CorrelationId": "3d0bc256-b996-455c-8930-99d89d351987", "CreationTimeUtc": "01/01/0001 00:00:00", "EnqueuedTimeUtc": "01/01/0001 00:00:00" }, "SystemProperties": { "connectionAuthMethod": "{\"scope\":\"module\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}", "connectionDeviceGenerationId": "636857841798304970", "connectionDeviceId": "aaTurbofanEdgeDevice", "connectionModuleId": "turbofanRouter", "contentEncoding": "utf-8", "contentType": "application/json", "correlationId": "3d0bc256-b996-455c-8930-99d89d351987", "enqueuedTime": "<time>", "iotHubName": "mledgeiotwalkthroughhub" } }
uploadturbofanfiles からダウンロードした Avro ファイルを渡すのと同じコマンドを実行します。
予想どおり、これらのメッセージには、元のメッセージのすべてのセンサー データと操作設定が含まれています。 このデータを使用して、エッジ デバイスの RUL モデルを改善できます。
{ "Body": { "CycleTime": 1.0, "OperationalSetting1": -0.0005000000237487257, "OperationalSetting2": 0.00039999998989515007, "OperationalSetting3": 100.0, "PredictedRul": 170.17236328125, "Sensor1": 518.6699829101562, "Sensor10": 1.2999999523162842, "Sensor11": 47.29999923706055, "Sensor12": 522.3099975585938, "Sensor13": 2388.010009765625, "Sensor14": 8145.31982421875, "Sensor15": 8.424599647521973, "Sensor16": 0.029999999329447746, "Sensor17": 391.0, "Sensor18": 2388.0, "Sensor19": 100.0, "Sensor2": 642.3599853515625, "Sensor20": 39.11000061035156, "Sensor21": 23.353700637817383, "Sensor3": 1583.22998046875, "Sensor4": 1396.8399658203125, "Sensor5": 14.619999885559082, "Sensor6": 21.610000610351562, "Sensor7": 553.969970703125, "Sensor8": 2387.9599609375, "Sensor9": 9062.169921875 }, "ConnectionDeviceId": "Client_001", "CorrelationId": "70df0c98-0958-4c8f-a422-77c2a599594f", "CreationTimeUtc": "0001-01-01T00:00:00+00:00", "EnqueuedTimeUtc": "<time>" }
リソースをクリーンアップする
このエンドツーエンドのチュートリアルで使用されるリソースを調べる場合は、作成したリソースをクリーンアップするまで待ちます。 それ以外の場合は、次の手順を使用して削除します。
Dev VM、IoT Edge VM、IoT Hub、ストレージ アカウント、機械学習ワークスペース サービス (および作成されたリソース: コンテナー レジストリ、Application Insights、キー コンテナー、ストレージ アカウント) を保持するために作成されたリソース グループを削除します。
Azure Notebooks で機械学習プロジェクトを削除します。
リポジトリをローカルに複製した場合は、ローカル リポジトリを参照する PowerShell または VS Code ウィンドウを閉じてから、リポジトリ ディレクトリを削除します。
証明書をローカルで作成した場合は、フォルダー c:\edgeCertificates を削除します。
次のステップ
この記事では、開発用 VM を使用して、センサーと運用データを IoT Edge デバイスに送信するダウンストリーム デバイスをシミュレートしました。 デバイス上のモジュールが、エッジ デバイスのリアルタイム操作を調べ、ストレージ アカウントにアップロードされたファイルを調べることで、データをルーティング、分類、永続化、アップロードしたことを検証しました。
IoT Edge の機能について引き続き学習するには、次のチュートリアルをお試しください。