본문 바로가기

2014
마이크로소프트웨어

글: 안진섭 | jinniahn@magice.co / 2014년 5월 12일

 

 

Node.js로 만들어가는 IoT 세상(1)

 

 

Node.js는 왜 주목을 받는가

2013년에는 사물인터넷(Internet of Things, 이하 IoT)의 열기로 뜨거웠다. 구글 글래스, 삼성전자의 갤럭시 기어 등이 발표돼 많은 사람들로부터 관심을 받았고 스마트 칫솔, 스마트 전등처럼 IT와는 전혀 어울릴 것 같지 않는 사물들이 스마트라는 이름을 달고 세상에 나왔다. IoT 기술이 조금씩 우리 주변으로 파고들면서 삶을 바꿔 나가기 시작한 것이다. 이런 제품들을 만들기 위해서는 기본적으로 펌웨어를 작성해야 하지만 오픈소스 하드웨어와 Node.js를 활용하는 방법도 있다. 이번 시간에는 오픈소스 하드웨어와 Node.js를 활용해 IoT를 구현하는 방법을 소개하고자 한다. 그 방법을 설명하기에 앞서 구체적인 IoT의 개념과 Node.js가 IoT에 사용될 때의 장단점을 설명할 것이다. 그리고 관련 오픈소스 프로젝트들까지 살펴본다.

 

 

1회| IoT 분야에서 주목받고 있는 Node.js
2회 | 아두이노와 Node.js를 이용한 IoT 프로젝트
3회 | Node.js 기반의 웹, 모바일, Things를 하나로 연결하기

 

 

 

2013년 말 국내의 한 통신사가 IoT를 주제로 한 여러 편의 광고를 내보내기 시작했다. 외부에 주차돼 있는 자동차가 눈이 오는 것을 감지해 운전자의 스마트폰으로 알림을 보내고, CCTV가 행인을 인식해 거리의 가로등을 밝혀주는 세상을 만들겠다는 내용의 광고였다. IoT 기술을 홍보하기 위한 통신사의 광고로, IoT의 적용 사례를 잘 보여준다. 그러나 현실에서는 아직 이 광고처럼 멋진 세상이 실현되진 않았다. 자동차는 이동을 위한 수단일 뿐이고, CCTV는 설치돼 있는 주변 환경을 관찰하고 기록하는 단순한 기기일 뿐이다. 아직은 그냥 평범한 세상인 것이다. 하지만 근래의 기술적 변화를 보고 있노라면 광고 속에서 봤던 세상이 생각보다 빨리 다가올 수도 있을 것 같다는 생각이 든다. 주변의 모든 사물들이 인터넷으로 연결돼 서로 통신하면서 사용자들에게 유익한 서비스를 제공하는 세상 말이다.

 

IT업계의 대표주자인 구글은 2012년에 웨어러블 기기인 구글 글래스를 공개했고, 지난 2013년에는 개발자들에게 시제품을 판매하기도 했다. 또 SDK를 배포해 구글 글래스 개발자들이 사물을 자동으로 인식해 인터넷 상에서 정보를 찾아주거나, 글을 번역해 주는 기능을 가진 앱들을 만들 수 있도록 했다. 이 제품은 올해 1분기에 출시될 것으로 예상된다. 안경을 쓰는 단순한 행위만으로 자신이 필요한 정보를 얻을 수 있는 세상이 2014년에 드디어 현실화되는 것이다.

 

국내 한 통신사의 IoT 기술 광고
<그림 1> 국내 한 통신사의 IoT 기술 광고

 

이외에도 구글은 무인자동차의 상용화를 목표로 캘리포니아 등지에서 특별 라이선스를 받아 테스트 운행을 진행하고 있다. 멀게만 느껴졌던 IoT 시대가 더 이상 먼 미래의 이야기가 아님을 증명하는 사례들이 여기저기서 나타나고 있다. 또 다른 사례로 칫솔질을 한 횟수와 시간 등을 알려주는 스마트 칫솔, 식사량을 통계내주는 스마트 포크, 약 먹을 시간을 잊지 않도록 도와주는 제품 등이 출시되기도 했다. IT와는 전혀 상관없을 것만 같은 칫솔이나 포크 등의 평범한 물건들이 IoT와 접목되면서 새로운 가치를 만들어내고 있는 것이다.

HAPIfork(좌)와 Beam Brush(우)
<그림 2> HAPIfork(좌)와 Beam Brush(우)

 

앞에서 예로 들었던 IoT들을 살펴보면 공통된 중요한 특징을 찾을 수 있다. 바로 통신기술이다. 통신을 이용해 직간접적으로 인터넷과 연결되고 다른 사물들과 연동된다. 이 기기들은 마치 스마트폰의 앱처럼 인터넷 연결이 없이는 활용도가 떨어진다. 예를 들어 온도계가 있다고 가정하자. 이 온도계가 단순히 온도 측정만 한다면 큰 의미가 없다. 그러나 IoT 기기로서의 온도계는 난방기 등의 다른 기기들과 연동해야 한다. 이런 연결을 가능하게 해주는 것이 네트워크다.

 

