演習 - シミュレートされたデバイスを実行する

完了

この演習では、シミュレートされたデバイスを実行します。 デバイスを初めて起動すると、デバイスはデバイス プロビジョニング サービス (DPS) に接続され、構成済みのグループ登録を使用して自動的に登録されます。

デバイスは、DPS グループ登録に登録されると、IoT Hub デバイス レジストリに自動的に登録されます。 登録が完了すると、デバイスは、構成済みの X.509 デバイス証明書認証を使用して Azure IoT Hub との通信を安全に開始できます。

タスク 1:シミュレートされたデバイス プロジェクトをビルドして実行する

  1. Visual Studio Code で sensor-thl-001-device フォルダーがまだ開かれていない場合は開きます。

  2. Visual Studio で、[ターミナル] メニューを開き、[新しいターミナル] を選択して、Visual Studio Code ウィンドウの下部で統合ターミナルを開きます。

  3. ターミナルのコマンド プロンプトで、現在の作業ディレクトリが \sensor-thl-001-device フォルダーであることを確認します。

  4. ContainerDevice プロジェクトをビルドして実行します。

    dotnet run
    

    Note

    シミュレートされたデバイスを初めて実行する場合、最も一般的なエラーは "無効な証明書" エラーです。 このエラーにより、ProvisioningTransportException 例外が発生する可能性があります。 次の例のようなメッセージが表示された場合は、DPS の CA 証明書と、シミュレートされたデバイス アプリケーションのデバイス証明書が正しく構成されていることを確認します。 この Web ページの下部にある [作業の確認] セクションには、登録済みの CA およびデバイス証明書に関する情報を DPS から表示する Cloud Shell コマンドがあり、この情報を使用してエラーの診断に役立てることができます。

    localmachine:LabFiles User$ dotnet run
    Found certificate: AFF851ED016CA5AEB71E5749BCBE3415F8CF4F37 CN=sensor-thl-001; PrivateKey: True
    Using certificate AFF851ED016CA5AEB71E5749BCBE3415F8CF4F37 CN=sensor-thl-001
    RegistrationID = sensor-thl-001
    ProvisioningClient RegisterAsync . . . Unhandled exception. Microsoft.Azure.Devices.Provisioning.Client.ProvisioningTransportException: {"errorCode":401002,"trackingId":"2e298c80-0974-493c-9fd9-6253fb055ade","message":"Invalid certificate.","timestampUtc":"2019-12-13T14:55:40.2764134Z"}
      at Microsoft.Azure.Devices.Provisioning.Client.Transport.ProvisioningTransportHandlerAmqp.ValidateOutcome(Outcome outcome)
      at Microsoft.Azure.Devices.Provisioning.Client.Transport.ProvisioningTransportHandlerAmqp.RegisterDeviceAsync(AmqpClientConnection client, String correlationId, DeviceRegistration deviceRegistration)
      at Microsoft.Azure.Devices.Provisioning.Client.Transport.ProvisioningTransportHandlerAmqp.RegisterAsync(ProvisioningTransportRegisterMessage message, CancellationToken cancellationToken)
      at X509CertificateContainerDevice.ProvisioningDeviceLogic.RunAsync() in /Users/User/Documents/AZ-220/LabFiles/Program.cs:line 121
      at X509CertificateContainerDevice.Program.Main(String[] args) in /Users/User/Documents/AZ-220/LabFiles/Program.cs:line 55
    ...
    
  5. シミュレートされたデバイス アプリからターミナル ウィンドウに出力が送信されることに注意してください。

    シミュレートされたデバイス アプリケーションが正しく実行されている場合は、ターミナルにアプリからのコンソール出力が表示されます。

    ターミナル ウィンドウに表示される情報の上部までスクロールします。

    X.509 sensor-thl-001 デバイス証明書が読み込まれ、デバイスがデバイス プロビジョニング サービスに登録され、hub-{your-suffix} IoT ハブに接続するように割り当てられており、デバイス ツインの目的のプロパティが読み込まれることに注意してください。

    localmachine:LabFiles User$ dotnet run
    Found certificate: AFF851ED016CA5AEB71E5749BCBE3415F8CF4F37 CN=sensor-thl-001; PrivateKey: True
    Using certificate AFF851ED016CA5AEB71E5749BCBE3415F8CF4F37 CN=sensor-thl-001
    RegistrationID = sensor-thl-001
    ProvisioningClient RegisterAsync . . . Device Registration Status: Assigned
    ProvisioningClient AssignedHub: hub-1119.azure-devices.net; DeviceID: sensor-thl-001
    Creating X509 DeviceClient authentication.
    simulated device. Ctrl-C to exit.
    DeviceClient OpenAsync.
    Connecting SetDesiredPropertyUpdateCallbackAsync event handler...
    Loading Device Twin Properties...
    Desired Twin Property Changed:
    {"$version":1}
    Reported Twin Properties:
    {"telemetryDelay":1}
    Start reading and sending device telemetry...
    

    シミュレートされたデバイスのソース コードを確認するには、Program.cs ソース コード ファイルを開きます。 コンソールに表示されるメッセージを出力するために使用されるいくつかの Console.WriteLine ステートメントを探します。

  6. JSON 形式のテレメトリ メッセージが IoT Hub に送信されていることに注意してください。

    Start reading and sending device telemetry...
    12/9/2019 5:47:00 PM > Sending message: {"temperature":24.047539159212047,"humidity":67.00504162675004,"pressure":1018.8478924248358,"latitude":40.129349260196875,"longitude":-98.42877188146265}
    12/9/2019 5:47:01 PM > Sending message: {"temperature":26.628804161040485,"humidity":68.09610794675355,"pressure":1014.6454375411363,"latitude":40.093269544242695,"longitude":-98.22227128174003}
    

    シミュレートされたデバイスで最初の起動、プロビジョニング、登録のタスクが完了すると、シミュレートされたセンサー テレメトリ メッセージがデバイスから IoT Hub に送信されます。

    telemetryDelay デバイス ツイン プロパティで定義されている、IoT Hub に送信される各メッセージ間の遅延により、センサー テレメトリ メッセージの送信間の遅延は現在1 秒であることに注意してください。

  7. シミュレートされたデバイスを実行したままにします。

