본문 바로가기

아키텍처

[네트워크] MQTT

 

 

  이번에는 MQTT에 대해 간단히 개념을 공부하고 데이터를 주고받는 실습을 해봤다. 개념의 경우 https://medium.com/@jspark141515/mqtt%EB%9E%80-314472c246ee 문서를 참고해서 정리했다.

  • 학습 내용

  MQTT란 M2M, IOT를 위한 프로토콜이다. 최소한의 전력과 패킷량으로 통신하는 프로토콜이다. 그래서 IOT, 모바일 앱 등의 통신에 많이 사용된다.  

MQTT는 Broker, Publisher, Subscriber 구조로 데이터를 주고받는다. 이는 HTTP와 같은 클라이언트-서버 구조로 데이터를 주고받는 것과 차이를 보인다. Publisher는 Topic을 발행(publish)한다. Subscriber는 Topic에 구독(subscribe) 한다. Broker는 이들을 중계하는 역할을 한다. 단일 Topic에 여러 Subscriber가 구독할 수 있는데, 이로 인에 1:N 통신 구축에 매우 유용하다.

  MQTT는 QoS(Quality of Service)를 제공하는데 총 3단계로 나눠져 있다.

1단계 메시지는 한번만 전달되며 전달이후의 수신과정을 체크하지 않음.
2단계 메시지는 한번 이상 전달되고 핸드쉐이킹 과정을 추적하거나 엄격하게 추적하지 않기 때문에 중복수신의 가능성이 있음.
3단계 메시지는 한번만 전달되고 핸드쉐이킹의 모든 과정을 체크함.

QoS의 단계가 높아질수록 통신의 품질은 향상된다. 그러나 그에 따라 성능 저하의 가능성이 있어 프로젝트의 특성에 따라 잘 결정돼야 한다.

  •   MQTT의 대표적인 브로커
Mosquitto
HiveMQ
mosca
ActiveMQ
RabbitMQ

  

  • MQTT 구동

  먼저 브로커를 설치해야 한다. 나의 경우 Mosquitto를 사용했다. 참고로 나는 macbook을 사용하기 때문에 터미널의 기준은 mac이다.

// 모스키토 설치
brew install mosquitto 

// 모스키토 서비스 실행
brew services start mosquitto

// 모스키토 서비스 중지
brew services stop mosquitto

모스키토를 실행한 화면

브로커를 실행한 후 topic에 publish하기 위한 GUI 툴인 MQTT-Explorer를 설치한다. https://mqtt-explorer.com/ 

 

MQTT Explorer

An all-round MQTT client that provides a structured topic overview

mqtt-explorer.com

 

성공적으로 설치하면 이런 화면이 나타난다.

mosquitto에서 할당하는 디폴트 포트는 '1883'이다.  

그리고 에디터에 mqtt를 실행하는 코드를 작성한다. 나의 경우 javascript를 사용했다.

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://localhost:1883');

client.subscribe('test')

client.on('message', function (topic, message) {
  console.log(topic)
  console.log(message.toString())
  client.end()
})

위의 코드를 간단히 해석해보면 'test'라는 토픽을 구독하고 그 토픽의 이름과 메시지를 콘솔에 찍어보는 코드이다.

이렇게 mqtt-explorer에서 test라는 토픽에 raw에 Hellow World라는 메시지를 담아 Publish 해보겠다.

위의 코드를 node로 실행한 상태에서 publish를 하면 해당 topic과 message를 코드대로 콘솔 로그로 찍히는 것을 확인할 수 있다. 그리고 코드대로 실행 중인 파일이 무사히 종료된다.

 

'아키텍처' 카테고리의 다른 글

[아키텍처] MSA  (0) 2022.09.27
[배포] Docker  (0) 2022.07.03
[배포] Amazon Web Service  (0) 2022.06.29
네트워크 심화  (0) 2022.06.27
클라이언트 빌드와 배포  (0) 2021.12.08