Node.js는 IoT 기기의 필수 요소인 네트워크에 최적화돼 있다. 또 센서들과의 연동을 위해 비동기 이벤트를 쉽게 처리할 수 있는 구조를 지니고 있다. 이런 관점에서 보면 Node.js는 IoT 제품을 개발할 때의 대안이 될 수 있다. Node.js는 서버 프로그램을 위해 만들어졌지만 최근에는 서버에 국한되지 않고 여러 영역에서 사용되고 있다.

 

IoT의 정의 및 특징
IoT와 Node.js의 이야기를 하기 전에 IoT에 대해 먼저 알아보는 것이 순서다. 사물인터넷이라는 용어부터 살펴보자. IoT는 1999년 MIT의 캐빈 애비폰(Kevin Ashton)이 처음 사용한 뒤부터 대중화됐고 2009년 다시 <That ‘Internet of Things’ Things>라는 글이 학회에 발표되면서 개념이 더 확실해졌다. 그는 글에서 대부분의 정보들이 사람에 의존하고 있다는 사실과 사람은 정보를 생성하고 처리하는 것에 적합하지 않다고 지적했다. 따라서 사람의 개입 없이 정보를 수집하고 수집된 정보를 다시 재가공하는 시스템이 필요하다고 봤다. 이런 시스템이 바로 IoT이다.

 

IoT에 대한 정의는 전문가들 사이에서도 하나의 합의점을 찾지 못했다. 다음과 같은 몇 가지 정의들이 있다.

• 모든 사물에게까지 네트워크 연결을 제공하는 네트워크의 네트워크(ITU, 2005년)

• 대상물들(objects) 간의 통신이 가능한 네트워크와 서비스(EU policy Outlook RFID, 2007년)

• 데이터 수집과 통신 능력을 이용해 물리적, 가상적 대상들을 연결하는 글로벌 네트워크 인프라(CASAGRAS Final Report, 2009년)

• 표준 통신 프로토콜 기반이면서 독자적인 자체 주소로 상호 연결된 물건들의 세계적인(world-wide) 네트워크(EU IoT in 2020, 2008년)

 

IoT의 3대 요소
<그림 3> IoT의 3대 요소

 

이처럼 여러 가지 어려운 용어를 사용해 정의하고 있지만 정확히 어떤 것인지 이해하기 어렵다. 하지만 자세히 보면 비슷한 용어들이 보인다. ‘사물’, ‘네트워크’, 그리고 ‘서비스가’ 바로 그것이다. 이들 용어를 하나하나 살펴보도록 하자.

 

첫째로 사물은 데이터를 수집할 수 있는 능력과 네트워크 능력을 가지고 있어야 한다. 쉽게 말하면 Wi-Fi가 내장돼 있는 온도계가 사물이라고 할 수 있다. 이 온도계는 방안의 온도와 습도를 정확히 측정해서 수집한 데이터를 네트워크로 다른 사물에 전달할 수 있다. 이렇게 보면 우리가 흔히 사용하고 있는 스마트폰도 일종의 사물로 분류할 수 있다. 우리의 스마트폰은 GPS, 마이크, 가속도 센서 등 각종 센서를 가지고 정보를 수집해서 서버에 데이터를 전송할 수 있는 완벽한 사물이다. 하지만 IoT의 사물은 IT와 관계가 없을 것 같은 사물까지 그 의미가 확대된다. 시계나 안경과 같이 현재 주목받고 있는 제품들 외에도 화분, 컵 등도 센서와 네트워크 기능을 가진 사물이 될 수 있다. 인텔은 이런 사물들이 2020년에는 500억 개가 될 것이라고 예측했다.

 

두 번째, 네트워크는 사물 간의 연결을 담당한다. 여기서 네트워크는 통신 매체, 통신 구조 혹은 통신 프로토콜을 모두 포함하는 포괄적인 개념이다. 앞서 예로 들었던 온도계를 가지고 설명하자면, 온도계에서 측정한 온습도 데이터를 다른 사물 혹은 서버에 보낼 수 있어야 한다. 이때 온도계에 Wi-Fi 모듈이 있다면 무선인터넷을 통해 TCP 프로토콜로 직접 서버에 데이터를 전송하는 것이다.

 

통신 방식에는 Wi-Fi 외에도 블루투스, ZigBee, RFID 등이 있고 통신 방식에 따라 사용하는 프로토콜도 다르게 적용된다. 하지만 현재 출시되고 있는 IoT 기기들의 통신 방식은 크게 Wi-Fi와 블루투스로 나뉜다. 그 중에서도 블루투스 LE가 전력관리 측면에서 유리하기 때문에 대중적으로 사용되고 있다.

 

마지막으로 서비스는 사물들로부터 수집된 정보들을 분석해 의미 있는 정보를 찾아 어떤 판단을 내리는 기능을 말한다. 온도계에서 수집된 온도 정보를 저장만 한다면 아무 의미가 없다. 온도가 너무 낮으면 난방 기구를 작동시켜 온도를 높이는 서비스를 제공하고, 반대로 온도가 너무 높으면 난방 기구를 제어해 온도를 낮춘다. 여기서 한 발 더 나가서 사람들이 있는 시간을 고려해서 온도를 조절할 수 있다면 에너지도 절약할 수 있을 것이다. 이처럼 서비스란 사물에서 정보를 수집해서 유용한 동작을 수행하는 것을 의미한다.

 

