TODAY 74
MQTT 란

MQ Telemetry Transport

MQTT 란 ?
MQTT는 발행/구독(Publish/Subscribe) 방식의 메세지큐 방식이다.
 
[MQTT 프로토콜 설계의 의도]
  • 프로토콜이 차지하는 모든 면의 리소스 점유(footprint)를 최소화
  • 느리고 품질이 낮은 네트워크의 장애와 단절에 대비
  • 클라이언트 애플리케이션 동작에 자원 활용이 극히 제한적임을 고려
  • 다수의 클라이언트 연결에 접합한 Publish/Subscribe 네트워크 채용
  • 신뢰성 있는 메시징을 위한 QoS(Quality of Service) 옵션 제공.
  • 개방형 표준 메시징 프로토콜을 지향 –  제 3자(3rd Party) 기기 제조업체와 소프트웨어 개발업체의
    용이한 도입, 적용을 유도
 
MQTT 특징
1.Publish/Subscribe[기본원칙 : 메세지를 발행하고, 관심 있는 주제를 구독한다]
Publisher와 Subscriber 모두 Broker에 대한 클라이언트로 작동하며, Publisher는 토픽을 발행하기 위한 목적으로, Subscriber는 토픽을 구독하기 위한 목적으로 Broker 서버에 연결한다. 하나 이상의 Pub과 Sub가 Broker에 연결해서 토픽을 발행하거나 구독할 수 있다. 또한 다수의 클라이언트가 하나의 주제를 구독할 수도 있다.
 
2.토픽 : Pub과 Sub이 작동하는 기준이다.
토픽은 (/)를 사용해서 계층적으로 구성할 수 있기 때문에 다수의 센서 기기들을 효율적으로 관리할 수 있다.
 
- 토픽 예시
발행자는(Pub) 토픽을 발행하고, 구독자(Sub)는 관심 있는 토픽을 구독하는 구조이다. 예를 들어, RDU 공항과 LHR 공항의 비행기 출발 및 도착 시간은 다음과 같이 계층적인 토픽으로 발행할 수 있다.
 
 
3.메세지 버스 : MQTT는 메세지 버스 시스템이다.
MQTT Broker가 메세지 버스를 만들고, 여기에 메세지를 흘려보내면, 버스에 붙은 어플리케이션들이 메세지를 읽어가는 방식이다. 메세지 버스에는 다양한 주제의 메세지들이 흐를 수 있는데, 메세지를 구분하기 위해서 “Topic”을 이름으로 하는 메세지 채널을 만든다.
 
 
4.Quality-Of-Service : MQTT에서 메세지의 신뢰성을 위해서 제공하는데, 서비스의 종류에 따라서 적당한 QoS 레벨을 선택한다.
0 : 메세지가 1번만 전달, 전달여부 확인 X – 유실 가능성
1 : 메세지가 최소 1번만 전달(1번 이상 전달 되겠다) – 중복 전달 가능성
2 : 메세지가 1번만 전달, 유일하게 핸드셰이킹(?) 과정 추적- 높은 품질을 보장하지만 성능의 희생 발행자와 구독자 모두 QoS를 지정할 수 있지만 발행자가 지정한 최대 QoS 수준이 우선이다.
예를 들어 발행자의 QoS 수준을 0 이라고 지정했을 떄, 구독자의 QoS 수준을 2로 지정했더라도, 브로커에 의해 무시되고 ‘QoS 0’ 수준의 서비스를 받게 된다.
 
5.MQTT Broker : MQTT 서버라고 하지 않고 중개인이라고 하는 이유는 MQTT가 Pub(발행인)과 Sub(구독자)가 메세지를 주고 받을 수 있도록 다리를 놔주는 역할만하기 때문이다. 다양한 종류의 Broker들이 있다.
 
Broker(중개인, 서버X)
-mosquitto(C기반, 클리스터링(?)이 안됨)
- 간편해서 좋기는 한데. C 기반. 그리고 클러스터링이 안됨.  (HA, Fail over는 어케 한다냐?). Facebook이 쓴다고 하는데. Consistent hashing같은걸 써야 하는데, Fail back이 복잡할듯
- user authentication을 이건. file에 넣고 한다.
- 테스트 해보니 일정 시간 패킷이 안오면 하트비트 메세지 보내기 시작하고, 메세지가 안오면 끊어 버린다.
 
