MQTT란?
TCP/IP 프로토콜 위에서 동작하는 IoT의, IoT에 의한, IoT를 위한 메세지 프로토콜이다.
MQTT 프로토콜은 정말 단순하게 사물인터넷 간에 "메세지"를 주고 받기 위한 프로토콜이다.
MQTT로 통신되는 메세지를 통해서 디바이스를 제어를 하든, 데이터를 만들고 수집하든 처리는 알아서 하는거다...ㅎㅎ
(IoT 개발자의 몫)
MQTT 프로토콜을 사용할 때 다른 통신프로토콜에 비해서 리소스가 비교적 적어,
소형 디바이스 통신에도 최적화 되어있다.
Broker(브로커)
통신을 하기위해서는 보통 서버와 클라이언트가 존재한다. MQTT에서도 메세지를 잘 전달해 줄 수 있는 서버와 같이 중계를 해주는 역할을 하는 프로그램이 필요하다. MQTT에서는 이를 Broker(브로커) 라고 한다.
MQTT통신을 하기위해서는 브로커가 있어야 접속이 가능하며, 일종의 서버의 역할이라고 생각하면 된다.
(정확하게는 서버가 아닌 중계의 역할이다. 서버와 클라이언트 개념은 클라이언트 요청에 의한 서버의 응답인데 브로커는 응답의 역할이 아니라 중계의 역할일 뿐이다.)
MQTT 브로커의 종류도 매우 다양한데, 대표적으로 무료인 Mosquitto 브로커를 많이 사용하고
클라우드의 형태로 일정 비용을 지불하여 사용하는 브로커 (HiveMQ)도 많이 있다.
MQTT 통신 원리
MQTT의 브로커를 이해했다면 어떻게 동작하는 지 알아볼 필요가 있다.
MQTT는 Topic(주제), Publish(발행), Subscribe(구독)으로 이루어진다.
MQTT는 트위터에 비유하면 이해하기 쉽다. MQTT 클라이언트는 메시지 발행(publish, 트윗에 해당), 메시지 구독(subscribe, follow에 해당) 두 가지 동작을 할 수 있다. MQTT 클라이언트가 메시지를 특정 채널(Topic, 토픽)에 발행하면 이 채널을 구독한 모든 클라이언트에게 메시지가 전달 된다. 중간에서 메시지를 수집, 재분해 하는 작업은 MQTT 브로커가 담당한다
MQTT는 Topic(주제)라는 개념이 있는데, 클라이언트로 부터 메세지를 읽어 올때 이 Topic을 사용하여 읽어온다.
예를들면, Sensor라는 토픽이 있고 Sensor라는 토픽에 메세지를 발행하면, 누구든 브로커에 접속하여 Sensor라는 토픽을 구독하면 해당 메세지를 받을 수 있는 것이다. 토픽은 Publisher(발행자)가 메세지를 보냄과 동시에 생성할 수 있다.
MQTT의 토픽은 [/]으로 하위 토픽을 생성할 수 있고 계층구조를 갖는다.. [예를들면 Sensor/tem]
메시지를 구독/발행 할 때 여러개의 토픽을 한번에 지정할 수 있도록 wild card 문자를 지원한다.
[+] 문자는 단 1개의 토픽을 임의의 토픽으로 대체하는 와일드카드 문자이다.
반면 [#] 문자는 여러 레벨의 토픽을 대체할 수 있다. [myhome/#] 처럼 사용하면 myhome 의 하위 토픽들 모두를 지칭하게 된다. [#] 문자는 토픽 문자열 끝에만 사용할 수 있으며 하위 토픽 모두를 지칭한다. (2단계 이상 하위 토픽도 포함)
QoS(Quality of Service)
MQTT는 시스템에 참여하는 장치들의 처리 능력, 네트워크 대역폭, 메시지 오버헤드 등 주변상황에 맞게 시스템이 동작할 수 있도록 3단계 QoS (Quality of Service) 를 제공한다.
네트워크에서 QoS는 흔히 많이 알려진 개념이다.
QoS | |
0 | 메시지는 한번만 전달하며, 전달여부를 확인하지 않는다. Fire and Forget (비동기 패턴 : 응답을 추적하지 않음, UDP와 비슷한 개념) 타입이다. |
1 | 메시지는 반드시 한번 이상 전달된다. 하지만 메시지의 핸드셰이킹 과정 (TCP 프로토콜 처럼 통신에 대한 응답을 추적한다)을 엄밀하게 추적하지 않기 때문에, 중복 전송될 수도 있다. |
2 | 메시지는 한번만 전달된다. 메시지의 핸드셰이킹 과정을 추적한다. 높은 품질을 보장하지만 성능의 희생이 따른다. |
0에 가까울수록 메시지 처리에 대한 부하가 적은 대신 메시지 손실 위험이 높아진다.
2에 가까울수록 메시지 손실 위험은 줄어들지만 메시지 처리 부하가 급격히 늘어난다.
0~1 정도의 QoS를 사용하고 메시지 손실 등의 위험은 상위 어플리케이션 계층에서 관리하도록 하는 것이 일반적이다.
'Embedded System > 통신' 카테고리의 다른 글
[통신] I2C (0) | 2023.03.08 |
---|---|
[프로토콜] Modbus(모드버스) (2) | 2022.12.27 |
[RF통신] RFID(Radio-Frequency Identification) (0) | 2022.12.22 |
[통신] RS485, RS232 (0) | 2022.12.13 |
[통신기초] 시리얼 통신 (Serial Communication) (0) | 2022.12.01 |