나의 개발자 기록/개발자 지식

[통신 이론] MQTT 프로토콜이란?

써머름 2022. 12. 26. 11:01
728x90
반응형

- MQTT란?

MQTT(Message Queueing Telemetry Transport)는 2016년 국제 표준화 된 발행 - 구독 기반의 메시지 송수신 프로토콜이다.

 

작은 코드 공간이 필요하거나 네트워크 대역폭이 제한되는 원격 통신을 위해,

즉 IoT와 같은 제한된, 혹은 대규모 트래픽 전송을 위해 만들어진 프로토콜이다. 

 

따라서 TCP/IP 프로토콜 위에서 동작하지만 동시에 굉장히 가벼우며, 많은 통신 제약들을 해결해준다! 
(블루투스처럼 별도의 모듈로 별도의 대역폭을 가지는 통신 규약이 아닌, WiFi나 기타 방법으로 인터넷을 통해 TCP/IP 기반의 메시지 송수신을 한다는 의미이다)

 

 

- 구체적인 장점들

1. 가볍고 효율적이다

 : IoT 디바이스에 구현할 때는 최소한의 리소스가 필요하다. 가장 작은 MQTT제어 메시지는 데이터 2바이트 정도로 작다. MQTT 메시지 헤어도 작기 때문에 네트워크 대역폭을 최적화할 수 잇따.

 

2. 확장성

 : MQTT 구현에는 최소한의 코드와 아주 작은 전력만 소비된다. 많은 수의 IoT 디바이스 통신을 지원하기 위한 기능을 갖추고 있다.

 

3. 신뢰성

 : IoT 디바이스의 낮고 지연시간이 긴 대역폭은 신뢰할 수 없는 셀룰러 네트워크를 통해 연결한다. MQTT는 IoT 디바이스에서 클라우드에 다시 연결하는데 소요되는 시간을 줄여주는 기능(QoS)이 탑재되어있다. IoT 사용 사례에 필요한 신뢰성을 보장한다.

 

4. 보안

 : MQTT를 통해 개발자는 손쉽게 암호화하고, OAuth, TLS1.3, 고객 관리형 인증서 및 기타 최신 인증 프로토콜을 사용하여 디바이스와 사용자를 인증가능하다.

 

5. 우수한 지원

 : Python과 같은 다수의 언어가 MQTT 프로토콜 구현을 광범위하게 지원하기 때문에 개발자는 모든 유형의 애플리케이션에서 최소한의 코드작업으로 빠르게 프로토콜을 구현가능하다

 

이러한 장점들로 페이스북 메신저가 MQTT를 채택했다. 알아보자! 

 

 

 

 

 

- MQTT의 원리

 

- 게시 / 구독 모델의 원칙을 기반으로 작동

- 전통적인 네트워크 통신은 클라이언트-서버가 직접 통신하여 요청시 응답하는 형태이다

- MQTT는 게시/구독패턴으로 게시자와 구독자를 분리하고,

메시지 브로커라고 하는 제 3 구성요소가 게시자와 구독자 간의 통신을 처리한다.

- 메시지 브로커는 게시자로 수신되는 모든 메시지를 필터링하고 구독자에게 배포한다.

- 게시자/ 구독자 분리원칙은 다음과 같다

         - 공간 분리 : 게시자와 구독자는 서로의 네트워크 위치를 모르고 IP주소 혹은
                             포트정보를 교환하지 않는다.
         - 시간 분리 : 게시자와 구독자는 동시에 실행되거나 네트워크를 통해 연결되지 않는다.

         - 동기화 분리 : 게시자와 구독자는 서로를 중단시키지 않고 메시지 송수신이 가능하다.
                                구독자는 게시자의 메시지 전송을 기다리지 않는다.

 

 

 

- MQTT의 구성요소 

MQTT는 아래와 같이 클라이언트와 브로커를 정의하여 게시/구독 모델을 구현한다.

 

MQTT 클라이언트 :

MQTT 클라이언트는 서버부터 MQTT 라이브러리를 실행하는 마이크로컨트롤러에 이르는 모든 디바이스가 될 수 있다. 클라이언트는 메시지를 보내는 경우 게시자 역할을, 메시지를 수신하는 경우 수신자 역할을 한다. 기본적으로 네트워크를 통해 MQTT를 사용하여 통신하는 모든 디바이스를 MQTT 클라이언트 디바이스라고 할 수 있다.

 

MQTT 브로커 :
( MQTT 프로토콜을 구현하는 브로커들에는 Mosquitto, HiveMQ, RabbitMQ등이 있으며
도커를 사용하여 간편하게 실행 가능하다)

 