タスク 2:他のシミュレートされたデバイスを起動します

  1. Visual Studio Code の新しいインスタンスを開きます。

    Visual Studio Code 内から新しいインスタンスを開くことができます。[ファイル] メニューを開き、[新しいウィンドウ] を選択します。

  2. 新しい Visual Studio Code ウィンドウの [ファイル] メニューで、[フォルダーを開く] を選択します。

  3. sensor-thl-002-device フォルダーに移動し、[フォルダーの選択] を選択します。

  4. Visual Studio で、[ターミナル] メニューを開き、[新しいターミナル] を選択して、Visual Studio Code ウィンドウの下部で統合ターミナルを開きます。

  5. ターミナルのコマンド プロンプトで、現在の作業ディレクトリが \sensor-thl-002-device フォルダーであることを確認します。

  6. ContainerDevice プロジェクトをビルドして実行します。

    dotnet run
    

タスク 3:ツインを使用してデバイスの構成を変更する

DPS でグループ登録を作成したら、telemetryDelay プロパティが 1 秒 に設定されるようにデバイスの最初のツイン構成を設定します。 シミュレートされたデバイスを実行して、Azure IoT Hub 内でデバイス ツインの目的の状態を編集すると、telemetryDelay 構成を更新できます。

  1. Azure サンドボックスで、テレメトリが 3 秒ごとに送信されるように、sensor-thl-001 デバイスの目的のプロパティを更新します。

    az iot hub device-twin update --hub-name hub-$suffix --device-id sensor-thl-001 --desired "{'telemetryDelay':'3'}"
    
  2. sensor-thl-001-device フォルダーから ContainerDevice プロジェクトを実行している Visual Studio Code ウィンドウに戻ります。

  3. デバイス ツインの telemetryDelay が目的のプロパティ設定に更新されたことがアプリケーションに通知されていることに注意してください。

    新しいデバイス ツインの目的のプロパティが読み込まれたこと、および変更が設定されて、Azure IoT Hub に報告されたことを示すメッセージがアプリケーションによってコンソールに出力されます。

    Desired Twin Property Changed:
    {"telemetryDelay":3,"$version":2}
    Reported Twin Properties:
    {"telemetryDelay":3}
    
  4. シミュレートされたデバイスのセンサー テレメトリ メッセージが、Azure IoT Hub に 3 秒ごとに送信されるようになったことに注意してください。

    12/9/2019 5:48:07 PM > Sending message: {"temperature":33.89822140284731,"humidity":78.34939097908763,"pressure":1024.9467544610131,"latitude":40.020042418755764,"longitude":-98.41923808825841}
    12/9/2019 5:48:10 PM > Sending message: {"temperature":27.475786026323114,"humidity":64.4175510594703,"pressure":1020.6866468579678,"latitude":40.2089999240047,"longitude":-98.26223221770334}
    12/9/2019 5:48:13 PM > Sending message: {"temperature":34.63600901637041,"humidity":60.95207713588703,"pressure":1013.6262313688063,"latitude":40.25499096898331,"longitude":-98.51199886959347}
    
  5. [ターミナル] ペインで Ctrl + C キーを押して、シミュレートされたデバイス アプリを終了します。

  6. 他の Visual Studio Code ウィンドウに切り替え、ターミナル プロンプトを使用して、シミュレートされたデバイス アプリを停止します。

    次の演習でプログラムを再実行するためにこの Visual Studio Code ウィンドウに戻るので、まだ閉じないでください。

作業内容を検証する

  1. いずれかのプログラムが機能しない場合は、次の演習に進む前にエラーを修正します。

  2. デバイス ツインの telemetryDelay 値が3 秒であることを確認します。

    az iot hub device-twin show --hub-name hub-$suffix --device-id sensor-thl-001