본문 바로가기

학습 기록 (Learning Logs)/Today I Learned

MQTT

 

MQTT (Message Queuing Telemetry Transport) 프로토콜 개요

MQTT는 경량의 발행/구독(Publish/Subscribe) 모델을 기반으로 한 메시지 프로토콜로,

IoT(Internet of Things) 환경에서 주로 사용됩니다. 저전력, 저대역폭 환경에서도 안정적인 메시지 전송을 보장하도록 설계되었습니다.

 


 

1. MQTT 특징

① 경량 프로토콜

  • 메시지 크기가 작고, 패킷 오버헤드가 적음
  • TCP/IP 위에서 동작하며, 기본적으로 **QoS (Quality of Service)**를 제공

② 발행/구독 (Publish/Subscribe) 모델

  • 클라이언트는 메시지를 **발행(Publish)**하거나 **구독(Subscribe)**하는 방식으로 통신
  • 중간에 **브로커(Broker)**가 존재하여 메시지를 관리

③ 비동기 통신

  • 클라이언트는 브로커를 통해 메시지를 송수신하므로 직접적인 연결이 필요 없음
  • 클라이언트 간의 독립성을 유지하며, 실시간성이 중요한 서비스에 적합

④ 다양한 QoS (Quality of Service) 수준 지원

  • QoS 0 (At most once): 최대 1번 전송 (손실 가능)
  • QoS 1 (At least once): 최소 1번 전송 (중복 가능)
  • QoS 2 (Exactly once): 정확히 1번 전송 (가장 안전하지만 느림)

⑤ 지속적인 연결 유지

  • 연결이 끊어져도 재접속 시 마지막 메시지를 받을 수 있도록 "Last Will" 기능 제공
  • 저전력 장치에서 활용할 수 있도록 Keep Alive 기능 제공

⑥ 트래픽 효율성이 높음

  • 헤더 크기가 2바이트로 작음
  • 메시지를 주고받을 때 네트워크 대역폭을 최소화

2. MQTT 아키텍처

 

① 클라이언트 (Client)

  • 메시지를 발행(Publish)하거나 구독(Subscribe)하는 역할을 수행
  • 예) IoT 장치, 모바일 앱, 서버 등

② 브로커 (Broker)

  • 메시지를 중개하는 서버 역할
  • 클라이언트 간 직접 통신하지 않고 브로커를 통해 메시지 전달
  • 대표적인 MQTT 브로커:
    • Eclipse Mosquitto
    • HiveMQ
    • EMQX

3. MQTT 메시지 구조

MQTT 메시지는 고정 헤더, 가변 헤더, 페이로드로 구성됨.

① 고정 헤더 (Fixed Header)

  • 패킷 타입 (CONNECT, PUBLISH, SUBSCRIBE 등)
  • 플래그 및 메시지 길이 정보

② 가변 헤더 (Variable Header)

  • 특정 패킷 타입에 따라 포함되는 추가 정보
  • 예: PUBLISH 메시지의 경우 토픽(Topic) 정보 포함

③ 페이로드 (Payload)

  • 전송할 실제 데이터
  • JSON, 문자열, 바이너리 데이터 등 사용 가능

 


4. MQTT 주요 메시지 타입


 

메시지 타입 설명
CONNECT 클라이언트가 브로커에 연결할 때 사용
CONNACK 브로커가 연결 요청을 승인 또는 거부할 때 사용
PUBLISH 클라이언트가 메시지를 특정 토픽에 발행할 때 사용
PUBACK PUBLISH 메시지에 대한 수신 확인 (QoS 1 이상)
SUBSCRIBE 클라이언트가 특정 토픽을 구독할 때 사용
SUBACK 구독 요청이 성공했는지 응답
UNSUBSCRIBE 클라이언트가 특정 토픽 구독을 취소할 때 사용
UNSUBACK 구독 취소 요청에 대한 응답
DISCONNECT 클라이언트가 연결을 종료할 때 사용

 

5. MQTT 활용 사례

  • IoT 장치 제어 (스마트 홈, 센서 네트워크)
  • 실시간 메시징 (카카오톡, 페이스북 메신저 등)
  • 원격 모니터링 (산업 자동화, 원격 장비 관리)
  • 자동차 및 스마트 교통 시스템
  • 헬스케어 시스템 (웨어러블 기기 데이터 전송)

 


6. MQTT vs HTTP

구조적 차이

 

연결 유지 차이, mqtt는 계속 연결됨, http 단발성

 

 

mqtt 양방향, http 단방향

 

비교 항목 MQTT HTTP
프로토콜 타입 TCP/IP 기반 RESTful (HTTP 1.1, 2.0)
메시지 크기 매우 작음 (2바이트 헤더) 상대적으로 큼
통신 방식 발행/구독 (비동기) 요청/응답 (동기)
연결 유지 지속적 (Keep Alive 지원) 필요 시 연결
전송 속도 빠름 느림
사용 사례 IoT, 실시간 메시징 웹 애플리케이션, API

 

 

 

 

 


7. MQTT 예제 코드

 

① Mosquitto MQTT 브로커 실행

mosquitto -v

  • 로컬 브로커 실행 후 포트 1883에서 MQTT 메시지 처리

 

② Python MQTT 클라이언트 예제

클라이언트 설치

pip install paho-mqtt
 

Publisher (메시지 발행)

import paho.mqtt.client as mqtt

client = mqtt.Client()
client.connect("localhost", 1883, 60)

client.publish("test/topic", "Hello MQTT!")
client.disconnect()
 
 

Subscriber (메시지 구독)

import paho.mqtt.client as mqtt

def on_message(client, userdata, message):
    print(f"Received message: {message.payload.decode()}")

client = mqtt.Client()
client.on_message = on_message
client.connect("localhost", 1883, 60)

client.subscribe("test/topic")
client.loop_forever()

8. 결론

MQTT는 가벼운 네트워크 프로토콜로, IoT, 실시간 메시징, 원격 제어 등에 최적화되어 있습니다.

HTTP 대비 네트워크 부하가 적고, 비동기 방식을 지원하여 효율적인 메시지 교환이 가능합니다.

 

💡 실제 적용하려면?

  • Mosquitto, HiveMQ 등의 브로커를 활용
  • QoS 설정 및 Last Will 기능 고려
  • 보안 강화를 위해 TLS/SSL 적용

 


9. topic

 

 

 


9. QoS (Quality of Service)

'학습 기록 (Learning Logs) > Today I Learned' 카테고리의 다른 글