MQTT란?
MQ Telemetry Transport의 약자
It is a publish/subscribe, extremely simple and lightweight messaging protocol, designed for constrained devices and low-bandwidth, high-latency or unreliable networks.
왜 MQTT를 사용하는가?
IoT(Internet of Thing): Thing을 Internet에 연결을 하려면 Ethernet, WiFi, Cellular 등이 필요하다. 이런 connectivity가 대부분 무선으로 가고 있는데, 무선이라 함은 이동성이 보장되야 하므로 밧데리가 필요하고 파워소모는 중요한 요소이다. 파워를 적게 사용하기 위해서는 빨리 연결을 하고, 데이터를 보내고 빨리 연결을 끊어야 한다. 특히 데이터에 오버헤드가 없어야 한다. 셀룰라에서 데이터는 돈이니…
HTTP?
HTTP는 stateless 이므로 데이터를 보내기 위해서는 매 데이터 전송 연결을 해야한다. 따라서 HTTP는 웹페이지 같은 대용량의 데이터를 보내기에는 적합하지만 가볍지 않고, 빠르지 않다. 또다른 문제는 HTTP는 pull only이다. 즉 디바이스는 서버에 데이터를 보낼수 있지만, 서버에서 데이터를 받야하 하는 경우는 지속적으로 서버에 물어봐야 한다. 이런 pull update는 시간이 많이 걸리고 데이터도 많이 소비된다.
MQTT
이에비해 MQTT는 아주 간단하고 가볍다. 서버에 연결시 단지 80바이트만 필요하다. 계속 연결이 되며(MQTT Broker에 연결을 유지하기 위해 Keep alive packet를 주기적으로 보내야 함), 매 데이터 publication(디바이스가 데이터를 서버에 보내는 것)과 subscription(서버가 디바이스로 데이터를 보내는 것)은 약 20바이트 정도이다. MQTT는 메쉬네트웍이나 TCP/IP, Bluetooth위에서 동작가능하다.
Topic
Pub와 Sub는 토픽을 기준으로 작동한다. 토픽은 슬래시(/)를 이용해서 계층적으로 구성할 수 있어서 대량의 센서 기기들을 효율적으로 관리 할 수 있다
Port Number: 1883, 8883
TCP/IP port 1883 is reserved with IANA for use with MQTT. TCP/IP port 8883 is also registered, for using MQTT over SSL.
QoS
MQTT는 3단계의 QoS(Quality of service)를 제공한다.
- 0 : 메시지는 한번만 전달하며, 전달여부를 확인하지 않는다. Fire and Forget 타입이다.
- 1 : 메시지는 반드시 한번 이상 전달된다. 하지만 메시지의 핸드셰이킹 과정을 엄밀하게 추적하지 않기 때문에, 중복전송될 수도 있다.
- 2 : 메시지는 한번만 전달된다. 메시지의 핸드셰이킹 과정을 추적한다. 높은 품질을 보장하지만 성능의 희생이 따른다.
참고
- http://mqtt.org/ : 위키의 내용 필독
- https://www.joinc.co.kr/w/man/12/MQTT/Tutorial MQTT에 대한 기본적인 내용
- https://learn.adafruit.com/mqtt-adafruit-io-and-you?view=all# 기본적인 MQTT의 내용과 Adafruit IO의 사용법
- https://learn.adafruit.com/diy-esp8266-home-security-with-lua-and-mqtt?view=all Adafruit IO와 IFTTT의 연결
- http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2562 MQTT broker 테스트