MQTT 브로커는 여러 클라이언트 간의 메시지를 조정하는 백엔드 시스템이다. 브로커는 메시지 수신 및 필터링, 각 메시지를 구독하는 클라이언트 식별, 메시지 전송 등과 같은 작업을 담당한다. 또한 다음과 같은 다른 태스크도 처리한다.

  • MQTT 클라이언트 권한 부여 및 인증
  • 추가 분석을 위해 다른 시스템으로 메시지 전달
  • 누락된 메시지 및 클라이언트 세션 처리

MQTT 연결

클라이언트와 브로커는 MQTT 연결을 사용하여 통신을 시작한다. 클라이언트는 CONNECT 메시지를 MQTT 브로커로 보내 연결을 시작한다. 브로커는 CONNACK 메시지로 응답하여 연결이 설정되었음을 확인한다. MQTT 클라이언트와 브로커는 모두 TCP/IP 스택이 있어야 통신할 수 있다. 클라이언트는 서로 연결되지 않으며 브로커에만 연결한다.

 

 

 

- MQTT의 작동방식

  1. MQTT 클라이언트가 MQTT 브로커와의 연결을 설정한다.
  2. 연결되면 클라이언트에서 메시지를 게시하거나 특정 메시지를 구독하거나 둘 다 수행할 수 있다.
    ** MQTT 클라이언트의 토픽 문자열 및 토픽 필터 규칙 :
    https://www.ibm.com/docs/ko/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-dev-doc-q029120--htm
  3. MQTT 브로커는 메시지를 수신한 후 메시지에 관심이 있는 구독자에게 메시지를 전달한다.

 

: MQTT 주제 (Topic)

‘주제’라는 용어는 MQTT 브로커가 MQTT 클라이언트를 위한 메시지를 필터링할 때 사용하는 키워드이다. 주제는 파일 또는 폴더 디렉터리와 유사한 계층 구조로 정렬된다. 예를 들어 여러 층으로 된 주택에서 작동하는 스마트 홈 시스템을 생각해 보면, 각 층에는 서로 다른 스마트 디바이스가 있고, 이 경우 MQTT 브로커는 주제를 다음과 같이 정렬할 수 있다.

ourhome/groundfloor/livingroom/light

ourhome/firstfloor/kitchen/temperature

 

: MQTT 게시

MQTT 클라이언트는 주제 및 데이터가 바이트 형식으로 포함된 메시지를 게시한다. 클라이언트는 텍스트 데이터, 바이너리 데이터, XML 또는 JSON 파일과 같은 데이터 형식을 결정한다. 예를 들어 스마트 홈 시스템의 조명은 livingroom/light 주제에 on이라는 메시지를 게시할 수 있다.

 

: MQTT 구독 

MQTT 클라이언트는 MQTT 브로커에 SUBSCRIBE 메시지를 보내 관심 주제에 대한 메시지를 수신한다. 이 메시지에는 구독의 고유 식별자와 목록이 포함된다. 예를 들어 휴대폰의 스마트 홈 앱을 사용하여 집안에 켜져 있는 조명의 수를 표시하려면 light 주제를 구독하고 모든 on 메시지의 카운터를 늘린다. 

 

 

**이해하기 어렵다면, 메시지버스 시스템을 생각하자!
-> MQTT브로커가 메시지 버스를 만들고 여기에 메시지를 흘려보내면, 버스에 붙은 애플리케이션들이 메시지를 읽어가는 방식이다.
메시지 버스에는 다양한 주제의 메시지들이 흐를 수 있는데, 메시지를 구분하기위해 "topic"을 이름으로 하는 메시지 채널을 만든다.

 

- MQTT는 RESTful인가?

MQTT는 RESTful이 아니다.

Representational State Transfer(REST)는 네트워크 통신에 대한 아키텍처 접근 방식으로,

메시지 발신자와 수신자 간의 요청-응답 패턴 통신을 사용한다.

이와 반대로 MQTT는 애플리케이션 계층에서 게시/구독 모델 통신을 사용하며

메시지를 푸시 방식으로 전송하기 위한 고정된 TCP 연결이 필요하다.

그러나 MQTT 버전 5는 REST와 유사한 방식으로 작용하는 새로운 요청/응답 메서드를 추가한다.

여기서 게시자는 특수한 응답 주제를 첨부할 수 있고 수신자는 이를 처리하여 적절한 응답을 생성한다.

 

**MQTT프로토콜 실행의 예 : https://medium.com/@jspark141515/mqtt%EB%9E%80-314472c246ee

 

MQTT란?

MQTT는 M2M, IOT를 위한 프로토콜로서, 최소한의 전력과 패킷량으로 통신하는 프로토콜입니다. 따라서 IOT와 모바일 어플리케이션 등의 통신에 매우 적합한 프로토콜입니다.

medium.com

**MQTT 클라이언트를 설치하여 연동 및 IoT 장치 만들어보는 통신 예제  : https://www.hardcopyworld.com/?p=2562

 

 

728x90
반응형