IoT 기기의 특징
앞서 IoT의 정의와 그 속에 내재된 세 가지 요소를 각각 살펴봤다. 이제는 최근에 등장하고 있는 제품들을 예로 들면서 이 제품들이 공통적으로 지니고 있는 특징들을 살펴볼 것이다.

 

● 센서 & 액츄에이터
현재의 IoT 기기들은 하나 이상의 센서 혹은 액추에이터를 가지고 있다. 센서를 통해 외부의 세계를 인지하고 액추에이터로 소통한다. 예를 들어 구글 글래스는 카메라와 음성을 인식할 수 있는 마이크 등을 가지고 있다. 이를 통해 사용자의 음성 또는 수신호를 명령으로 받아들인다. 또 안드로이드 폰과 연결해 GPS 정보를 얻기도 한다. 이렇게 얻은 정보를 종합한 결과를 오디오와 프리즘 디스플레이를 통해 표시한다. 이때 카메라와 마이크는 센서가 되고 오디오와 프리즘은 액추에이터가 된다.

 

구글 글라스의 하드웨어 구성
<그림 4> 구글 글라스의 하드웨어 구성

 

● 인터넷을 통한 데이터 수집
나이키의 퓨얼밴드는 센서를 통해 사용자의 운동량과 운동시간을 측정한다. 언제 얼마만큼 움직였는지를 측정해 데이터로 저장한다. 이렇게 측정된 데이터를 기기 내부에만 가지고 있다면 퓨얼밴드가 현재와 같은 성공을 거둘 수 없었을 것이다. 나이키는 이 데이터를 서버에 수집한 뒤 사용자들끼리 경쟁하는 서비스를 제공한다. 사용자들은 이 시스템을 통해 친구들과 경쟁하고 때론 서로를 독려하면서 운동을 즐긴다.

 

이처럼 IoT 기기들은 어떤 식으로든 데이터를 서버에 수집하려고 한다. 서비스 제공자는 데이터를 지속적으로 수집해 변화를 살필 수 있고 빅데이터 분석을 통해 그 안에 숨겨진 의미 있는 정보를 찾아내 서비스에 활용할 수도 있다.

 

● 지능화된 기능 제공
최근에 등장하는 IoT 기기들은 스마트한 기능들을 제공한다. 제품에 따라서 다르겠지만 대개 외부에서 수집한 정보를 분석해서 자체적으로 판단을 내릴 수 있는 기능을 가지고 있다. 2012년 크게 인기를 끌었던 똑똑한 난방제어 장치인 ‘NEST’가 좋은 예다.

 

NEST는 집안의 난방기기를 제어하는 IoT 제품이다. 집안에 있는 사람들의 활동을 감지하는 센서와 온습도 센서를 가지고 있을 뿐 아니라 인터넷을 통해 날씨 정보를 파악하기도 한다. NEST는 이 정보를 바탕으로 집안의 온도를 제어한다. 집안 가족들의 생활 패턴을 학습하고 얼마나 빨리 온도를 제어할 수 있는지도 측정해서 판단의 근거로 삼는다. 정말 스마트한 난방 제어기가 아닐 수 없다. 단순히 온도를 일정하게 유지시키는 것이 아니라 학습을 통해 최적의 환경을 제공한다. 게다가 난방비도 절감할 수 있다. 앞으로의 IoT 기기들은 대부분 NEST와 같이 지능화된 기능을 제공하게 될 것이다.

 

IoT와 Node.js
이제 Node.js에 대해서 이야기할 때가 됐다. Node.js는 2009년 라이언 달에 의해 만들어진 이후 발전을 거듭하고 있다. 아직까지 버전 1.0이 나오지는 않았지만 그 성능이나 안정성에서 인정을 받고 있다. 마이크로소프트 애저 서버의 기본 플랫폼으로 올라가고 링크드인이나 이베이 등과 같은 글로벌 서비스 업체들이 주된 플랫폼으로 사용하고 있기도 하다. 또한 최근에는 서버의 프로그램뿐 아니라 서버를 관리하는 스크립트 언어로서 자리매김하고 있다. 이렇게 세력을 확장 중인 Node.js가 드디어 IoT 분야에서 주목받기 시작했다. Node.js가 가지고 있는 많은 특징 중에서 어떤 점들이 IoT 환경에 적합한지 알아보자. 특히 여기서는 개발, 관리, 비즈니스 관점에서 어떤 특징들이 있는 알아볼 것이다.

 

● 개발 관점에서 본 Node.js
개발 관점에서 본 Node.js의 첫 번째 특징은 강력한 라이브러리에 있다. Node.js를 이야기할 때 NPM(Node Pckage Mnager)을 언급하지 않을 수 없다. Node.js는 모듈을 통해 기능을 확장할 수 있다. NPM은 이런 모듈들을 통합 관리하는 툴이다. 현재 NPM 모듈을 관리하는 npmjs.org 사이트에 공식 등록된 모듈만 5만4,000개가 넘는다. 자바스크립트를 좀더 쉽게 사용할 수 있도록 해주는 모듈은 물론 다수의 통신 프로토콜을 구현한 모듈까지 다양한 모듈이 존재한다. 또 대표적인 오픈소스 하드웨어인 아두이노를 제어할 수 있는 duino와 같은 모듈도 있다. 이렇게 다양한 모듈을 NPM을 통해 쉽게 설치하고 업데이트할 수 있다는 것은 개발자에게 매우 큰 장점이다. 자신에게 필요한 라이브러리를 찾아서 사용할 수 있는 능력만 갖추면 되기 때문이다.

 

