MQTT Protocol

하겅 ·2025년 3월 16일

Capstone

목록 보기
5/14

MQTT

  • Message Queuning Telemetry Transport
  • 게시(publish) / 구독(subscribe)메시징 전송 프로토콜
    • 메시지 공유를 위한 토픽을 정의
  • MQTT 브로커, MQTT 클라이언트로 구성
    • MQTT 브로커: 특정 토픽에 연결된 클라이언트에게 메시지를 전달 & 클라이언트의 상태를 관리하고 추적
    • MQTT 클라이언트: 사용자가 원하는 토픽에 접속해 메시지를 보내거나 수신
  • 인터넷을 통해 IoT 장치를 연결하는 안정적이고 확장 가능한 방법 제공
    • 실제로 TCP/IP 혹은 양방향 연결 네트워크 프로토콜을 통해 동작함
    • push 서비스가 많은 경우 MQTT가 효율적

특징

1. 게시 / 구독 메시지 패턴을 사용

일대다 메시지 배포 및 애플리케이션 분리 제공

2. 페이로드 내용과 무관한 메시지 전송

페이로드 없이도 유의미한 메시지 전송 가능

3. 메시지 전달을 위한 세 가지 QoS 제공

  • QoS=0 "최대 한 번" 운영 환경의 최선의 메시지
  • QoS=1 "적어도 한 번" 메시지가 도착하는 것이 보장되지만 중복 발생 가능
  • QoS=2 "정확히 한 번" 메시지가 정확히 한 번 도착하도록 보장
QoS 수준설명오버헤드 발생 정도
QoS 0 (At most once)한 번만 전송 (전송 확인 없음)✅ 최소 (낮음)
QoS 1 (At least once)최소 1회 전달🔼 중간
QoS 2 (Exaclty once)정확히 1회 전달 (4번 메시지 왕복)🔴 높음 (오버헤드 큼)

메시지 전송 성공률 & 오버헤드 증가 At most once > At least once > Exaclty once

4. 네트워크 트래픽을 줄이기 위해 전송 오버헤드를 최소화

5. 프로토콜 교환을 최소화

QoS 조정하는 게 4, 5번을 실현하는 방법 중 하나

6. 연결 끊김 문제 발생 시 이해관계자에게 알림

이해 관계자 EX) MQTT 브로커, 다른 MQTT 클라이언트 (구독자/퍼블리셔) → MQTT 브로커의 해당 토픽에 Last Will 메시지를 보내 상위 시스템에 알릴 수 있음




✳️ TEST (Node-RED, CLI)

MQTT 구현 Broker Software

  • mosquitto_pub로 "Hello World" 메시지를 게시하고, mosquitto_sub로 구독해 내용 확인

성공적으로 결과가 나온 것을 알 수 있습니다 여기서 더 나아가 캡스톤에 사용하게 될 Node-RED를 응용해 보겠습니다

1️⃣ mqtt out 노드 설정

name: 이름 입력 (저는 모스키토로 했습니다)
server: localhost (로컬의 1883 포트 사용 중)
port: 1883
client ID: 클라이언트 아이디로 중복이 없도록 유일한 임의의 문자로 설정 (저는 다음 페이지에 나올 토픽과 동일하게 했지만 다르게 하는 게 일반적입니다 ㅎ)

UPDATE 버튼 클릭 시 아래 화면으로 이동하게 됩니다 위의 client ID로 Topic을 작성해 줬습니다

⭐⭐ topic은 나만이 알 수 있는 유니크한 토픽명으로 작성해야 합니다 (기존 topic과 겹치지 않도록)

2️⃣ mqtt in 노드 설정

  • 토픽을 위와 동일하게 입력해 줍니다

DONE 클릭 후 배포

  • Node-RED의 MQTT 노드는 Mosquitto 브로커와 연결된 것이고, 실제 메시지가 정상적으로 송수신되었기 때문에 MQTT가 올바르게 실행되어 connected가 뜬 것입니다

inject 노드 실행


  • inject 노드에 작성해뒀던 메시지가 무사히 뜨는 걸 확인할 수 있었습니다



이어서 CLI 화면과 노드 레드 간 TEST도 진행해 봤습니다

1️⃣ node-red 게시(mqtt out) → CLI 구독 (sub)

CLI 화면1

C:\Program Files\mosquitto>mosquitto_sub -t node-red-study-test-khk

Sending MQTT messages using node-red

  • mosquitto_sub -t [노드 레드 토픽]
  • CLI 화면에서 Node-RED에서 만든 mqtt out 노드를 구독한 것이며 inject에 설정해둔 메시지가 출력되는 것을 확인할 수 있습니다

CLI 화면2 (참고용)

16 Mar 17:58:33 - [info][mqtt-broker:Mosquittio] Connected to broker: node-red-study-test-khk@mqtt://localhost:1883


2️⃣ CLI 게시(pub) → node-red 구독 (mqtt in)

  • 이번에는 CLI에서 게시를 하고 Node-RED의 mqtt in 노드로 읽어오는 테스트를 진행해 봤습니다

C:\Program Files\mosquitto>mosquitto_pub -t node-red-study-test-khk -m "Hello from Mosquitto CLI"

  • mosquitto_pub -t [토픽] -m [메시지 내용]
  • 아래 사진과 같이 nodered mqtt in 디버그 화면 확인해 보면 메시지 확인을 할 수 있었습니다
  • 배포와 inject를 실행한 상태여서 다른 동작을 하지 않고도 결과가 바로 출력됨을 알 수 있었습니다





더 공부해야 할 것

  • ESP32의 센서 데이터를 MQTT 프로토콜을 통해 브로커에 전송시키는 실습

  • ESP32가 데이터를 mosquitto_pub로 전송하려면? ESP32는 mqtt_publish 함수를 사용하여 MQTT 브로커에 데이터를 게시함

  • Node-RED는 mqtt in 노드를 사용하여 해당 토픽을 구독 (센서 데이터를 수신하여 처리)

profile
건강합시다

0개의 댓글