> For the complete documentation index, see [llms.txt](https://metatron-grandview.gitbook.io/meatatron-grandview/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://metatron-grandview.gitbook.io/meatatron-grandview/iotdevicedev/iot-hub.md).

# Quick Start - IoT hub 개발

IoT hub 무료 제품을 사용하여 Node.js 프로그램으로 실제 클라우드에 데이터를 전송해보는 방법을 설명합니다.

## Azure 클라우드에 IoT hub 와 IoT 디바이스 만들기&#x20;

### 1. 로그인 및 평가판 가입&#x20;

<https://portal.azure.com> 으로 이동하여 Azure 클라우드 계정을 만들고, 로그인합니다. \
이미 계정을 갖고 계신 경우 그 계정을 사용하셔도 됩니다. \
로그인 하신 이후 **평가판 시작**을 클릭해 평가판 가입하시기 바랍니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8A2nD5kQmYlIhw0Xj%2F-Mc8BcDkW2HNpKIW59qI%2Fmg_img_text_08.png?alt=media\&token=6b9b48ad-f819-4c9c-8389-828e0444f34c)

모든 테스트가 끝난 이후에는 반드시 리소스를 모두 삭제하셔서 사용료가 결제되지 않도록 주의합니다.

{% hint style="info" %}
그랜드뷰 관련 협력 파트너에게는 개발/테스트를 위한 IoT hub 환경을 무료로 제공해드립니다.

* 디바이스 커넥션 스트링
* Azure IoT Explorer 용 커넥션 스트링
  {% endhint %}

### 2. 리소스 만들기&#x20;

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8A2nD5kQmYlIhw0Xj%2F-Mc8B91Zxue2etTcSSfF%2Fmg_img_text_07.png?alt=media\&token=99544aa4-d798-43bb-9386-2f0a5abb0b30)

리소스 만들기 메뉴를 클릭해 범주의 사물 인터넷 클릭 후 맨위의 IoT Hob 만들기를 클릭합니다.

### 3. IoT Hub 만들기

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8BfnwHSAVwJSlyNS0%2F-Mc8DBgQdSAb8Ibnj31g%2Fmg_img_text_11.png?alt=media\&token=e4caeb54-6189-4132-a594-3b1f4185c2c7)

리소스 그룹은 새로 만들기를 클릭하고, "iothubfree" 를 입력합니다. \
지역은 한국 중부를 선택하고, IoT hub 이름은 고유한 ID 로 입력합니다.&#x20;

**관리** 탭으로 이동합니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8BfnwHSAVwJSlyNS0%2F-Mc8CwEDMAYH70BCVj5-%2Fmg_img_text_10.png?alt=media\&token=c210e13e-cb65-49e7-88a5-fb738d8c9372)

위 예제 이미지와 같이 F1: 무료 계층을 선택합니다. 무료 계층은 구독 당 1개로 제한되고, 몇 가지 고급 기능을 사용할 수 없지만 단순히 클라우드에 MQTT 메시지 보내는 개발/테스트 용도로 쓰기에는 충분합니다.

왼쪽 하단의 검토 + 만들기를 클릭하면 IoT hub 가 몇 분 후에 생성되며, 이후 IoT Hub 리소스로 이동합니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8DE-QlOaeIqP1O86A%2F-Mc8E7Zhw3pGWBJfmMDY%2Fmg_img_text_12.png?alt=media\&token=2c522a43-e5ee-44a0-8191-bf8898124be9)

왼쪽 메뉴에서 모든 리소스를 클릭하고 검색창에 iothub 를 입력하면 쉽게 찾을 수 있습니다.

### 4. 디바이스 만들기&#x20;

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8DE-QlOaeIqP1O86A%2F-Mc8JLICoouRn9VDT4yk%2Fmg_img_text_13.png?alt=media\&token=10fee296-6c06-4dd8-a008-0ca4b7785a5e)

