MQTT + NodeJS로 통신하기

2021. 3. 29. 22:23Dev/Etc

캡스톤디자인 프로젝트에서 MQTT를 이용하여 통신할 일이 있다.

따라서 MQTT를 공부하면서 내 나름대로 정리를 해 보고, 실제로 라즈베리파이를 허브로 두고 웹 서버와 통신한 예제를 간단하게 써볼것이다.

* MQTT란?

HTTP/TCP와 같이 Client <> Server 구조로 통신하는 것이 아닌, Publisher <> Broker <> Subscriber의 구조로 통신하는 통신 프로토콜로, 전력량이 낮아 IOT 등의 통신에 매우 적합한 통신 프로토콜이다.

브로커를 통해 1:1 뿐 아닌 1:N, N:M 통신도 수월하다.

 

* Broker

일반적으로 이 Broker를 구현하는 것은 힘들기 때문에, Mosquitto등을 사용하는 것이 일반적이다. Broker를 통해 장치는 Publishing을 할 수도, Subscribe를 할 수도 있다.

 

그렇다면 실제로 해보자!

Broker

라즈베리파이의 OS 라즈비안은 linux기반이므로 linux에 설치하듯이 하면 된다.

sudo apt install mosquitto

 

설치 한 후 제대로 설치 및 실행이 됐는지 확인해보려면 터미널에 아래와 같이 입력한다.

sudo systemctl status mosquitto.service

Active : Running 을 확인할 수 있다.

 

Client

나는 라즈베리파이에서 메시지를 Publishing 하고 Mac OS에서 Subscribe을 하기 위해 NodeJS를 위한 간단한 코드를 작성해봤다.

npm install mqtt --save

먼저 mqtt 모듈을 설치한다.

const mqtt = require('mqtt');
const options = {
    host : 'Raspberry IP Address',
    port : 1883,
};
const client = mqtt.connect(options);

client.subscribe('test');

client.on('message', (topic, message) => {
    console.log('토픽 : ', topic, '메시지 : ', message.toString());
});

Mosquitto의 포트는 기본적으로 1883으로 제공되고, host 주소는 라즈베리파이의 IP 주소를 사용하면 된다.(공유기를 사용한다면 192.168.xx.xx 처럼 될 것이다).

이후 client를 test topic을 구독하게 하면 이제부터 test topic에서 publishing이 될 때마다 메시지를 받을 수 있다!

(참고로 메시지는 Buffer로 오기 때문에, toString으로 변환해줘야 제대로 읽을 수 있다.)

반대로 NodeJS에서 Publish를 하고 다른 장치에서 Subscribe를 하는 것 또한 물론 가능하다.