디바이스 관리 시작(Node.js)

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

참고 항목

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

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

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

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

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

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

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

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

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

필수 조건

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

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

  • Node.js 버전 10.0.x 이상. 개발 환경 준비에서는 Windows 또는 Linux에 이 문서의 Node.js를 설치하는 방법을 설명합니다.

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

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

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

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

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

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

  1. managed-device라는 빈 폴더를 만듭니다. managed-device 폴더의 명령 프롬프트에서 다음 명령을 사용하여 package.json 파일을 만듭니다. 모든 기본값을 수락합니다.

    npm init
    
  2. managed-device 폴더의 명령 프롬프트에서 다음 명령을 실행하여 azure-iot-device 디바이스 SDK 패키지 및 azure-iot-device-mqtt 패키지를 설치합니다.

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. 텍스트 편집기를 사용하여 managed-device 폴더에 dmpatterns_getstarted_device.js 파일을 만듭니다.

  4. 다음 'require' 문을 dmpatterns_getstarted_device.js 파일의 시작 부분에 추가합니다.

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. connectionString 변수를 추가하고 이 변수를 사용하여 클라이언트 인스턴스를 만듭니다. {yourdeviceconnectionstring} 자리 표시자 값을 IoT Hub에서 디바이스를 등록할 때 확인한 디바이스 연결 문자열로 바꿉니다.

    var connectionString = '{yourdeviceconnectionstring}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. 디바이스에서 직접 메서드를 구현하도록 다음 함수를 추가합니다.

    var onReboot = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, 'Reboot started', function(err) {
            if (err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        // Report the reboot before the physical restart
        var date = new Date();
        var patch = {
            iothubDM : {
                reboot : {
                    lastReboot : date.toISOString(),
                }
            }
        };
    
        // Get device Twin
        client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                console.log('twin acquired');
                twin.properties.reported.update(patch, function(err) {
                    if (err) throw err;
                    console.log('Device reboot twin state reported')
                });  
            }
        });
    
        // Add your device's reboot API for physical restart.
        console.log('Rebooting!');
    };
    
  7. IoT Hub에 대한 연결을 열고 직접 메서드 수신기를 시작합니다.

    client.open(function(err) {
        if (err) {
            console.error('Could not open IotHub client');
        }  else {
            console.log('Client opened.  Waiting for reboot method.');
            client.onDeviceMethod('reboot', onReboot);
        }
    });
    
  8. dmpatterns_getstarted_device.js 파일을 저장 후 닫습니다.

참고 항목

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

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 공유 액세스 정책 및 사용 권한에 대한 자세한 내용은 액세스 제어 및 권한을 참조하세요.

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

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

  1. trigger-reboot-on-device라는 빈 폴더를 만듭니다. trigger-reboot-on-device 폴더의 명령 프롬프트에서 다음 명령을 사용하여 package.json 파일을 만듭니다. 모든 기본값을 수락합니다.

    npm init
    
  2. trigger-reboot-on-device 폴더의 명령 프롬프트에서 다음 명령을 실행하여 azure-iothub 디바이스 SDK 패키지 및 azure-iot-device-mqtt 패키지를 설치합니다.

    npm install azure-iothub --save
    
  3. 텍스트 편집기를 사용하여 trigger-reboot-on-device 폴더에 dmpatterns_getstarted_service.js 파일을 만듭니다.

  4. 다음 'require' 문을 dmpatterns_getstarted_service.js 파일의 시작 부분에 추가합니다.

    'use strict';
    
    var Registry = require('azure-iothub').Registry;
    var Client = require('azure-iothub').Client;
    
  5. 다음 변수 선언을 추가하고 {iothubconnectionstring} 자리 표시자 값을 이전에 IoT Hub 연결 문자열 가져오기에서 복사한 IoT Hub 연결 문자열로 바꿉니다.

    var connectionString = '{iothubconnectionstring}';
    var registry = Registry.fromConnectionString(connectionString);
    var client = Client.fromConnectionString(connectionString);
    var deviceToReboot = 'myDeviceId';
    
  6. 대상 디바이스를 재부팅하기 위해 디바이스 메서드를 호출하도록 다음 함수를 추가합니다.

    var startRebootDevice = function(twin) {
    
        var methodName = "reboot";
    
        var methodParams = {
            methodName: methodName,
            payload: null,
            timeoutInSeconds: 30
        };
    
        client.invokeDeviceMethod(deviceToReboot, methodParams, function(err, result) {
            if (err) {
                console.error("Direct method error: "+err.message);
            } else {
                console.log("Successfully invoked the device to reboot.");  
            }
        });
    };
    
  7. 디바이스를 쿼리하고 마지막 재부팅 시간을 가져오도록 다음 함수를 추가합니다.

    var queryTwinLastReboot = function() {
    
        registry.getTwin(deviceToReboot, function(err, twin){
    
            if (twin.properties.reported.iothubDM != null)
            {
                if (err) {
                    console.error('Could not query twins: ' + err.constructor.name + ': ' + err.message);
                } else {
                    var lastRebootTime = twin.properties.reported.iothubDM.reboot.lastReboot;
                    console.log('Last reboot time: ' + JSON.stringify(lastRebootTime, null, 2));
                }
            } else 
                console.log('Waiting for device to report last reboot time.');
        });
    };
    
  8. 다시 시작 직접 메서드를 트리거하고 마지막 다시 시작 시간을 쿼리하는 함수를 호출하도록 다음 코드를 추가합니다.

    startRebootDevice();
    setInterval(queryTwinLastReboot, 2000);
    
  9. dmpatterns_getstarted_service.js 파일을 저장 후 닫습니다.

앱 실행

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

  1. managed-device 폴더의 명령 프롬프트에서 다음 명령을 실행하여 다시 시작 직접 메서드에 대한 수신 대기를 시작합니다.

    node dmpatterns_getstarted_device.js
    
  2. trigger-reboot-on-device 폴더의 명령 프롬프트에서 다음 명령을 실행하여 원격 재부팅을 트리거하고 마지막 재부팅 시간을 찾기 위해 디바이스 쌍에 대한 쿼리를 수행합니다.

    node dmpatterns_getstarted_service.js
    
  3. 콘솔에서 재부팅 직접 방법에 대한 디바이스 응답 및 재부팅 상태가 표시됩니다.

    다음은 서비스에서 보낸 재부팅 직접 방법에 대한 디바이스 응답을 보여 줍니다.

    manageddevice app output

    다음은 재부팅을 트리거하는 서비스와 마지막 재부팅 시간 동안 디바이스 쌍을 폴링하는 경우를 보여 줍니다.

    triggerrebootondevice app output

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

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

디바이스 유지 관리 기간

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

다음 단계

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

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

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