메뉴에서 탐색기의 IoT 디바이스를 클릭 후 새로 만들기를 클릭합니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8DE-QlOaeIqP1O86A%2F-Mc8LMJgbiwEWtHFFFwx%2Fmg_img_text_14.png?alt=media\&token=f1b93aba-9c23-4474-b52a-bb98c8ece101)

디바이스 ID 에 사용할 적당한 ID 값을 입력하고 하단의 만들기를 클릭합니다. \
\
만들어진 디바이스 ID를 클릭하면 아래의 화면이 보여집니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8MUidQhxY_PGAr5DF%2F-Mc8MzJ3bVtFZkeGVv-t%2Fmg_img_text_17.png?alt=media\&token=0e58d9e6-155f-406f-862b-896bb752ca85)

기본 연결 문자열은 커넥션 스트링입니다. 기본 연결 문자열 텍스트를 복사 합니다.\ <img src="https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8DE-QlOaeIqP1O86A%2F-Mc8MOaKeYE9XZCHkq_9%2Fgit_ico_0101.png?alt=media&amp;token=390960c7-84b4-4f38-95c2-a8b30cb15bca" alt="" data-size="original">을 누르면 마스킹된 커넥션 스트링을 평문으로 볼 수 있으며, 텍스트 박스 오른쪽<img src="https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8DE-QlOaeIqP1O86A%2F-Mc8MQu82XQy1G1PhTff%2Fgit_ico_0102.png?alt=media&amp;token=fefc72b1-a7c3-421e-9676-cac09947731d" alt="" data-size="original">아이콘을 \
누르면 자동으로 커넥션 스트링 텍스트를 복사 합니다.

## Node.js 테스트 프로그램으로 메시지 보내보기

<https://nodejs.org/ko/> 에서 안정적인 버전을 다운로드 받고 설치 합니다. 설치 위치를 기록해두셨다가 nodejs 실행파일의 경로를 시스템 변수 PATH 에 등록하시기 바랍니다. 일반적으로 자동으로 PATH 등록이 진행되지만, 그렇지 못한 경우에는 수동으로 PATH 에 입력해야 할 수 있습니다.

Node.js 용 IoT 디바이스 샘플 어플리케이션을 제공해드립니다. 아래 링크를 클릭해서 다운로드 받으시고 \
적당한 위치에 압축을 푸시기 바랍니다.

{% file src="/files/-M\_SXmKtSpvN-\_f\_nJtK" %}

쉘을 열어서 압축을 푼 위치로 이동합니다. 윈도우 OS 사용자는 cmd 명령으로 DOS 쉘을 여시면 됩니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8-WJZGswZ-AgHIB1e%2F-Mc83IIvuMMe7jOU3Lxn%2Fmg_img_text_04.png?alt=media\&token=a305e4a0-ed20-4035-946f-833e8f762c27)

```aspnet
PS C:\Users\mjher\Desktop\새 폴더> npm install
added 142 packages from 208 contributors and audited 142 packages in 9.4s

5 packages are looking for funding 
 run 'npm fund' for details
 
found 0 vulnerabilities 
 
PS C:\Users\mjher\Desktop\새 폴더>
```

쉘에 npm install 이라고 명령을 입력하면 package.json 파일에 지정된 npm 모듈들이 자동으로 설치됩니다.

SimulatedDevice.js 파일을 텍스트 에디터로 엽니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8-WJZGswZ-AgHIB1e%2F-Mc84iINGgl5Cp7esUON%2Fmg_img_text_05.png?alt=media\&token=26f9bb52-cc98-4c5a-bce4-c9a9843bea9b)

```javascript
'use strict';

var connectionString = "붙여넣기";
var serviceId = "1";
var deviceId = "device";

var Mqtt = require('azure-iot-device-mqtt').Mqtt;
var Client = require('azure-iot-device').Client;
var Message = require('azure-iot-device').Message;

var client = Client.fromConnectionString(connectionString, Mqtt);

//Timeout created by setInterval
var intervalLoop = null;
```

앞에서 copy 해두었던 커넥션 스트링을 붙여넣기라 되어 있는 부분에 넣습니다. 기존에 있던 붙여넣기 라는 문구는 삭제하시고 따옴표 내에 붙여넣으시기 바랍니다.