두 번째 개발 관점의 특징은 문자열, 객체, 해시, 배열과 같은 고급 자료구조를 제공한다는 점이다. C로 개발을 한다고 가정하자. C로 개발할 때의 어려운 점은 기본적으로 제공되는 자료구조가 많지 않다는 것이다. 때문에 외부의 라이브러리를 사용해야 한다. 대개 이런 종류의 라이브러리는 사용하기가 쉽지 않다. 하지만 Node.js의 경우에는 고급 자료구조들이 기본적으로 제공되고 검증된 확장 모듈들을 통해 다른 자료구조들도 제공된다. 또 메모리 관리 면에서도 가비지 컬렉션을 지원하는 Node.js 쪽이 개발하기에 좀 더 용이하다.

 

개발 관점에서 본 Node.js의 세 번째 특징은 비동기 I/O와 이벤트 기반 프로그램이다. 비동기 I/O와 이벤트 방식 프로그램이라는 점은 Node.js의 가장 큰 특징이다. Node.js에서의 I/O는 블럭되지 않는다. 파일을 읽을 때 프로그램이 파일을 모두 읽을 때까지 기다리지 않는다. Node.js는 I/O가 완료됐을 때 개발자가 미리 등록한 핸들러를 실행한다. 이런 특징 때문에 싱글스레드이면서도 고성능을 발휘할 수 있는 것이다. IoT 기기에서도 I/O를 많이 사용하는데, 센서 값 혹은 액추에어터 동작들은 모두 I/O를 통해 이뤄지며, 네트워크도 대표적인 I/O 중 하나다. Node.js는 비동기 I/O를 통해 저성능의 기기에서도 빠르고 효과적인 I/O 처리를 가능케 한다. IoT 기기들은 기본적으로 이벤트에 의해 동작하게 되는데, 어떤 조건이 발생했을 때 특정 동작이 실행되도록 프로그래밍하는 경우가 많다. 이 경우 Node.js는 클로저를 통해 이벤트 기반 프로그램을 지원한다.

 

● 관리 관점에서 본 Node.js
관리 관점에서 본 Node.js의 첫 번째 특징은 자바스크립트를 언어로 사용한다는 점이다. TIOBE에 따르면 자바스크립트는 프로그래밍 언어 인기순위에서 9위(2014년 1월)에 올랐을 만큼 대중적인 언어다. 웹브라우저 자체가 자바스크립트 실행환경이기 때문에 모든 웹 개발자들은 기본적으로 자바스크립트 개발자라고 말할 수 있다. 더욱이 자바스크립트는 다른 언어들에 비해 배우기가 쉽다(물론 잘 사용할 수 있느냐는 다른 문제지만). 자바스크립트의 이런 특징은 IoT의 개발자 확보 측면에서 유리하다. 새로운 개발 영역을 찾고자 하는 웹 개발자들은 새로운 영역을 개척할 수 있고 개발사는 쉽게 개발자를 확보할 수 있으니 서로에게 도움이 되는 일이다.

 

두 번째는 단일 언어라는 점이다. Node.js는 단말에서 서버영역까지 모두를 커버할 수 있다. 즉, 단일 언어를 사용해서 단말과 서버를 개발할 수 있다는 말이다. 이런 특징은 생각보다 의미가 크다. 단일한 언어를 사용해서 개발하면 단말과 서버의 코드를 공유할 수 있다. 단말과 서버 간의 데이터를 전송할 때도 같은 언어를 사용하면 자료 변환에 따른 오류를 방지할 수 있다. 경우에 따라서는 로직의 일부를 단말로 혹은 서버로 이동시킬 수도 있다. 다시 말해 서버의 부하가 많이 따르는 로직의 일부를 단말에서 처리하도록 하는 것도 가능하다는 얘기다. 단일 언어의 또 다른 장점은 한 개발자가 여러 영역에 걸쳐 작업을 하기에도 용이하다는 점이다. 어떤 한 영역만을 맡아서 개발하면 좋겠지만 늘 그럴 수 없는 상황이 발생하게 마련이다. 단일 언어라면 언어가 다를 때 발생할 수 있는 혼란을 방지할 수 있고 새로운 언어에 적응하는 시간을 최소화할 수 있다.

 

● 비즈니스 관점에서 본 Node.js
비즈니스 관점에서 본 Node.js의 첫 번째 특징은 ‘저사양 고성능’이라는 점이다. 성능은 어느 분야에서나 주요한 쟁점 중 하나다. Node.js는 기본적으로 저사양이면서 고성능을 자랑한다. Node.js는 내부적으로 크롬브라우저에서 사용하는 V8이라는 자바스크립트 엔진을 사용하고 있다. V8에 의해 자바스크립트가 최적화되고 JIT를 통해 네이티브 코드를 동적으로 생성해 실행하는 방식을 취하고 있다.

 

