미리 구성된 원격 모니터링 솔루션에 디바이스 연결(Node.js)
시나리오 개요
이 시나리오에서는 원격 모니터링 미리 구성된 솔루션에 다음과 같은 원격 분석 데이터를 보낼 디바이스를 만듭니다.
- 외부 온도
- 내부 온도
- 습도
간소함을 위하여 디바이스의 코드가 샘플 값을 생성하지만, 사용자는 자신의 디바이스에 실제 센서를 연결하고 실제 원격 분석 데이터를 보내어 샘플을 확장할 것을 권장합니다.
디바이스는 솔루션 대시보드에서 호출된 메서드 및 솔루션 대시보드에 설정된 desired 속성 값에 응답할 수도 있습니다.
이 자습서를 완료하려면 활성 Azure 계정이 필요합니다. 계정이 없는 경우 몇 분 만에 평가판 계정을 만들 수 있습니다. 자세한 내용은 Azure 평가판을 참조하세요.
시작하기 전에
디바이스에 대한 코드를 작성하기 전에, 미리 구성된 원격 모니터링 솔루션을 프로비전하고 이 솔루션에 새로운 사용자 지정 디바이스를 프로비전해야 합니다.
미리 구성된 사용자의 원격 모니터링 솔루션 프로비전
이 자습서에서 만드는 디바이스는 미리 구성된 원격 모니터링 솔루션의 인스턴스에 데이터를 전송합니다. Azure 계정에서 미리 구성된 원격 모니터링 솔루션을 미리 프로비전하지 않은 경우 다음 단계를 사용합니다.
- https://www.azureiotsolutions.com/ 페이지에서 +를 클릭하여 솔루션을 만듭니다.
- 원격 모니터링 패널에서 선택을 클릭하여 솔루션을 만듭니다.
- 원격 모니터링 솔루션 만들기 페이지에서 선택한 솔루션 이름을 입력하고, 배포하려는 지역을 선택한 후, 사용하려는 Azure 구독을 선택합니다. 그런 다음 솔루션 만들기를 클릭합니다.
- 프로비전 프로세스가 완료될 때까지 기다립니다.
경고
미리 구성된 솔루션에서는 청구 가능한 Azure 서비스를 사용합니다. 불필요한 비용을 방지하기 위해 완료된 후에는 미리 구성된 솔루션을 구독에서 제거해야 합니다. https://www.azureiotsolutions.com/ 페이지를 방문하여 미리 구성된 솔루션을 구독에서 완전히 제거할 수 있습니다.
원격 모니터링 솔루션의 프로비전 프로세스가 완료되면 시작 을 클릭하여 브라우저에서 솔루션 대시보드를 엽니다.
원격 모니터링 솔루션에서 디바이스 프로비전
참고
솔루션에 디바이스가 이미 프로비전되어 있으면 이 단계를 건너뜁니다. 클라이언트 애플리케이션을 만들 때 디바이스 자격 증명을 알아야 합니다.
미리 구성된 솔루션에 연결하는 디바이스는 유효한 자격 증명을 사용하여 IoT Hub에 자신을 식별할 수 있어야 합니다. 솔루션 대시보드에서 디바이스 자격 증명을 검색할 수 있습니다. 이 자습서의 뒷부분에서는 클라이언트 애플리케이션에 있는 디바이스 자격 증명을 포함합니다.
원격 모니터링 솔루션에 디바이스를 추가하려면 솔루션 대시보드에서 다음 단계를 완료합니다.
대시보드의 왼쪽 아래 모서리에서 디바이스 추가를 클릭합니다.
사용자 지정 디바이스 패널에서 새로 추가를 클릭합니다.
직접 나만의 디바이스 ID 정의를 선택합니다. 디바이스 ID(예: mydevice)를 입력하고 ID 확인을 클릭하여 해당 이름이 이미 사용되고 있는지 확인한 후 만들기를 클릭하여 디바이스를 프로비전합니다.
디바이스 자격 증명(디바이스 ID, IoT Hub 호스트 이름 및 디바이스 키)을 적어 둡니다. 원격 모니터링 솔루션에 연결하려면 클라이언트 애플리케이션에 이러한 값이 필요합니다. 완료를 클릭합니다.
솔루션 대시보드의 디바이스 목록에서 디바이스를 선택합니다. 그런 다음, 디바이스 세부 정보 패널에서 디바이스 사용을 클릭합니다. 현재 디바이스 상태는 실행 중입니다. 이제 원격 모니터링 솔루션은 디바이스에서 원격 분석을 수신하고 디바이스에서 메서드를 호출할 수 있습니다.
node.js 샘플 솔루션 만들기
Node.js 버전 0.11.5 이상이 개발 컴퓨터에 설치되었는지 확인합니다. 명령줄에서 node --version
을 실행하여 버전을 확인할 수 있습니다.
개발 컴퓨터에서 RemoteMonitoring이라는 폴더를 만듭니다. 명령줄 환경에서 이 폴더로 이동합니다.
다음 명령을 실행하여 샘플 앱을 완료해야 하는 패키지를 다운로드하고 설치합니다.
npm init npm install azure-iot-device azure-iot-device-mqtt --save
RemoteMonitoring 폴더에서 remote_monitoring.js라는 파일을 만듭니다. 텍스트 편집기에서 이 파일을 엽니다.
remote_monitoring.js 파일에서 다음
require
문을 추가합니다.'use strict'; var Protocol = require('azure-iot-device-mqtt').Mqtt; var Client = require('azure-iot-device').Client; var ConnectionString = require('azure-iot-device').ConnectionString; var Message = require('azure-iot-device').Message;
다음 변수 선언을
require
문 뒤에 추가합니다. 원격 모니터링 솔루션 대시보드에서 자리 표시자 값 [Device Id] 및 [Device Key]를 디바이스에 대해 기록한 값으로 바꿉니다. 솔루션 대시보드에서 IoT Hub 호스트 이름을 사용하여 [IoTHub Name]을 바꿉니다. 예를 들어 IoT Hub 호스트 이름이 contoso.azure-devices.net인 경우 [IoTHub Name]을 contoso로 바꿉니다.var connectionString = 'HostName=[IoTHub Name].azure-devices.net;DeviceId=[Device Id];SharedAccessKey=[Device Key]'; var deviceId = ConnectionString.parse(connectionString).DeviceId;
다음 변수를 추가하여 일부 기본 원격 분석 데이터를 정의합니다.
var temperature = 50; var humidity = 50; var externalTemperature = 55;
다음 도우미 함수를 추가하여 작업 결과를 출력합니다.
function printErrorFor(op) { return function printError(err) { if (err) console.log(op + ' error: ' + err.toString()); }; }
다음 도우미 함수를 추가하여 원격 분석 값을 임의로 지정하는 데 사용합니다.
function generateRandomIncrement() { return ((Math.random() * 2) - 1); }
디바이스가 시작 시 전송하는 DeviceInfo 개체에 대해 다음 정의를 추가합니다.
var deviceMetaData = { 'ObjectType': 'DeviceInfo', 'IsSimulatedDevice': 0, 'Version': '1.0', 'DeviceProperties': { 'DeviceID': deviceId, 'HubEnabledState': 1 } };
디바이스 쌍 reported 값에 대해 다음 정의를 추가합니다. 이 정의는 디바이스가 지원하는 직접 메서드의 설명을 포함합니다.
var reportedProperties = { "Device": { "DeviceState": "normal", "Location": { "Latitude": 47.642877, "Longitude": -122.125497 } }, "Config": { "TemperatureMeanValue": 56.7, "TelemetryInterval": 45 }, "System": { "Manufacturer": "Contoso Inc.", "FirmwareVersion": "2.22", "InstalledRAM": "8 MB", "ModelNumber": "DB-14", "Platform": "Plat 9.75", "Processor": "i3-9", "SerialNumber": "SER99" }, "Location": { "Latitude": 47.642877, "Longitude": -122.125497 }, "SupportedMethods": { "Reboot": "Reboot the device", "InitiateFirmwareUpdate--FwPackageURI-string": "Updates device Firmware. Use parameter FwPackageURI to specifiy the URI of the firmware file" }, }
다음 함수를 추가하여 Reboot 직접 메서드 호출을 처리합니다.
function onReboot(request, response) { // Implement actual logic here. console.log('Simulated reboot...'); // Complete the response response.send(200, "Rebooting device", 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.' ); } }); }
다음 함수를 추가하여 InitiateFirmwareUpdate 직접 메서드 호출을 처리합니다. 이 직접 메서드는 매개 변수를 사용하여 다운로드할 펌웨어 이미지의 위치를 지정하고 디바이스에서 비동기적으로 펌웨어 업데이트를 시작합니다.
function onInitiateFirmwareUpdate(request, response) { console.log('Simulated firmware update initiated, using: ' + request.payload.FwPackageURI); // Complete the response response.send(200, "Firmware update initiated", 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.' ); } }); // Add logic here to perform the firmware update asynchronously }
다음 코드를 추가하여 클라이언트 인스턴스를 만듭니다.
var client = Client.fromConnectionString(connectionString, Protocol);
다음 코드를 추가하여:
- 연결을 엽니다.
- DeviceInfo 개체를 보냅니다.
- desired 속성에 대한 처리기를 설정합니다.
- reported 속성을 보냅니다.
- 직접 메서드에 대한 처리기를 등록합니다.
- 원격 분석 보내기를 시작합니다.
client.open(function (err) { if (err) { printErrorFor('open')(err); } else { console.log('Sending device metadata:\n' + JSON.stringify(deviceMetaData)); client.sendEvent(new Message(JSON.stringify(deviceMetaData)), printErrorFor('send metadata')); // Create device twin client.getTwin(function(err, twin) { if (err) { console.error('Could not get device twin'); } else { console.log('Device twin created'); twin.on('properties.desired', function(delta) { console.log('Received new desired properties:'); console.log(JSON.stringify(delta)); }); // Send reported properties twin.properties.reported.update(reportedProperties, function(err) { if (err) throw err; console.log('twin state reported'); }); // Register handlers for direct methods client.onDeviceMethod('Reboot', onReboot); client.onDeviceMethod('InitiateFirmwareUpdate', onInitiateFirmwareUpdate); } }); // Start sending telemetry var sendInterval = setInterval(function () { temperature += generateRandomIncrement(); externalTemperature += generateRandomIncrement(); humidity += generateRandomIncrement(); var data = JSON.stringify({ 'DeviceID': deviceId, 'Temperature': temperature, 'Humidity': humidity, 'ExternalTemperature': externalTemperature }); console.log('Sending device event data:\n' + data); client.sendEvent(new Message(data), printErrorFor('send event')); }, 5000); client.on('error', function (err) { printErrorFor('client')(err); if (sendInterval) clearInterval(sendInterval); client.close(printErrorFor('client.close')); }); } });
remote_monitoring.js 파일에 변경 내용을 저장합니다.
명령 프롬프트에서 다음 명령을 실행하여 샘플 애플리케이션을 시작합니다.
node remote_monitoring.js
대시보드에서 디바이스 원격 분석 보기
디바이스가 IoT Hub에 보내는 원격 분석 데이터를 원격 모니터링 솔루션의 대시보드에서 볼 수 있습니다.
브라우저에서 원격 모니터링 솔루션 대시보드로 돌아가서 왼쪽 패널의 디바이스를 클릭하여 디바이스 목록으로 이동합니다.
디바이스 목록에서 디바이스의 상태가 실행 중으로 표시되어야 합니다. 그렇지 않은 경우 디바이스 세부 정보 패널에서 디바이스 사용을 클릭합니다.
대시보드를 클릭하여 대시보드로 돌아가 보려는 디바이스 드롭다운에서 디바이스를 선택하여 원격 분석을 봅니다. 샘플 애플리케이션의 원격 분석은 내부 온도가 50 단위이고 외부 온도가 55 단위이고 습도가 50 단위입니다.
디바이스에서 메서드 호출
원격 모니터링 솔루션의 대시보드에서는 IoT Hub를 통해 디바이스에 메서드를 호출하도록 요청할 수 있습니다. 예를 들어 원격 모니터링 솔루션에서 디바이스 재부팅을 시뮬레이션하는 메서드를 호출할 수 있습니다.
원격 모니터링 솔루션 대시보드에서 왼쪽의 디바이스를 클릭하여 디바이스 목록으로 이동합니다.
디바이스 목록에서 사용자 디바이스의 디바이스 ID를 클릭합니다.
디바이스 세부 정보 패널에서 메서드를 클릭합니다.
메서드 드롭다운에서 InitiateFirmwareUpdate를 선택한 다음 FWPACKAGEURI에 더미 URL을 입력합니다. 메서드 호출을 클릭하여 디바이스에서 메서드를 호출합니다.
디바이스가 메서드를 처리하는 경우 디바이스 코드를 실행하는 콘솔에 메시지가 표시됩니다. 메서드의 결과가 솔루션 포털의 기록에 추가됩니다.
다음 단계
미리 구성된 솔루션 사용자 지정 문서에는 이 샘플을 확대하는 방법이 설명되어 있습니다. 가능한 확장에는 실제 센서 사용 및 추가적인 명령 구현이 포함됩니다.
azureiotsuite.com 사이트에 대한 사용 권한에 대해 자세히 살펴보겠습니다.