쉘에서 node SimulatedDevice.js 라고 입력합니다. js 파일이 위치한 같은 디렉토리/폴더 내에서 실행해야 합니다.

```
PS C:\Users\mjher\Desktop\새 폴더> node .\SimulatedDevice.Js
Client connected
message sent{"serviceId":"1","diviceId":"device","timestamp":1620772209308,"contents":{"temperature":22.857710189195238,"humidity":72.28566755017717,"illuminance":100}}
message sent{"serviceId":"1","diviceId":"device","timestamp":1620772210313,"contents":{"temperature":28.803487837307678,"humidity":62.10569874897759,"illuminance":100}}
message sent{"serviceId":"1","diviceId":"device","timestamp":1620772211323,"contents":{"temperature":30.632854507286666,"humidity":65.12026770091586,"illuminance":100}}
message sent{"serviceId":"1","diviceId":"device","timestamp":1620772212337,"contents":{"temperature":24.10516148628943,"humidity":61.45916004813632,"illuminance":100}}
message sent{"serviceId":"1","diviceId":"device","timestamp":1620772213351,"contents":{"temperature":25.96091841183808,"humidity":73.61279451435996,"illuminance":100}}
PS C:\Users\mjher\Desktop\새 폴더>
```

그러면 샘플 프로그램은 1초 간격으로 데이터를 IoT hub 로 전송합니다.

```
{
   "serviceId":"1",
   "deviceId":"device",
   "timestamp":1620772213351,
   "contents":{
      "temperature":25.96091841183808,
      "humidity":73.61279451435996,
      "illuminance":100
   }
}
```

이런 모습의 데이터입니다. 온도(temperature 필드), 습도(humidity 필드), 조도(illuminance 필드) 가 랜덤 값으로 채워져 1초 마다 서버로 전송됩니다. ctrl+c 를 누르면 프로그램을 멈출 수 있습니다.

이 샘플 프로그램의 구조는 IoT 디바이스를 개발하실 때 좋은 시작 지점이 될 것입니다. \
아래와 같은 기본적인 기능들을 모두 포함하고 있기 때문입니다.

* IoT hub 에 연결하기 위한 디바이스마다 고유하게 부여되는 커넥션 스트링 지정<br>
* 그랜드뷰 서비스에 데이터를 전송하기 위해 필요한 메시지 표준 구조 사용<br>
* 서버에 보낼 데이터를 얻고 JSON 으로 구조화<br>
* 주기적으로 서버에 데이터 전송&#x20;

이외에도 IoT 디바이스가 사용할 수 있는 고급 기능들은 아래와 같습니다. \
이런 주제들은 모두 따로 메뉴얼로 제공되고 있습니다.

* Policy profile 을 통한 디바이스 원격 설정
  * 디바이스의 펌웨어가 configuration driven 방식으로 개발된 경우 개별 디바이스마다 설정을 따로 관리하고 원격에서 업데이트 가능<br>
* 펌웨어 OTA
  * 디바이스 펌웨어 원격에서 업데이트 가능
  * 단 원격 리부팅과 자동 펌웨어 업데이트가 구현되어 있어야 함<br>
* 원격 명령 전송
  * 펌웨어에 대한 원격 명령 전송
    * 리부팅 등과 같은 특정 동작 수행 가능
  * 설비에 대한 원격 명령 전송
    * 펌웨어가 설비에 대한 명령을 수신하고 설비에 해당 신호를 보내는 형식

## IoT hub 에서 메시지 확인해보기

{% hint style="warning" %}

### 사전 준비 사항

<https://github.com/Azure/azure-iot-explorer/releases> 에서 자신의 환경에 맞는 설치파일을 \
다운로드 합니다. 윈도우 OS 사용자는 msi 파일을 받습니다.&#x20;
{% endhint %}

