1. MQTT(Message Queuing Telemetry Trasport)란?
MQTT는 경량 메시지 프로토콜이다. TCP/IP 프로토콜 기반으로 동작하며, 다른 프로토콜(HTTP 등) 보다 비교적 가볍다는 특징이 있다. 그로 인해, IoT 장치 / 디바이스 통신과 같은 제한된 자원이나 네트워크 환경에서 효과적으로 사용할 수 있는 통신 프로토콜이다.
2. MQTT 특징
a. publish / subscribe 모델
MQTT는 중앙에서 Broker를 통해 클라이언트들이 데이터를 publish(게시)하고 subscribe(구독)하는 방식으로 통신한다.
Broker는 publisher(게시자)에게 메시지를 전달받아 subscriber(구독자)한테 메시지를 전달한다.
b. Topic 기반 메시징
클라이언트는 관심 있는 topic을 subscribe 하고, Broker는 클라이언트들에게 메시지를 전달한다.
topic은 데이터를 구분하기 위해 사용된다. topic은 계층적 구조를 가지며, /(슬래시)를 통래 레벨을 구분한다.
예시) sensor / room / temperature
topic 사용 시 주의할 점
- topic은 최상위 레벨의 토픽은 '/'(슬래시)로 시작하지 않는다.
- 대소문자 구분한다.
- 공백을 사용하면 안 된다.
- 호환성을 위해 아스키 문자만 사용하도록 하자.
MQTT는 topic의 유연성을 위해 와일드카드를 제공한다.
'+' (단일레벨) 와일드카드
- 하나의 레벨을 대체한다.
- sensor/+/temperature로 구독하면, sensor/room/temperature, sensor/kitchen/temperature 와 같이 '+' 위치에 있는 모든 단일 레벨의 토픽을 구독한다.
'#' (다중레벨) 와일드카드
- 현재 레벨과 그 이하의 모든 레벨을 대체한다.
- sensor/# 로 구독하면, sensor/ 를 포함한 모든 하위레벨의 토픽을 구독한다.
c. 경량성
MQTT는 TCP/IP 프로토콜 기반으로 동작하지만, 헤더가 작고 메시지 구조가 단순하여, 매우 가볍다는 특징이다. 그로 인해 제한된 자원이나 네트워크 환경에서 주로 사용된다.
d. 연결지향적
MQTT 브러커와 클라이언트는 TCP/IP 소켓 연결 후 명시적으로 연결을 끊거나 네트워크 사정에 의해 연결이 끊어질 때까지 상태를 유지한다.
e. QoS(Quality of Service) 레벨 지원(품질을 위함)
- Level 0: 1회만 전송 전송
- Topic을 통해 메시지를 전송할 뿐 보장은 하지 않음.
- Level 1: 최소 1회 이상 전송
- 최소 한번 이상 전달되며 Publishr에게 PUBACK을 전달하여 성공 여부를 알린다.
- Broker가 PUBACK을 성공적으로 받지 못하면 클라이언트에게 중복 메시지를 보내는 경우가 생긴다.
- Level 2: 구독하는 클라이언트가 요구된 메시지를 정확히 한 번 수신할 수 있도록 보장한다.
- 클라이언트가 메시지를 딱 한 번만 수신할 수 있도록 보장한다.
- 높은 품질을 보장하지만 부하가 크다.
3. MQTT 메시지 구조
MQTT 패킷은 고정헤더, 가변헤더, 페이로드로 크게 세 부분으로 구성된다.
a. 고정 헤더(Fixed Header) (2byte)
- 컨트롤 패킷 타입 ( 4bit )
- CONNECT(1): 연결 요청할 때
- CONNACK(2) : 연결 요청에 대한 응답을 전송할 때
- PUBLISH(3) : 메시지를 publish 할 떄
- PUBACK(4): QOS-1 수준의 메시지 전송 확인할 때
- PUBREC(5): QOS-2 수준의 메시지 전송을 위한 첫 번째 응답에 사용
- PUBREL(6): QOS-2 수준의 메시지 전송을 위한 두 번째 응답에 사용
- PUBCOMP(7): QOS-2 수준의 메시지 전송을 완료할 때
- SUBSCRIBE(8): 클라이언트가 특정 토픽을 구독할 때
- SUBACK(9): 클라이언트의 구독 요청에 대한 응답을 전송할 때
- UNSUBSCRIBE(10): 클라이언트가 특정 토픽의 구독을 취소할 때
- UNSUBACK(11): 브로커가 클라이언트의 구독 취소 요청에 대한 응답을 전송할 때
- PINGREQ(12): 클라이언트가 브로커와 연결 상태를 확인할 때
- PINGRESP(13): 브로커가 클라이언트의 PINGREQ 메시지에 응답할 때
- 플래그 ( 4 bit )
- DUP(PUBLISH) : 이전에 전송된 메시지의 재전송인지 여부를 나타냄. 1이면 재전송
- QoS(PUBLISH) : Qo 품질 수준을 나타냄
- Retain(PUBLISH) : 메시지를 브로커가 보존해야하는 지 여부를 나타냄. 1이면 보존
- User Name Flag(CONNECT) : 사용자 이름 필드가 포함되는지 여부를 나타냄. 1이면 포함
- Password Flag(CONNECT) : 비밀번호 필드가 포함되는지 여부를 나타냄. 1이면 포함
- Will Retain(CONNECT) : Will 메시지가 보존되는지 여부를 나타냄. 1이면 보존
- Will QoS(CONNECT) : Will 메시지의 QoS 수준을 나타냄.
- Will Flag(CONNECT) : Will 메시지가 포함 여부를 나타냄. 1이면 포함
- Clean Session(CONNECT) : 클린 세션 플래그로, 1이면 브로커가 클라이언트의 상태 정보를 보존하지 않음.
- Reserved(CONNECT) : 예약된 비트로, 항상 0으로 설정
- 남은 길이(1~4byte)
- 가변 헤더와 페이로드의 총길이를 나타냄.
b. 가변 헤더(Variable Header)
- 가변헤더는 메시지 유형에 따라 다르며, 모든 메시지에 포함되는 것은 아니다.
- 메시지 식별자, 프로토콜 이름과 버전, 연결 승인 코드, QoS 레벨, 중복 여부, 보존 여부 등을 포함할 수 있음.
c. 페이로드(Payload)
- CONNECT 메시지
- 클라이언트 식별
- 사용자 이름과 비밀번호
- Will 메시지
- PUBLISH 메시지
- 실제 메시지 데이터
- SUBSCRIBE 메시지
- 구독할 토픽과 QoS 레벨
- SUBACK 메시지
- 구독 요청에 대한 응답 코드