두 번째는 컴파일이 필요치 않다는 점이다. 자바스크립트는 스크립트 언어이다. 스크립트 언어들의 공통적인 특징은 바로 컴파일이 필요 없다는 것이다. 경우에 따라서 자바의 바이트코드와 같은 중간 코드를 생성하는 경우도 있지만 자바스크립트는 기본적으로 컴파일을 하지 않는다. 또 컴파일이 필요 없기 때문에 코드의 이동이 비교적 자유롭다. 즉, 자바스크립트를 동적으로 서버에서 다운로드해서 업데이트할 수 있다. 동적으로 버그를 수정하거나 코드를 업데이트하는 작업도 Node.js를 사용하면 불가능하지 않다.

 

Node.js는 서버 개발을 위해 태어난 플랫폼이지만 특징들을 살펴보면 꼭 서버에만 국한시킬 필요는 없다는 것이 필자의 의견이다. 오히려 IoT 기기들이 가지고 있는 문제를 Node.js를 통해 효과적으로 해결할 수 있다. IoT 기기가 지닌 지능적이고 네트워크 지향적인 특징들은 Node.js가 추구하는 바와 다르지 않다. Node.js의 모듈을 이용한 편리한 개발 환경과 많은 개발자들이 사용하고 있는 자바스크립트를 언어로 사용하고 있다는 점이 큰 장점이다. 또 Node.js의 성능과 유연성은 비즈니스 측면에서도 다른 제품들과의 차별성을 줄 수 있는 요소다.

 

단말, 서버, 응용프로그램으로 연결되는 IoT 시스템

IoT 기기와 서버의 연결
<그림 5> IoT 기기와 서버의 연결

IoT는 크게 단말, 서버, 그리고 애플리케이션 영역을 모두 포함한다. 스마트 시계를 만든다고 해서 단지 시계에 센서와 네트워크 기능을 추가하는 것이 아니라 어떤 데이터를 생성하고 생성된 데이터를 어떤 과정을 통해 네트워크에 연결하며, 서버에 데이터를 보낼 것인지 고려해야 한다. 그리고 많은 단말에서 보내온 데이터를 처리하는 서버는 정제된 데이터를 사용자들이 쉽게 볼 수 있도록 API를 통해 외부로 공개한다. 스마트폰이 서버에서 제공해준 API를 통해 사용자들에게 데이터를 제공하는 원리와 크게 다르지 않다.

 

물론 IoT 기기들이 모두 이와 같은 방식의 연결을 추구하고 있지는 않다. 최근에 등장하고 있는 기기들은 대부분 <그림 5>와 같은 구조를 가지고 있다. 다음은 각 영역별로 어떤 기능이 존재하고 해결해야 할 어떤 문제들이 있는지 짚어보자.

 

● 디바이스 영역
디바이스는 최종 사용자가 사용하게 된 IoT 기기의 영역이다. 디바이스는 서버와의 연결 방식에 따라서 세 가지 다른 방식의 연결 구조를 갖는다. 가장 간단한 방식이 직접 서버에 연동하는 방식이다. 이 경우 디바이스는 유선 혹은 무선으로 인터넷에 연결돼야 한다. 이때 문제는 디바이스가 인터넷에 연결될 수 있도록 네트워크 설정을 어떻게 설정하느냐이다. 보통은 AP와 같은 웹서버를 내장하고 있어서 스마트폰 혹은 PC를 이용해 직접 디바이스에 1:1로 연결해 접속할 네트워크를 설정해 준다. 하지만 이런 방식은 자동화에 익숙한 요즘 시대에 적합하지 않다. 이 문제를 해결하기 위해 필자가 속해 있는 회사는 블루투스를 통해 네트워크를 설정하고, QR 코드를 통해 Wi-Fi를 설정하는 등 다양한 방법을 시도하고 있다.

 

앞서 설명한 것보다 더 쉬운 방법으로 폰 중계방식이 있다. 디바이스가 직접 인터넷에 연결되지 않고 폰을 통해 간접적으로 연결하는 방식이다. 나이키의 퓨얼밴드는 USB와 블루투스를 지원한다. 퓨얼밴드를 통해 수집한 정보를 USB와 블루투스를 통해 PC 혹은 폰에 전송하고 이 데이터를 다시 서버에 전송한다. 데이터에 대한 즉각적인 반영이 필요하지 않는 경우에 이러한 방식이 자주 사용되는데, 직접 연결하는 방식에 비해 연결방식이 간단하다. 하지만 서버에 직접적으로 연결되지 않았기 때문에 인터넷을 통한 외부에서의 제어를 할 수는 없다는 단점이 있다.

 

그 외에 다른 방법은 디바이스를 위한 전용 게이트웨이를 구성하는 것이다. 필립스는 휴(Hue)라는 전등을 애플 스토어를 통해 판매하고 있다. 휴는 전등과 전등을 무선으로 연결하는 AP가 한 세트로 구성돼 있다. 전등과 전용 AP 간에는 이미 네트워크 설정이 돼 있어 특별한 설정이 필요 없다. 단지 게이트웨이를 네트워크에 연결하면 각각의 디바이스가 인터넷으로 연결된다. 이 방식은 첫 번째 방식의 문제인 네트워크 설정을 전용 게이트웨이를 통해 해결했다. 비록 비용이 들기는 하지만 문제를 효과적으로 해결할 수 있다. 여러 종류의 IoT 기기를 생산하는 기업의 경우 게이트웨이를 이용해서 IoT 기기를 연결하는 방식을 선호한다.

 