-HiveMQ(클리스터링은 됨, 저가 상용)
- Clustering 됨 (Infinispan 씀)
- JMX 모니터링 디는 걸로 봐서. 이것은 JAVA
- MultiCast로 클러스터링을 하지만, TCP로 Fixed Size 클러스터나, AWS EC2 클러스터 지원이 가능함.
- AWS/Azure 모두 지원
- 근데 회사가 좀 작아 보인다?? 독일 SI회사
 
-Rabbit MQ
- shared memory 구조가 없어서 어떻게 하는가 궁금하기는 하지만, federation이나 shovel 컨셉을 쓰면 WAN 구간도 가능하기 때문에, 주의깊게 볼만함. 무엇보다 무료에다가 상대적으로 Learning curve가 낮음.
- MQTT 3.1 지원
- QoS0과 1만 지원 (2는 지원 안함)
- SSL 지원
- Session stickiness 지원
 
-IBM MQ
 
-Vertx
- 아직 부족한듯.
- 특히 QoS2 지원하려면 Q나 메세지 전송에 대한 결과치를 가지고 resend할 수 있는 메카니즘이 있어야 하는데 없는듯.
 
 
6.클라이언트
 
– 이클립스 Paho : The Paho JavaScript Client is a browser-based libaray that uses WebSockets to connect to an MQTT server. A simple utility to demonstrate it tis included, and available online.
 
  • IoT Connectivity를 위한 MQTT
    • Local connectivity (표준이 존재X)
      퀼컴,LG – Allseen
      얼라이언스 – Alljoyn
      인텔,삼성 – Open Interconnect Consortium
      애플 – Homekit
    • Remote connectivity : IoT기기들과 유저 모바일 기기 그리고 인터넷 서비스들은 IoT Internet Infra에 연결되고, 이때 MQTT를 사용할 수 있게 된다.
    • 인터넷 어플리케이션과의 연동
  1. 유저 모바일 어플리케이션 : 채널 분리, 메세지는 HTTP 기반으로 전송하고, 응답은 MQTT client로 받는다. 네이티브 혹은 하이브리드 앱에서 사용할 수 있다. (Ex. 페이스북 메신저)
  2. 웹 브라우저 : HTTP로 전송하는 건 동일하다. 응답은 웹 소켓을 이용한다. 많은 MQTT Broker들이 웹 소켓 인터페이스를 제공한다.
  3. 소형 디바이스 : MQTT 단일 인터페이스로 송/수신
  4. 웹 어플리케이션 : 그림에는 없지만, 인터넷 서비스와 Server-to-Server 방식으로 연결할 수 있다. 이 경우 양측이 Open API를 제공하고, 서로 호출하는 방식을 사용한다.
 
 
[MQTT over WebSocket]
Websocket은 TCP socket과 많이 닮았지만, 차이점도 있다.
그 차이점은 브라우저에서 서버로 양방향 커뮤니케이션 연결을 시도 한다는 점이다.
웹소켓이 위치하면서 웹브라우저에서 웹 어플리케이션을 위한 first class MQTT 지원이 가능해졌습니다.
여기엔 몇가지 옵션이 있습니다.
  1. IBM의 MQ 7.5가 Websocket을 지원하게 되었다.
  2. Mosquitto broker는 예제를 포함한 Javascript client를 가진다.
  3. HiveMQ MQTT broker는 네이티브 웹소켓 지원을 한다.
 
 
메모
-> private push server 구축은 어렵지 않게 시작 가능
-> 구축하는데 MQTT 는 좋은 선택
-> Python IO Server/Client
대시보드 참고용 URL : https://count.ly/
 
 
응용분야

참고 URL : https://dev402.wordpress.com/tag/mqtt%EB%9E%80/

참고 URL : https://github.com/mqtt/mqtt.github.io/wiki/software?id=software

참고 URL : http://d2.naver.com/helloworld/1846

참고 URL : https://www.ibm.com/support/knowledgecenter/ko/SSFKSJ_7.5.0/com.ibm.mm.tc.doc/tc00000_.htm

참고 URL : http://www.codejs.co.kr/mqtt-mq-telemetry-transport-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

참고 URL : https://www.joinc.co.kr/w/man/12/MQTT/Tutorial