IT/Network & OS

네트워크 - 1. MQTT

루벤초이 2021. 4. 2. 23:33

MQTT 통신 시리즈입니다.

★Sample Code


웹앱에서 다른 앱이나 서버 등과 통신할 수 있는 다양한 프로토콜 서비스가 있지만, Restful, 웹소켓, MQTT이 자주 사용됩니다.

오늘은 그중 MQTT에 대해 알아볼 텐데요, 사실 MQTT는 웹앱에서만 쓰이는 것이 아니라 광범위하게 사용되는 일반적인 통신 프로토콜입니다.

 

MQTT

MQTT(Message Queuing Telemetry Transport)는 발행-구독(Publish-Subscribe) 구조로 구성되는데요,

말 그대로 누군가 어떤 주제(topic)로 메시지를 발행하면 해당 주제에 가입된, 즉 해당 주제를 구독 중인 디바이스들만 메시지를 받게 됩니다. 또한 이러한 발행-구독 구조에서는 메시지를 전달해주는 메시지 브로커가 필요한데, MQTT에서는 이를 MQTT Broker라고 부릅니다.

 

 

publish-subscribe 개념

 

 

한 가지 중요한 사실은, MQTT는 프로토콜이기 때문에 플랫폼이나 OS에 종속적이지 않다는 점입니다. 

단지 MQTT 프로토콜을 지원하는 SDK(흔히 MQTT Client라고 부르는)가 탑재된 앱이면 통신에 참여할 수 있습니다. 

즉, React 웹앱, 파이썬 서버, 안드로이드 앱, 심지어 로봇이나 드론들과도 (MQTT Client만 탑재하면) 서로 통신할 수 있습니다.

 

이제 MQTT 연결을 실습해 봅시다.

우선 메시지 브로커가 필요하겠죠.

 

MQTT Broker

전에는 Mosca나 Mosquitto라는 유명한 MQTT 브로커가 있었는데, 최근에는 Mosca가 Aedes로 업데이트 되었습니다. MIT 라이선스 오픈 소스 프로젝트이므로 무료로 사용 가능합니다. 

 

moscajs/aedes

Barebone MQTT broker that can run on any stream server, the node way - moscajs/aedes

github.com

구동 방법에는 크게 터미널에서 실행하는 커맨드 라인 인터페이스(CLI; Command Line Interface)와 Node 앱으로 구현해서 실행하는 두 가지 방식이 있습니다.

전자는 별도로 aedes-cli에 소개되어 있는데, 기본적으로 node.js가 설치된 터미널에서

  • 설치: npm install aedes-cli -g  (-g는 글로벌 옵션으로 터미널 쉘에서 실행 가능하도록 전역 설치해줍니다.)
  • 실행: aedes start

Aedes 실행화면

여기까지 하면 1883 포트로 MQTT 연결이 가능해집니다. 일반적인 네트워크를 크게 세 종류로 본다면,

  1. 인터넷에 연결된 디바이스라면 서로 통신할 수 있는 네트워크
    • 인터넷에서 다이렉트로 연결 가능한 Public IP를 가진 디바이스에서 브로커를 실행하고
    • 클라이언트는 이 브로커의 Public IP 주소로 연결합니다. 
    • 이런 경우 보통 AWS EC2 같은 서비스나 유료 호스팅 서비스 등을 이용하거나 일시적으로는 localtunnel 같은 무료 호스팅 서비스를 사용하는 방법이 필요합니다. 호스팅에 관해서는 다른 섹션에서 다루도록 하지요.
  2. 내부에 연결된 디바이스끼리만 통신할 수 있는 네트워크
    • 가령 회사 사내망이나 혹은 집에서 공유기에 물린 디바이스끼리만 통신하는 경우가 있는데
    • 특정 디바이스에서 브로커를 실행하고
    • 클라이언트는 이 디바이스의 IP 주소(보통 공유기에 물릴 경우 192.168.0.x)로 연결합니다.
  3. 로컬 디바이스에서 여러 클라이언트끼리 통신하는 경우
    • 가령 웹앱과 파이썬 앱, C++ 앱 등 여러 앱이 통신할 경우가 있는데
    • 로컬 터미널에서 브로커를 실행하고
    • 클라이언트는 localhost(127.0.0.1)으로 연결합니다.

 

MQTT Broker : Node 앱으로 실행

터미널에서 명령어로 실행하는 방법 대신, Node 앱 형태로 실행하는 방법도 있습니다. 가령 MQTT Broker 기능을 포함한 서버를 만든다거나 할 때 유용하겠죠. 공식 사이트의 Examples 섹션에서 여러 방법을 다루고 있는데, 우리는 Simple plain MQTT server과 MQTT server over WebSocket을 이용해서 구현해보겠습니다.

 

디렉토리를 하나 만들어서 node init 으로 node 앱으로 만든 후 아래 소스 코드를 넣어 node AedesBroker.js를 실행하면 됩니다.

const aedes = require('aedes')()

const PORT_TLS = 1883;
const PORT_HTTP = 8888;


class AedesServer {
    constructor(portHttp = PORT_HTTP, portTls = PORT_TLS) {
        console.log("AedesServer");
        const httpServer = require('http').createServer();
        require('websocket-stream').createServer({ server: httpServer }, aedes.handle);
        httpServer.listen(portHttp, function () {
            console.log('[aedes]http listening on port ' + portHttp);
        })

        const wsServer = require('net').createServer(aedes.handle)
        wsServer.listen(portTls, function () {
            console.log('[aedes]tls listening on port ' + portTls);
        })
    }
}

new AedesServer();

다음 편에서는 MQTT Client를 만들어 통신해 봅시다.

 

 

 

728x90
반응형

'IT > Network & OS' 카테고리의 다른 글

ROS - 3. React 웹앱  (0) 2021.05.27
ROS - 2. ROS2 Web Server & 웹앱  (0) 2021.05.17
ROS - 1. ROS2 설치 및 CLOi 시뮬레이터  (0) 2021.05.17
네트워크 - 2. MQTT Client  (0) 2021.04.08
Art Deco Fonts - 무료 폰트  (0) 2021.03.11