● 서버 영역
앞서 설명한 것처럼 디바이스는 어떤 방식을 통해서든 디바이스가 수집한 데이터를 서버로 전송한다. 서버는 수많은 디바이스로부터 비교적 작은 데이터를 받아서 처리해야 한다. 이런 요구사항은 페이스북이나 트워터 같은 SNS 업체들이 해결해야 할 문제이기도 하다. 차이가 있다면 형식적인 측면에서 IoT의 데이터가 훨씬 작고 일정한 형태를 가지고 있다는 점이다. 또한 양적인 측면에서 볼 때 훨씬 많은 디바이스가 연결되기 때문에 디바이스를 효과적으로 관리해야 한다. 이외에도 단말의 인증, 단말의 관리, 데이터의 적합성 검사 등 많은 기능을 담당해야 한다. 아울러 서버 데이터를 외부 API로 스마트폰이나 다른 장치들이 사용할 수 있도록 제공하는 역할도 담당해야 한다.

 

서버는 특정 IoT 기기만을 위한 비공개 서버와 공개된 API로 어떤 기기든 이용할 수 서버가 있다. 전자가 특정 기업, 특정 기기들을 위한 비공개 IoT 플랫폼이라면 후자는 오픈 IoT 플랫폼이다. 오픈 IoT 플랫폼은 IoT 기기를 만드는 업체의 입장에서 비교적 적은 비용으로 종합적인 서비스를 이용할 수 있다는 장점이 있다. 잘 알려진 오픈 IoT 플랫폼으로는 Xively.com이 있다. Xively는 이전에 pachube라는 이름으로 잘 알려진 서비스다. 2011년 일본의 원전 사고 이후에 사람들이 xively를 이용해 방사능 데이터를 수집하면서 유명세를 탄 서비스다.

 

● 애플리케이션 영역
서버의 데이터는 내부에서 정제된 후 웹, PC 혹은 모바일에서 사용할 수 있는 형태로 제공된다. 이때 API를 통해 공개하는데, 보통은 RESTful 방식을 사용한다. IoT 기기들은 디바이스의 정보를 표시하거나 제어할 목적으로 스마트폰 앱을 제공한다. 이때 서버의 공개된 API가 있다면 이를 이용해서 다른 앱을 만들 수 있다.

 

위에서 살펴본 IoT 시스템을 단말과 서버, 그리고 정보를 이용하는 애플리케이션 영역으로 나눠 살펴봤다. 현재의 IoT는 어떤 한 부분만 한정할 수 없게 됐다. IoT 기기를 사용하는 사용자의 높아진 눈높이를 맞추기 위해 단말은 물론 서버를 포함한 외부 시스템과의 연동까지 고려해야 한다. IoT 기기를 만드는 것이 그만큼 까다로워졌다는 말이다. 특히 작은 기업에서 단말과 서버 그리고 외부 응용프로그램까지 만들어야 하는 것은 비용과 인력 면에서 쉽지 않은 일이다. 이런 문제를 해결하기 위해 최근에는 각 영역별 서비스를 제공하는 업체들이 등장하기 시작했다. 서버 영역에 해당하는 업체로 앞에서 살펴본 xively와 국내업체로는 Open IoT Planet 등이 오픈 플랫폼을 지향하면서 다양한 사물을 연결하는 IoT 플랫폼을 제공하고 있다. 또 게이트웨이에 해당하는 제품으로 Revolv가 눈에 띈다. 이 제품은 타사의 제품들을 서로 연결시키는 역할을 한다. IoT 기기가 확산되면 이런 영역별 전문 기업과 솔루션 등이 등장해서 저렴한 비용으로 이런 기능을 사용할 수 있을 것이다. 그렇게 되면 중소 IoT 기업들도 종합적인 서비스를 제공할 수 있을 것이다.

 

Node.js가 극복해야 할 과제
Node.js가 동작하기 위해서는 현 시점에서 리눅스와 같은 OS가 설치돼야 한다. 이로 인해 많은 제약이 생겨나게 된다. 첫째로 비교적 고사양의 하드웨어가 필요하다. 리눅스가 저사양의 임베디드 시스템에 사용되는 것으로 잘 알려져 있지만 아두이노와 같은 펌웨어 기반 시스템에는 비할 바가 아니다. 또 실시간으로 동작해야 하는 중요한 시스템에는 사용할 수 없다. 리눅스와 같은 OS는 RTOS가 아니다. 즉, 어떤 API를 실행하기 위해 얼마나 많은 시간이 소요될지 예측하기 어렵고 시간이 일정하지도 않다. 때문에 Node.js만으로는 정밀한 기기를 제어하는 것이 쉽지 않다. 그래서 Node.js를 이용해서 실시간 시스템을 만들 때는 펌웨어를 사용하는 아두이노와 같은 시스템을 같이 사용해야 한다.

 

IoT 단말에서 Node.js를 사용할 때는 싱글 시스템과 듀얼 시스템 이 두 가지를 사용할 수 있다.

싱글 시스템 : 시스템의 OS로 리눅스가 설치돼 있고 Node.js를 이용해서 보드의 GPIO와 같은 외부 연결 핀들을 제어 할 수 있는 시스템이다. 라즈베리파이와 비글본이 여기에 해당한다.

