디바이스 관리 시작(.NET)

백 엔드 앱에서는 디바이스 쌍직접 메서드 같은 Azure IoT Hub 기본 형식을 사용하여 디바이스에서 장치 관리 작업을 원격으로 시작하고 모니터링할 수 있습니다. 이 문서에서는 백 엔드 앱 및 디바이스 앱이 함께 작동하여 IoT Hub를 사용하여 원격 디바이스 다시 부팅을 시작하고 모니터링하는 방법을 보여 줍니다.

참고 항목

이 문서에서 설명하는 기능은 IoT Hub의 표준 계층에서만 사용할 수 있습니다. 기본 및 표준/무료 IoT Hub 계층에 대한 자세한 내용은 솔루션에 적합한 IoT Hub 계층 선택을 참조하세요.

직접 메서드를 사용하여 클라우드의 백 엔드 앱에서 디바이스 관리 작업(예: 재부팅, 초기화 및 펌웨어 업데이트)을 시작합니다. 디바이스는 다음과 같은 역할을 합니다.

  • IoT Hub에서 보낸 메서드 요청 처리.

  • 디바이스에서 해당하는 디바이스 특정 작업 시작.

  • reported 속성을 통해 IoT Hub에 상태 업데이트 제공.

클라우드에서 백 엔드 앱을 사용하여 디바이스 쌍 쿼리를 실행하고 디바이스 관리 작업의 진행 상태를 보고할 수 있습니다.

이 문서에서는 다음을 만드는 방법을 보여 줍니다.

  • SimulateManagedDevice: 디바이스를 다시 부팅하고 마지막 다시 부팅 시간을 보고하는 직접 메서드가 있는 시뮬레이션된 디바이스 앱입니다. 직접 메서드는 클라우드에서 호출됩니다.

  • TriggerReboot: IoT 허브를 통해 시뮬레이션된 디바이스 앱에서 직접 메서드를 호출하는 .NET 콘솔 앱입니다. 응답 및 업데이트된 reported 속성을 표시합니다.

필수 조건

  • Visual Studio.

  • IoT 허브. CLI 또는 Azure Portal을 사용하여 만듭니다.

  • 등록된 디바이스. Azure Portal에 하나를 등록합니다.

  • 방화벽에서 포트 8883이 열려 있는지 확인합니다. 이 문서의 디바이스 샘플은 포트 8883을 통해 통신하는 MQTT 프로토콜을 사용합니다. 이 포트는 일부 회사 및 교육용 네트워크 환경에서 차단될 수 있습니다. 이 문제를 해결하는 자세한 내용과 방법은 IoT Hub에 연결(MQTT)을 참조하세요.

직접 메서드를 사용하여 디바이스 앱 만들기

이 섹션에서는 다음을 수행합니다.

  • 클라우드에서 호출하는 직접 메서드에 응답하는 .NET 콘솔 앱을 만듭니다.

  • 시뮬레이션된 디바이스 재부팅을 트리거합니다.

  • reported 속성을 사용하여 디바이스 및 해당 디바이스가 마지막으로 재부팅한 시간을 확인하는 디바이스 쌍 쿼리를 사용하도록 설정합니다.

