우분투 MQTT 서버구축과 기본 개념

우분투 MQTT 서버구축과 기본 개념

 

우분투로 MQTT 서버를 구축하는 법에 대해서 알아봅시다.

먼저 준비물은 우분투 16 or 18 버전이 필요합니다.

 

MQTT 개념

MQTT는 HTTP, TCP/IP 같은 통신 프로토콜입니다.

프로토콜이란 규약, 약속이라는 뜻이 있습니다.

HTTP를 예로들면, HTTP의 약속,규약은 클라이언트가 서버로 요청을 보내면, 서버는 응답값을 클라이언트로 보내고 연결을 끊는다는 약속이 있습니다.

 

MQTT의 약속은 브로커를 통해서 메시지를 발행하고, 메시지를 구독한다는 약속이 있습니다.

브로커란 말그대로 대상과 대상을 연결해주는 역할을 합니다. 예를들어 우분투에서 작동하고 있는 MQTT 서버가 될 수 있죠.

 

그럼 발행의 주체와 구독의 주체는 누가 될까요?

 

스마트폰이 될 수도 있고, IOT 기기가 될 수도 있습니다. 

 

이해를 돕기위해서 상황을 만들어 보겠습니다.

 

시나리오

영철이네 집에 전등이 하나 있습니다.

영철이는 집을 나갈때 전등을 끄는것을 자주 잊어버립니다.

그래서 우분투에 MQTT 서버를 돌려놓았습니다.

그리고 전등을 IOT 전등으로 바꾸어서 MQTT 서버(브로커)와 연결 시켰습니다.

 

연결후 전등은  자신의 상태를 확인하는 "checkLight" 라는 토픽을 구독 합니다.

그리고 자신의 상태를 전달하는 "sendStatus" 라는 토픽을 발행합니다.

그리고 전등을 끄기위해서  "offLight" 라는 토픽을 구독합니다.

 

그후 영철이는 스마트폰에 MQTT 라이브러리를 사용해서 간단한 앱을 만들었습니다.

이 앱은 집에 있는 IOT 전등의 상태를 확인하고, 전등을 off 할 수 있습니다.

 

MQTT라이브러리 기반으로 만들어진 이앱은

"checkLight" 라는 토픽을 발행합니다. 

그리고 전등에서 발행되는 메시지를 받기위해서 "sendStatus"라는 토픽을 구독합니다.

마지막으로 "offLight" 라는 토픽을 발행합니다.

 

영철이 밖에서 앱으로 "checkLight" 라는 토픽을 발행하면 전등은 "checkLight"를 구독하고 있기 때문에 자신의 상태를 체크합니다.

 

그리고 전등은 로직에 의해서 "sendStatus"를 발행하게 됩니다.

 

앱은 "sendStatus"를 구독하고 있기 때문에 앱으로 전등의 상태가 전달됩니다.

 

만약 전등이 켜져있다면 앱에서 "offLight" 토픽을 발행합니다.

전등은 "offLight"를 구독하고 있기 때문에 메시지를 받으면 전등을 off 시킵니다.

 

 

MQTT 프로토콜 통신 구조

 

MQTT 시나리오에서 발행,구독 정리

전등

발행 -  sendStatus

구독 - checkLight , offLight

발행 -  checkLight , offLight

구독 - sendStatus

 

MQTT는 위에서도 언급했듯이 브로커를 통해서 앱끼리 또는 MQTT 기능이 탑재되어 있는 기기 간에 통신을 할 수 있는 규약입니다.

 

특징

1.작은 대역폭에서도 통신이 가능합니다.

2.TCP/IP 프로토콜 위에서 작동합니다.

3.연결지향적입니다. (연결이 사용자에 의해 또는 환경에 의해 끊어지기 전까지 연결이 되어 있다)

4.발행-구독 구조라서 일대일 또는 일대다 통신이 가능합니다.

 

 

우분투에 MQTT 서버(브로커) 설치하기

sudo apt-get update

sudo apt-get install mosquitto

 

우분투에 MQTT 클라이언트 설치하기

sudo apt-get install mosquitto-clients

 

클라이언트(앱)가 "checkLight" 토픽 구독하기

mosquitto_sub -t "checkLight"

 

"checkLight" 토픽 발행하기

mosquitto_pub -m "불이켜져있어요" -t "checkLight"

 

참고로 서버상에서 테스트가 아닌 스마트폰 디바이스나 IOT 기기와 통신을 할려면 방화벽을 열어야 합니다.

MQTT 서버의 포트는 1883 입니다.

 

netstat -nap | grep LISTEN

ufw allow 1883

ufw status

 

결과