연습 - 시뮬레이션된 디바이스 실행

완료됨

이 연습에서는 시뮬레이션된 디바이스를 실행합니다. 디바이스가 처음 시작되면 구성된 그룹 등록을 사용하여 디바이스를 자동으로 등록하는 DPS(Device Provisioning Service)에 연결됩니다.

디바이스가 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
    

    참고 항목

    시뮬레이션된 디바이스를 처음 실행할 때 가장 흔히 발생하는 오류는 잘못된 인증서 오류입니다. 이 오류로 인해 ProvisioningTransportException 예외가 발생할 수 있습니다. 다음 예와 유사한 메시지가 표시되면 DPS의 CA 인증서와 시뮬레이션된 디바이스 애플리케이션에 대한 디바이스 인증서가 올바르게 구성되었는지 확인합니다. 이 웹 페이지 하단의 작업 확인 섹션에는 오류 진단에 도움이 되는 DPS의 등록된 CA 및 디바이스 인증서 정보를 표시하는 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 디바이스 인증서가 로드되었고, 디바이스가 Device Provisioning Service에 등록되었으며, hub-{your-suffix} IoT 허브에 연결하도록 할당되었으며, 디바이스 쌍 desired 속성이 로드되었습니다.

    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에 보냅니다.

    IoT Hub로 전송되는 각 메시지 간의 telemetryDelay 디바이스 쌍 속성에 정의된 지연이 현재 센서 원격 분석 메시지를 보내는 사이에 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초로 설정되도록 디바이스의 초기 트윈 구성을 설정합니다. 시뮬레이션된 디바이스가 실행 중인 상태에서 IoT Hub 내에서 디바이스 트윈의 필요한 상태를 편집하여 telemetryDelay 구성을 업데이트할 수 있습니다.

  1. Azure 샌드박스에서 3초마다 원격 분석을 보내도록 sensor-thl-001 디바이스의 desired 속성을 업데이트합니다.

    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 원하는 속성 설정이 애플리케이션에 전송된 상태입니다.

    애플리케이션은 새 디바이스 쌍 desired 속성이 로드되고 변경 내용이 설정되어 Azure IoT 허브에 다시 보고됨을 보여 주는 메시지를 콘솔에 출력합니다.

    Desired Twin Property Changed:
    {"telemetryDelay":3,"$version":2}
    Reported Twin Properties:
    {"telemetryDelay":3}
    
  4. 이제 시뮬레이션된 디바이스 센서 원격 분석 메시지가 3초마다 Azure IoT Hub로 전송됩니다.

    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