시작은 미약하였으나 , 그 끝은 창대하리라

(1) MQTT 란? 본문

프로그래밍/MQTT

(1) MQTT 란?

애플파ol 2022. 3. 1. 20:36

1. MQTT 정의

정의:   MQTTMessage Queueing Telemetry transport 의 약자로 사물통신(M2M: Machine to Machine), 사물인터넷            (IOT: Internet of things) 를 위한 프로토콜로서, 최소한의 전력과 패킷량으로 통신하는 프로토콜이다.(경량 메시지 전송 프로토콜) , IOT모바일 어플리케이션 등의 통신에 매우 적합한 프로토콜이다.

2. MQTT 구조 및 특징

특징:  MQTT 프로토콜은 푸시 기술(Push technology)에서 일반적으로 사용되는 클라이언트/서버 방식 대신,

        메시지 매개자(broker)를 통해 송신자가 특정 메시지를 발행(publish)하고 수신자가 메시지를 구독(subscribe)하는

        방식을 사용한다. , 매개자(broker)를 통해 메시지가 송수신 된다.

 

(푸시기술: 사용자가 원하는 정보를 서버(server) 자동적으로 제공하는 방식.

              따라서, 사용자가 매번 요청하지 않아도 특정 정보를 전송 받을 수 있도록 자동화된 기술.)

 

 

Broker(중개인)        : 1) Publisher  Subscriber 사이에 메시지를 관리하여 전송해주는 중앙 관리자이다.

                            2) Publisher 가 발행한 Topic을 갖고 있다.

 

Publisher(발행자)     : 1) 특정 Topic(화제) 통해 Broker(중개인)에 메시지를 전송한다.

 

Subscriber(구독자)   : 1) Topic(화제) 기준으로 Broker(중개인)에 구독을 요청한다.

                            2) Subscriber(구독자) polling(주기 적인 체크)방식을 이용하여 Broker에 있는

                               Topic(화제)을 조회해 간다.

 

                           ☞단일 Topic에 여러 Subscriber 구독할 수 있기 때문에, 1:N 통신구축에도 유용하다.

 

Polling(주기 적인 체크) : 하나의 장치(또는 프로그램) 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를

                                주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다.

 

3. MQTT_Topic(화제)

Topic(화제): 1) TopicPublisherSubscriber가 발행하고 구독할 수 있는 채널로 이해할 수 있다.

                2) Topic은 채널 단위로 구분할 수 있으며 슬래시(/) (=Topic level seperator)로 구분되는 계층 구조를

                   가지고 있어서 대량의 센서 기기(데이터)들을 효율적으로 관리할 수 있다.

 

슬래시 ( / ) : /  문자를 통해서 Topic level을 구분함.

플러스 (+ ) : + 문자를 통해서 단 한 개의 토픽을 임의의 토픽으로 대체할 수 있다. (와일드 카드 기능)

(# )        : # 문자를 통해서 와일드카드 기능을 멀티로 지원함. , 2단계 이상의 하위 토픽을

                        와일드 카드 기능으로 대체할 수 있다.

 

Ex)

백화점 내의/ A옷가게의 /스키니진을 체크함.

   Topic level: 백화점, A옷가게, 스키니진

백화점 내의 모든 가게의 스키니진을 체크함.

백화점 내의 모든 가게의 모든물건을 체크할 수 있다는 의미

 

4.MQTT_QoS

QoS: MQTTQoS(Quality of Service)를 제공하는데, QoS란 서비스의 질을 보장해주는 레벨을 말한다.  서비스의

       종류에 따라서 적당한 QoS 레벨을 선택해야 하고, 3단계로 나뉘어져 있다.

 

Level 0(At most once):  메시지는 한번만 전달되며 전달의 성공여부는 확인 하지 않는 레벨이다.

Level 1(At least once):  메시지는 최소 한번 이상 전달되며 Publisher에게 PUBACK을 성공적으로 받지 못하면                                             Subscriber에게 중복메시지를 보내는 경우가 생긴다.

Level 2(Exactly once): 메시지는 반드시 한번만 전달된다. PUBACK방식을 PUBREC으로 핸드셰이킹 함으로써 PUBACK

                             받지 못하더라고 Broker에게 메시지를 보냈다는 사실을 알고있기 때문에 중복메시지를 보내지

                              않는다.

 

☞ 결론: QoS의 단계가 높아질 수록 통신의 품질은 향상되지만, 그에 따라 성능 저하의 가능성이 존재함.

 

이해를 돕기위한 시나리오.

 

Qos level 0 : level0 에서는 보내고 잊는다. 잊는다는 것은 저장하지 않는다는 의미이고. 한번에 전송이 성공하지 않으면                전송은 실패한 상태로 끝이난다. Qos를 보장하지 않는 상태인 것이다.

 

Qos level 1: level1 에서는 최소 한번은 가게 된다. 정상적으로 통신할 경우 1번을 보내게 된다.               

               1) Publisher가 Broker에게 정상적으로 보낸다.               

               2) Broker는 받은 메시지를 Subscriber에게 정상적으로 보낸다(Subscriber는 메시지를 1회받음)               

               3) Broker는 받은 메시지를 보냈으므로 PUBACK을 Publisher에게 보낸다.               

               4) 그러나 PUBACK이 전달 중에 사라졌다.(LOSS발생)               

               5) Publisher는 PUBACK을 기다리다가, 시간이 지나자 전송이 실패한 줄 알고 다시 Broker에게 보낸다.               

               6) Boker는 메시지에 관한 정보를 지웠기 때문에, 처음 받는 메시지인줄 알고 다시 Subscriber에게 보낸다.                                     (Subscriber는 똑같은 메시지를 2번째 받음)               

               7) 다시 PUBACK을 보내고, 정상 종료된다.               

               8) Publisher가 PUBACK을 받고,통신은 종료된다.☞ 결론: PUBACK이 중간에 loss되면 2개 이상의 중복 패킷 을 받게되                  는경우가 발생한다.

 

Qos level 2: level2 에서는 딱 한번만 가게 된다.

 

               1) Publisher가 메세지를 보낸다.

               2) Broker가 메시지를 전달한다.(Subscriber 1회 전달받음)

               3) Broker가 Publisher에게 PUB recevied를 보낸다.

               4) PUBREC이 분실되어 Publisher 가 다시 메시지를 보내도, Broker는 메시지를 이미 갖고  있기 떄문에

                  Subscriber에게 다시 메시지를 보내지 않고 PUBREC를 다시 보낸다.

               5) Publishers는 PUBREC를 받으면, 이제서야 Publish Release 메시지를 보낸다.

               6) PUBREL이 loss되는것은 문제가 없다. 브로커는 이미 보냈다는 사실을 알고 있기 때문에 새로 보내지 않는

                  다.

               7) PUBREL을 받으면, 이제서야 메시지를 삭제한다.

               8) 메시지를 정상 종료하였으므로 PUBCOMPLETE를 보낸다.

☞ 결론: 메시지를 정확하게 한번만 보낼 수 있게 된다.

 

Comments