시뮬레이트된 디바이스 앱을 만들려면 다음 단계를 수행합니다.

  1. Visual Studio를 열고 새 프로젝트 만들기를 선택한 다음, 콘솔 앱(.NET Framework) 프로젝트 템플릿을 찾아 선택한 후, 다음을 선택합니다.

  2. 새 프로젝트 구성에서 프로젝트 이름을 SimulateManagedDevice로 지정한 후, 다음을 선택합니다.

    Screenshot that shows how to name a new Visual Studio project.

  3. 기본 .NET Framework 버전을 유지한 다음, 만들기를 선택합니다.

  4. 솔루션 탐색기에서 SimulateManagedDevice 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다.

  5. 찾아보기를 선택하고 Microsoft.Azure.Devices.Client를 검색하여 선택합니다. 설치를 선택합니다.

    Screenshot that shows how to install the Microsoft.Azure.Devices.Client package.

    이 단계에서는 Azure IoT 디바이스 SDK NuGet 패키지 및 해당 종속 항목에 참조를 다운로드, 설치 및 추가합니다.

  6. Program.cs 파일 위에 다음 using 문을 추가합니다.

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    
  7. Program 클래스에 다음 필드를 추가합니다. {device connection string} 자리 표시자 값을 IoT Hub에서 디바이스를 등록할 때 확인한 디바이스 연결 문자열로 바꿉니다.

    static string DeviceConnectionString = "{device connection string}";
    static DeviceClient Client = null;
    
  8. 디바이스에서 직접 메서드를 구현하도록 다음을 추가합니다.

    static Task<MethodResponse> onReboot(MethodRequest methodRequest, object userContext)
    {
        // In a production device, you would trigger a reboot 
        //   scheduled to start after this method returns.
        // For this sample, we simulate the reboot by writing to the console
        //   and updating the reported properties.
        try
        {
            Console.WriteLine("Rebooting!");
    
            // Update device twin with reboot time. 
            TwinCollection reportedProperties, reboot, lastReboot;
            lastReboot = new TwinCollection();
            reboot = new TwinCollection();
            reportedProperties = new TwinCollection();
            lastReboot["lastReboot"] = DateTime.Now;
            reboot["reboot"] = lastReboot;
            reportedProperties["iothubDM"] = reboot;
            Client.UpdateReportedPropertiesAsync(reportedProperties).Wait();
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
        }
    
        string result = @"{""result"":""Reboot started.""}";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. 마지막으로 Main 메서드에 다음 코드를 추가하여 IoT Hub에 대한 연결을 열고 메서드 수신기를 초기화합니다.

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        // setup callback for "reboot" method
        Client.SetMethodHandlerAsync("reboot", onReboot, null).Wait();
        Console.WriteLine("Waiting for reboot method\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        // as a good practice, remove the "reboot" handler
        Client.SetMethodHandlerAsync("reboot", null, null).Wait();
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  10. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 시작 프로젝트 설정을 선택합니다.

  11. 일반 속성>시작 프로젝트에 대해 단일 시작 프로젝트를 선택하고 SimulateManagedDevice 프로젝트를 선택합니다. 확인 을 선택하여 변경 내용을 저장합니다.

  12. 빌드>솔루션 빌드를 선택합니다.

참고 항목

간단히 하기 위해 이 문서에서는 다시 시도 정책을 구현하지 않습니다. 프로덕션 코드에서는 문서 일시적인 오류 처리에서 제시한 대로 재시도 정책(예: 지수 백오프)을 구현해야 합니다.

IoT Hub 연결 문자열 가져오기

이 문서에서는 디바이스에서 직접 메서드를 호출하는 백 엔드 서비스를 만듭니다. IoT Hub를 통해 디바이스에서 직접 메서드를 호출하려면 서비스에 서비스 연결 권한이 있어야 합니다. 기본적으로 모든 IoT Hub는 이 사용 권한을 부여하는 service라는 공유 액세스 정책을 사용하여 만듭니다.

service 정책에 대한 IoT Hub 연결 문자열을 가져오려면 다음 단계를 수행합니다.

  1. Azure Portal에서 리소스 그룹을 선택합니다. 허브가 있는 리소스 그룹을 선택한 다음, 리소스 목록에서 허브를 선택합니다.

  2. IoT Hub의 왼쪽 창에서 공유 액세스 정책을 선택합니다.

  3. 정책 목록에서 ervice 정책을 선택합니다.

  4. 기본 연결 문자열을 복사하고 값을 저장합니다.

Screenshot that shows how to retrieve the connection string from your IoT Hub in the Azure portal.

IoT Hub 공유 액세스 정책 및 사용 권한에 대한 자세한 내용은 액세스 제어 및 권한을 참조하세요.

다시 부팅을 트리거하는 서비스 앱 만들기

이 섹션에서는 디바이스에서 직접 메서드를 사용하여 원격 다시 시작을 시작하는 .NET 콘솔 앱(C# 사용)을 만듭니다. 앱은 디바이스 쌍 쿼리를 사용하여 해당 디바이스에 대한 마지막 다시 시작 시간을 검색합니다.

  1. Visual Studio를 열고 새 프로젝트 만들기를 선택합니다.

  2. 새 프로젝트 만들기에서 콘솔 앱(.NET Framework) 프로젝트 템플릿을 찾아 선택한 후 다음을 선택합니다.

  3. 새 프로젝트 구성에서 프로젝트 이름을 TriggerReboot로 지정하고 다음을 선택합니다.

    Screenshot that shows how to configure a new Visual Studio project.

  4. .NET Framework의 기본 버전을 수락한 다음 만들기를 선택하여 프로젝트를 만듭니다.

  5. 솔루션 탐색기에서 TriggerReboot 프로젝트를 마우스 오른쪽 단추로 클릭한 다음, NuGet 패키지 관리를 클릭합니다.

  6. 찾아보기를 선택하고 Microsoft.Azure.Devices를 검색하여 선택합니다. 설치를 선택하여 Microsoft.Azure.Devices 패키지를 설치합니다.

    Screenshot that shows how to install the Microsoft.Azure.Devices package.

    이 단계에서는 Azure IoT 서비스 SDK NuGet 패키지 및 해당 종속 항목에 참조를 다운로드, 설치 및 추가합니다.

  7. Program.cs 파일 위에 다음 using 문을 추가합니다.

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  8. Program 클래스에 다음 필드를 추가합니다. {iot hub connection string} 자리 표시자 값을 이전에 IoT Hub 연결 문자열 가져오기에서 복사한 IoT Hub 연결 문자열로 바꿉니다.

    static RegistryManager registryManager;
    static string connString = "{iot hub connection string}";
    static ServiceClient client;
    static string targetDevice = "myDeviceId";
    
  9. Program 클래스에 다음 메서드를 추가합니다. 이 코드는 재부팅 디바이스에 대한 디바이스 쌍을 가져오고 reported 속성을 출력합니다.

    public static async Task QueryTwinRebootReported()
    {
        Twin twin = await registryManager.GetTwinAsync(targetDevice);
        Console.WriteLine(twin.Properties.Reported.ToJson());
    }
    
  10. Program 클래스에 다음 메서드를 추가합니다. 이 코드는 직접 메서드를 사용하여 디바이스에서 재부팅을 시작합니다.

    public static async Task StartReboot()
    {
        client = ServiceClient.CreateFromConnectionString(connString);
        CloudToDeviceMethod method = new CloudToDeviceMethod("reboot");
        method.ResponseTimeout = TimeSpan.FromSeconds(30);
    
        CloudToDeviceMethodResult result = await 
          client.InvokeDeviceMethodAsync(targetDevice, method);
    
        Console.WriteLine("Invoked firmware update on device.");
    }
    
  11. 마지막으로 Main 메서드에 다음 줄을 추가합니다.

    registryManager = RegistryManager.CreateFromConnectionString(connString);
    StartReboot().Wait();
    QueryTwinRebootReported().Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  12. 빌드>솔루션 빌드를 선택합니다.

참고 항목

이 문서에서는 디바이스의 보고된 속성에 대한 쿼리를 한 번만 수행합니다. 프로덕션 코드에서는 보고된 속성의 변경 사항을 감지하도록 폴링하는 것이 좋습니다.

앱 실행

이제 앱을 실행할 준비가 되었습니다.

  1. .NET 디바이스 앱 SimulateManagedDevice를 실행하려면 솔루션 탐색기에서 SimulateManagedDevice 프로젝트를 마우스 오른쪽 단추로 클릭하고 디버그를 선택한 다음, 새 인스턴스 시작을 선택합니다. 앱은 IoT Hub의 메서드 호출에 대한 수신을 시작합니다.

  2. 디바이스가 연결되고 메서드 호출을 기다린 후 TriggerReboot 프로젝트를 마우스 오른쪽 단추로 클릭하고 디버그를 선택한 다음, 새 인스턴스 시작을 선택합니다.

    SimulatedManagedDevice 콘솔에 기록된 재부팅 중TriggerReboot 콘솔에 기록된 마지막 재부팅 시간을 포함하는 보고된 디바이스 속성을 볼 수 있습니다.

    Service and device app run

디바이스 관리 작업 사용자 지정 및 확장

IoT 솔루션에서 정의된 디바이스 관리 패턴 집합을 확장하거나 디바이스 쌍 및 클라우드-디바이스 메서드 기본 형식을 사용하여 사용자 지정 패턴을 활성화하도록 설정할 수 있습니다. 디바이스 관리 작업의 다른 예로 공장 재설정, 펌웨어 업데이트, 소프트웨어 업데이트, 전원 관리, 네트워크 및 연결 관리, 데이터 암호화가 있습니다.

디바이스 유지 관리 기간

일반적으로 서비스 중단 및 가동 중지 시간을 최소화하면서 작업을 수행하도록 디바이스를 구성합니다. 디바이스 유지 관리 기간은 디바이스에서 해당 구성을 업데이트해야 할 경우 시간을 정의하는 데 널리 사용되는 패턴입니다. 백 엔드 솔루션에서는 디바이스 쌍의 desired 속성을 사용하여 유지 관리 기간을 사용하는 디바이스에 대한 정책을 정의하고 활성화할 수 있습니다. 디바이스에서 유지 관리 기간 정책을 수신하면 디바이스 쌍의 reported 속성을 사용하여 정책의 상태를 보고할 수 있습니다. 그런 다음, 백 엔드 앱은 디바이스 쌍 쿼리를 사용하여 디바이스 및 각 정책의 규정 준수를 입증합니다.

다음 단계

이 문서에서는 디바이스에서 원격 다시 시작을 트리거하는 데 직접 메서드를 사용했습니다. 보고된 속성을 사용하여 디바이스에서 마지막으로 다시 시작한 시간을 보고하고, 디바이스 쌍을 쿼리하여 디바이스가 클라우드에서 마지막으로 다시 시작한 시간을 확인했습니다.

Raspberry Pi 3 B+ 참조 이미지를 사용한 Device Update for Azure IoT Hub 문서에서 IoT Hub 및 엔드투엔드 이미지 기반 업데이트와 같은 디바이스 관리 패턴을 계속 시작하려면

IoT 솔루션을 확장하고 여러 디바이스에서 메서드 호출을 예약하는 방법을 알아보려면 jobs 예약 및 브로드캐스트를 참조하세요.