듀얼 시스템 : 2개의 다른 시스템을 이용하는 방식으로 노드를 위한 고사양의 시스템과 센서 등을 제어하기 위한 펌웨어 기반의 시스템을 동시에 이용하는 방식이다. 실시간성이 중요하면서 복잡한 기능을 수행해야 하는 경우에 사용된다. 최근에는 하나의 보드에 2개의 시스템을 올리는 아두이노 YUN이나 인텔의 갈릴레오와 같은 제품들이 등장했다.

 

Node.js를 이용하기 위한 두 종류의 시스템
<그림 6> Node.js를 이용하기 위한 두 종류의 시스템

 

Node.js는 OS를 기본적으로 요구하고, IoT에서는 고사양에 해당하는 하드웨어 스펙을 요구한다. 그런데 이런 부분이 꼭 단점이라고 할 수는 없다. 최근 하드웨어의 가격 하락과 IoT 기기들의 복잡한 기능들을 생각해보면 Node.js는 단점보다 장점이 더 많다. 비록 실시간 프로그램에 적합하지 않은 점도 있지만 아두이노와 같은 시스템을 추가적으로 연결하면 이 문제도 해결할 수 있다. 최근에 아두이노 YUN이나 인텔의 갈릴레오와 같은 제품들은 두 가지 다른 시스템을 하나의 보드에 통합하는(on-board) 경향을 보이고 있어 크게 문제가 되지 않을 것으로 생각된다.

 

Node.js 오픈소스 프로젝트
Node.js를 이용해 하드웨어를 제어하기 위한 시도들이 있었다. 그 결과로 duino나 firmata와 같은 모듈이 만들어졌다. 이 모듈들은 다시 다른 오픈소스에 영향을 주었다. 그 중에서 몇 가지 프로젝트를 살펴보자.

 

● duino와 firmata
duino라는 이름은 아두이노(Arduino)에서 따온 것이다. 이름에서도 알 수 있듯이 아두이노를 제어하기 위한 모듈이다. duino는 앞서 언급했던 듀얼 시스템을 가정하고 있다. 소스는 크게 두 부분으로 나뉘는데, 호스트 시스템의 명령을 받아서 처리할 아두이노 프로그램인 du.ino와 호스트상의 애플리케이션에서 아두이노를 제어하는 duino 라이브러리가 그것이다. 이 둘은 시리얼 통신으로 연결된다. 이때 사용되는 통신 프로토콜은 모듈에서 자체 정의한 것이다.

 

duino의 연결 구조
<그림 7> duino의 연결 구조

이와 동일한 방식을 쓰는 모듈이 또 하나 있다. Firmata(관련 Git)라고 하는데, 구조는 duino와 동일하다. Firmata는 호스트에서 시리얼로 아두이노를 제어하는 방식이다. 차이점은 통신에 사용되는 통신 프로토콜이 firmata라는 표준 프로토콜을 사용하고 있다는 점이다. 또 아두이노의 IDE에 firmata 2.2를 지원하는 예제 프로그램이 기본적으로 탑재돼 있다. Firmata의 장점은 표준 프로토콜을 사용하기 때문에 시리얼을 제어할 수 있는 모든 플랫폼에서 다양한 언어를 사용할 수 있다는 점이다.

 

Node.js로 아두이노를 사용하는 모든 프로젝트들은 앞에서 소개한 2개의 라이브러리를 이용한다. 다음으로 소개할 heimcontrol 프로젝트도 그 중에 하나다.

 

● Heimcontrol
좀 더 실질적인 예제가 될 만한 오픈소스로는 heimcontrol이 있다. 이 프로젝트는 아두이노와 라즈베리파이를 이용해서 홈 오토메이션을 구현한 것이다.

1402_SC4_8
<그림 8> Heimcontrol

 

이 프로젝트는 2개의 보드를 사용하고 있는데, 센서와 LED 제어를 위해 아두이노가 사용됐고 Node.js로 외부에서 웹을 통해 제어하기 위해 라즈베리파이가 사용됐다. <그림 7>은 2개의 보드가 어떻게 연결돼 있는지 보여준다. 이 프로젝트는 무선을 사용하지 않고 유선 연결을 시도했다. 두 보드 간의 연결은 앞서서 살펴봤던 duino 모듈이 사용됐다.

 

이 프로젝트는 Node.js의 장점을 잘 활용한 사례라고 할 수 있다. Node.js의 다양한 모듈을 이용해 웹 인터페이스를 제어하는가 하면 아두이노나 라즈베리파이의 GPIO를 제어하기도 한다. 현재는 외부에 웹페이지를 통해 정보를 제공하고 있지만 RESTful을 통해 정보를 제공할 수도 있을 것이다.

 

Heimcontrol의 웹 인터페이스
<그림 9> Heimcontrol의 웹 인터페이스

 

● Bonescript

비글본 블랙
<그림 10> 비글본 블랙

요즘 주목 받고 있는 오픈소스 하드웨어 중에 비글본 블랙이라는 보드가 있다. 신용카드 크기에 1GHz의 프로세서, 512MB 램을 가지고 있다. 3D 가속까지 가능한 작은 컴퓨터라고 할 수 있다. Bonescript는 비글본 블랙의 핀들을 제어할 수 있는 Node.js 모듈을 제공하고 있다. 이 API를 이용해서 센서나 모터 등을 아두이노와 같은 시스템을 거치지 않고 바로 제어할 수 있다.

 

