MQTT 프로토콜 / mosquitto를 이용한 MQTT 통신 예제

이수진·2024년 4월 20일
0
post-thumbnail

MQTT 프로토콜에 대하여, 그리고 mosquitto를 mqtt broker를 이용한 예시에 대해 공부한 것을 정리해보려고 합니다.

  1. MQTT 프로토콜은 무엇인가?
  2. MQTT 특징
  3. MQTT 구성 요소
  4. MQTT 통신 과정
  5. mosquitto를 이용한 MQTT 통신 예시

1. MQTT 프로토콜은 무엇인가?

MQTT(Message Queueing Telemetry Transport) Protocol의 약어로, 2016년 국제 표준화된 발행-구독(Publish-Subscribe) 기반의 메시지 송수신 프로토콜입니다.
Pub-Sub 모델 기반의 구조이며, TCP/IP 위에서 동작합니다.
또한 굉장히 가볍고 효율적입니다. 하지만, 서비스 품질(QoS)는 떨어질 수 있습니다.

2. MQTT 특징

  • 연결지향적 (Connection Oriented)
    • connectionless 한 HTTP 프로토콜과는 달리, MQTT에서 클라이언트는 연결 후 명시적으로 연결을 끊기 전까지 연결 상태를 유지합니다
  • broker를 통한 통신
    • 여기서는 broker가 서버 역할을 대신합니다
    • 즉, 모든 Pub-Sub 패턴은 오직 broker를 통해서만 일어납니다
      • Subscriber가 구독을 요청할 때에도 broker에 요청
      • Publisher가 메시지를 발행할 때에도 broker에 발행
      • Subscriber가 구독한 메시지를 받을 때에도 broker를 통해 전달받음
  • QoS (Quality of Service)
    • 0: 최대 1회 전송. Topic을 통해 메시지를 한 번만 전송하고, 보장은 하지 않는다. (보낸 다음 잊어버림)
    • 1: 최소 1회 전송. (적어도 1번 전송) 해당 메시지는 받을 때까지 발신자에 의해 여러 번 다시 시도됨
    • 2: 정확히 한 번. 구독하는 클라이언트가 요구된 메시지를 정확히 한 번 수신할 수 있도록 보장. 메시지의 2단계 handshaking 과정을 추적 (보장된 전달)
    • 0에 가까울수록 메시지 처리에 대한 부하가 줄어들고, 메시지 손실의 위험이 높아진다 / 2에 가까울수록 메시지 손실 위험은 줄어들지만, 메시지 처리 부하가 급격히 늘어난다
    • 주로 0~1 정도의 QoS를 사용하며, 메시지 손실의 위험은 상위 애플리케이션 차원에서 관리하는 방법을 채택

3. MQTT 구성 요소

  • server
    • broker: 서버 역할
  • client
    • subscriber: (메시지를 받기 위한) client
    • publisher: (메시지를 보내기 위한) client

추가

  • topic
    • MQTT에서 topic은 메시지를 발행하거나 구독할 때 사용되는 주제를 나타냅니다. 토픽은 메시지의 대상이나 카테고리를 정의하는 데 사용됩니다. Publisher는 특정 토픽에 대해 메시지를 발행하고, 해당 토픽을 구독하는 Subscriber는 해당 토픽에서 발행된 메시지를 수신합니다
    • 토픽은 일반적으로 슬래시("/")를 사용하여 계층 구조로 구성됩니다

4. MQTT 통신 과정

  1. subscriber client는 broker에 특정 topic을 구독합니다.
  2. 그리고 이 subscriber는 해당 메시지가 올 때까지 대기합니다. (연결이 종료되기 전까지)
  3. publisher client는 broker한테 특정 topic에 대한 메시지를 전송합니다.
  4. broker는 이 특정 topic을 구독했던 subscriber에게 해당 메시지를 전달합니다.

5. mosquitto를 이용한 MQTT 통신 예시

MQTT broker로 mosquitto라는 오픈소스 메시징 브로커를 이용해 이 통신에 대해 더 알아보았습니다.

먼저 homebrew 로 mosquitto를 설치합니다.
brew install mosquitto

그 다음 mosquitto config 파일을 수정해주어야합니다.
/opt/homebrew/etc/mosquitto 의 위치에 mosquitto.conf 파일이 위치해있는데 (혹시 다를 수 있으니 참고)
여기에 다음을 추가해야합니다.

#mqtt
listener 1883 127.0.0.1
protocol mqtt

allow_anonymous true
allow_zero_length_clientid true

이를 설정하고 mosquitto를 재시작해야합니다!

다음은 제가 테스트 한 예시입니다.
토픽은 test1, test2가 있고
subscriber 1,2 는 test1 을 구독합니다.
subscriber 3은 test2 를 구독합니다.

publisher가 토픽 test1에 대한 메시지를 발행하면 subscriber1, 2가 해당 메시지를 받게 되고
publisher가 토픽 test2에 대한 메시지를 발행하면 subscriber3이 해당 메시지를 받게됩니다.

예시는 다음과 같습니다.
mqtt broker 서버를 키고,
subscriber1,2 가 test1 토픽을 구독하고, subscriber3이 test2 토픽을 구독합니다.
그러면 다음과 같이 서버 창에 New client connected from 127.0.0.1: .. 와 같이 subscriber가 연결이 된 것을 확인할 수 있습니다


publisher가 test1 토픽에 대해 메시지 1, 메시지 2, 메시지 3 을 발행하고
test2 토픽에 대해서는 메시지 4, 메시지 5를 발행합니다.
broker는 test1 토픽을 구독한 subscriber1,2 에게 해당 메시지 1,2,3 을 전달하고, test2 토픽을 구독한 subscribe3에게 메시지 4,5를 전달합니다.

간단하게 mosquitto broker만 통해서 MQTT 통신을 확인해보았는데,
다음 번에는 코드를 이용해서도 직접 확인해봐야겠습니다 ㅎㅎ

profile
꾸준히, 열심히, 그리고 잘하자

0개의 댓글