{% hint style="warning" %}
현재 Azure IoT Explorer 프로그램은 preview 버전으로, 일부 기능들이 정상 동작하지 않습니다.
{% endhint %}

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8MUidQhxY_PGAr5DF%2F-Mc8Sv4BMqA6E7SM-xGn%2Fmg_img_text_20.png?alt=media\&token=ca66ecd2-0951-4127-8145-25393f9d31f8)

Azure 포탈의 IoT hub 페이지 메뉴에서 공유 엑세스 정책을 클릭하고 iothubowner 를 선택하면 오른쪽에 패널이 나타납니다. 여기서 Primary connection string 을 복사합니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8MUidQhxY_PGAr5DF%2F-Mc8RrpmeNgdy6U3b-zC%2Fmg_img_text_19.png?alt=media\&token=6282d504-f77d-407c-b28d-5d82b43b728d)

**+ Add connection** 을 클릭하고 복사했던 커넥션 스트링을 붙여넣은 후 저장합니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8MUidQhxY_PGAr5DF%2F-Mc8Wjm6hbUKaE_jf4ZH%2Fmg_img_text_21.png?alt=media\&token=d7624cb2-c328-4901-a815-c1cdb5b7e912)

자동으로 만들었던 디바이스들이 표시됩니다.

Node.js 프로그램과 연결되어 있는 디바이스를 클릭합니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8WlwHgvTqM7VhmvXj%2F-Mc8XF3ut7ebyRzs9aSp%2Fmg_img_text_22.png?alt=media\&token=ab80ebd3-1e9f-45d8-9e22-4768e9087f39)

Telemetry 를 선택하고 Start 를 클릭합니다. 그러면 이 프로그램은 IoT hub 에 들어오는 메시지를 모니터링하게 됩니다.

Node.js 프로그램에서 데이터를 보내기 시작하면 아래 그림처럼 데이터를 수신하는 것을 확인할 수 있습니다.

![](https://665401279-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MYcaEPPtq6ifUkinzY2%2F-Mc8XHGXAGzhgcykRlhB%2F-Mc8YFkVgEiuaUCOXd8E%2Fmg_img_text_24.png?alt=media\&token=e9d6ad2c-11d1-4ba7-90bf-58ec64fcb397)

서버에 실제로 데이터가 어떻게 흘러오는지 확인할 수 있습니다.

여기까지 개발이 되었다면 실제 그랜드뷰 서비스에 데이터를 보낼 수 있는 기본적인 준비가 끝났습니다.\
하지만 샘플 프로그램은 말 그대로 샘플이며, 다양한 예외 상황에 대처할 수 있도록 펌웨어의 완성도를 \
높여야 합니다.

* 통신이 완전히 불가능할 때 펌웨어가 어떻게 동작할지<br>
* 일시적인 통신 불안정으로 IoT hub 에 데이터를 보내지 못한 경우 데이터를 어떻게 처리할지<br>
* 데이터 원천에서 데이터를 얻지 못했을 때 펌웨어는 어떻게 동작할지

{% hint style="info" %}
Azure SDK 를 기반으로 펌웨어를 개발하시는 것을 권고 드립니다. IoT hub 용 SDK 는 대표 언어 별로 제공되고 있으니 아래 URL 에서 확인하시기 바랍니다.

<https://docs.microsoft.com/ko-kr/azure/iot-hub/iot-hub-devguide-sdks#azure-iot-hub-device-sdks>

SDK 를 사용하지 않고 MQTT 메시지를 직접 분석하여 개발하는 방법도 있으며 Azure 클라우드에서 그것을 막지는 않습니다. 그러나 그 경우에는 개발 관련 기술지원이 전혀 불가능합니다.
{% endhint %}

## 샘플 코드와 SDK

마이크로소프트에서는 주요 언어 별 SDK 와 샘플코드를 Github 에서 제공하고 있습니다. \
아래 페이지를 확인하여 필요한 SDK 와 샘플코드를 다운 받으시기 바랍니다.

{% embed url="<https://docs.microsoft.com/ko-kr/azure/iot-develop/about-iot-sdks>" %}

{% embed url="<https://docs.microsoft.com/ko-kr/azure/iot-hub/iot-hub-devguide-sdks>" %}