Bonescript는 Node.js이기는 하지만 아두이노의 API와 유사한 점이 많아 아두이노 API를 알고 있는 개발자는 이를 쉽게 익힐 수 있다. Bonescript를 이용해서 보드에 있는 GPIO는 물론 serial, SPI, I2C까지 제어할 수 있다.

 

● Node-RED
보통 개발은 에디터를 이용해서 코드를 작성하는 방식으로 이뤄진다. 하지만 최근에는 스크래치 스타일의 비주얼 툴을 이용해서 프로그램을 작성하는 방식도 많이 사용된다. 지금 소개하려는 Node-RED는 이런 트렌드에 부합되는 프로젝트이다. 즉, Node.js를 이용하는 비주얼 저작 도구다. 기능들을 박스 형태로 미리 만들어 두고 이들 간의 관계를 선으로 연결하면서 프로그래밍하는 방식이다(<그림 11> 참조).

 

Node-RED는 라즈베리파이나 비글본 블랙과 같은 플랫폼에 직접 프로그램을 작성해 바로 실행시킬 수 있다. 또 firmata 라이브러리를 이용해서 아두이노를 시리얼로 연결해 프로그래밍할 수도 있다.

 

Node-RED
<그림 11> Node-RED

 

아직까지는 많이 사용되는 방식은 아니지만 앞으로 IoT가 확산되고 개발자뿐 아니라 일반 사람들도 간단한 프로그램을 작성할 수 있는 환경이 마련된다면 이런 식의 비주얼한 저작 도구 수요가 분명히 생겨날 것이다. 그런 의미에서 이런 식의 접근은 눈여겨봐야 한다. 비슷한 방식의 접근으로 BlocklyDuino가 있다.

 

● Espruino
Node.js와 직접적인 관련은 없지만 자바스크립트와 관련된 재미있는 프로젝트가 있어서 소개하고자 한다. 이 프로젝트 역시 아두이노와 관련이 있다. 아두이노는 C/C++ 형태의 언어로 개발을 진행하는데, C/C++는 결코 쉬운 언어가 아니다. Espruino는 C/C++ 대신 자바스크립트를 이용해서 개발할 수 있는 환경을 제공해준다. 여기까지는 앞서 설명했던 프로젝트들과 비슷하다. 앞의 프로젝트들과 이 프로젝트의 차이점은 자바스크립트 엔진을 칩에 내장했다는 것이다.

 

Espruino의 프로그래밍
<그림 12> Espruino의 프로그래밍

 

Espruino는 크롬 브라우저의 플러그인으로 개발 환경을 제공한다. 따로 IDE를 설치하지 않고 웹브라우저에서 프로그래밍과 디버깅을 동시에 할 수 있다. 또 MIT의 스크래치와 같은 개발 환경인 Blockly로도 개발이 가능하다. 자바스크립트 엔진에 의해 프로그램이 동작하기 때문에 펌웨어 방식의 아두이노보다 조금 느리지만 컴파일 과정이 필요 없고 디버깅에 유리하다.

 

Espruino에는 OS가 없기 때문에 Node.js와 같이 OS 위에서 동작하는 방식의 문제인 타이밍 이슈가 발생하지 않는다. 또 이 프로젝트는 오픈 프로젝트로 진행되고 있어 내부 동작이 어떻게 되는지도 확인할 수 있다.

 

 

[참고자료]
1. 사물인터넷, IoT(Internet of things)는 무엇일까?
2. duino(github.com/ecto/duino)
3. Node-RED(nodered.org)
4. heimcontrol.js(github.com/ni-c/heimcontrol.js)

 

 

 

/필/자/소/개/

 

 

MS_writer_anjinsub.jpg안진섭 jinniahn@magice.co | 중학교 때부터 컴퓨터 프로그래밍을 배우기 시작해 이제는 프로그래밍을 취미로 하는 평범한 개발자다. 주로 모바일과 서버 프로그램을 다루며, Emacs와 맥을 좋아한다. 프로그래밍 언어로는 루비, 파이썬, 자바스크립트를 선호하며 모바일과 컴퓨터에도 관심이 많다. 최근에는 사물인터넷에 관심을 가지기 시작해 초소형 컴퓨터로 주변의 평범한 사물들을 스마트하게 만드는 재미에 빠져 있다. 집과 사무실의 기기들을 인터넷에 연결해서 손가락 하나로 모든 것을 제어할 수 있는 집을 만드는 것이 꿈이다.

 

 

 

※ 본 내용은 (주)마소인터렉티브(http://www.imaso.co.kr/)의 저작권 동의에 의해 공유되고 있습니다.
    Copyright ⓒ Maso Interactive Corp. 무단전재 및 재배포 금지

    [원문출처 : http://www.imaso.co.kr/news/article_view.php?article_idx=20140512160053]

 

 

 

공개SW 기술팁 - 번호, 제목, 조회수, 작성
번호 제목 작성 조회수
2 [Node.js] (1) Node.js는 왜 주목을 받는가 2014-08-20 3073
1 [사물인터넷] 사물 간 통신: 핵심 기술 및 연구 이슈 2014-04-29 1965
맨 위로
맨 위로