[IoT] MQTT 개념 및 환경 구축 (내부 네트워크)
참고자료:
https://www.eclipse.org/community/eclipse_newsletter/2014/october/article2.php
MQTT 101 – How to Get Started with the lightweight IoT Protocol | The Eclipse Foundation
The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.
www.eclipse.org
1. MQTT 개요 및 기본 개념
1.1 MQTT란?
MQTT(Message Queuing Telemetry Transport)는 사물인터넷(IoT) 기기 간의 경량 메시지 프로토콜입니다. 1999년 IBM에서 개발되었으며, 이후 OASIS(Open Application Group)에서 표준화되었습니다. MQTT는 저전력, 저대역폭 환경에서도 안정적으로 동작하도록 설계되었으며, 특히 센서 네트워크, 원격 제어 시스템, 실시간 데이터 스트리밍과 같은 분야에서 널리 사용됩니다.
MQTT는 클라이언트-서버 모델이 아니라 출판(Publish) 및 구독(Subscribe) 모델을 기반으로 동작합니다. 즉, 특정 클라이언트가 서버(브로커)에 직접 데이터를 전송하는 방식이 아니라, 여러 클라이언트가 토픽(Topic)을 기반으로 데이터를 주고받을 수 있도록 합니다.
keyword: 메세지 큐, 토픽, 출판, 구독
1.2 MQTT의 특징 및 장점
- 경량 프로토콜: 최소한의 오버헤드를 사용하여 배터리와 네트워크 자원이 제한된 장치에서도 효율적으로 작동합니다.
- 비동기 통신: 클라이언트와 브로커 간의 지속적인 연결이 필요하지 않아 네트워크 부하를 줄일 수 있습니다.
- QoS(Quality of Service): 다양한 메시지 전달 보장 수준을 제공하여 안정적인 통신을 가능하게 합니다.
- 낮은 대역폭 사용: 단순한 메시지 포맷을 사용하여 네트워크 자원을 절약합니다.
- 확장성: 다양한 장치에서 활용 가능하며, 소규모 네트워크에서 클라우드 기반 IoT 시스템까지 확장할 수 있습니다.
- 지속 연결: 연결이 끊겨도 특정 조건에서 메시지를 유지하고 재전송할 수 있습니다.
1.3 MQTT 기본 동작 원리
MQTT의 핵심 요소는 브로커(Broker)와 클라이언트(Client)이며, 주요 동작 방식은 다음과 같습니다.
- 브로커(Broker): 모든 클라이언트 간의 메시지를 중개하는 역할을 수행합니다. 클라이언트는 브로커를 통해서만 메시지를 송수신할 수 있습니다.
- 클라이언트(Client): MQTT 네트워크에 참여하는 장치로, 데이터를 발행(Publish)하거나 특정 토픽을 구독(Subscribe)할 수 있습니다.
- 토픽(Topic): 메시지를 분류하는 계층적 구조로, 예를 들어 home/livingroom/temperature와 같은 방식으로 데이터를 구분할 수 있습니다.
- QoS(Quality of Service): 메시지 전달 보장 수준을 설정하여 신뢰성 있는 데이터 전송을 가능하게 합니다.
2. MQTT 아키텍처 및 주요 개념
2.1 QoS(Quality of Service) 레벨
MQTT는 3가지 QoS 레벨을 제공하여 메시지 전달 보장 수준을 조정합니다.
- QoS 0 (At most once): 메시지가 한 번만 전달되며, 손실될 가능성이 있습니다. 가장 빠른 전송 방식이며, 주로 센서 데이터처럼 손실이 허용되는 데이터에 사용됩니다.
- QoS 1 (At least once): 메시지가 최소 한 번 전달되며, 중복될 가능성이 있습니다. 클라이언트가 메시지를 수신했음을 확인하지 않으면 재전송됩니다.
- QoS 2 (Exactly once): 메시지가 정확히 한 번만 전달됩니다. 신뢰성이 가장 높은 방식이지만, 네트워크 오버헤드가 큽니다.
2.2 MQTT의 주요 개념
- Retained 메시지: 브로커가 마지막 메시지를 저장하여 새로운 구독자에게 전달하도록 합니다. 이를 통해 최근 상태 정보를 새로운 구독자에게 즉시 제공할 수 있습니다.
- Last Will and Testament (LWT): 클라이언트가 비정상적으로 종료될 경우, 브로커가 설정된 메시지를 대신 전송하도록 합니다. 이를 활용해 클라이언트의 오프라인 상태를 감지할 수 있습니다.
- Clean Session: 클라이언트가 연결을 종료한 후에도 이전 구독 정보를 유지할지 여부를 결정하는 설정입니다.
- Wildcard Topics: 특정 그룹의 토픽을 구독할 수 있도록 와일드카드(+, #)를 지원합니다.
3. MQTT 설치 및 환경 구축 (라즈베리파이 기준 - 우분투 동일)
저는 라즈베리파이 4로 진행했습니다.
3.1 Mosquitto 브로커 설치
라즈베리파이 4에서 Mosquitto 브로커를 설치하려면 다음 명령어를 사용합니다.
sudo apt update
sudo apt install mosquitto mosquitto-clients -y
설치 후 Mosquitto 서비스를 활성화합니다.
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
3.2 라즈베리파이와 WINDOW 간 MQTT 연결 설정
라즈베리파이와 같은 네트워크(Wi-Fi 또는 LAN)에 있는 노트북에서 MQTT 브로커와 통신하려면 라즈베리파이의 IP 주소를 사용해야 합니다.
1) 라즈베리파이의 IP 주소 확인
hostname -I
예제 출력:
192.168.1.100
2) Mosquitto 브로커가 외부 장치에서 접근 가능하도록 설정
Mosquitto 설정 파일을 수정합니다.
sudo nano /etc/mosquitto/mosquitto.conf
아래 내용을 추가합니다.
listener 1883
allow_anonymous true
변경 후 Mosquitto를 재시작합니다.
sudo systemctl restart mosquitto
3) 노트북에서 MQTT 메시지 송수신 테스트
노트북에서 Subscriber 실행:
mosquitto_sub -h 192.168.1.100 -t "test/topic"
노트북에서 Publisher 실행:
mosquitto_pub -h 192.168.1.100 -t "test/topic" -m "Hello from Laptop"
이제 같은 네트워크 내에서 라즈베리파이와 노트북 간 MQTT 메시지 통신이 가능합니다.
4. Python을 활용한 간단한 MQTT 통신 구현
4.1 paho-mqtt 라이브러리 설치
라즈베리파이에서 Python을 이용하여 MQTT 통신을 구현하기 위해 paho-mqtt 라이브러리를 설치합니다.
pip install paho-mqtt
4.2 MQTT Publisher 구현
import paho.mqtt.client as mqtt
broker = "localhost"
port = 1883
topic = "test/topic"
client = mqtt.Client()
client.connect(broker, port, 60)
client.publish(topic, "Hello MQTT from Python on Raspberry Pi")
client.disconnect()
4.3 MQTT Subscriber 구현
import paho.mqtt.client as mqtt
def on_message(client, userdata, message):
print(f"Received message: {message.payload.decode()}")
broker = "localhost"
port = 1883
topic = "test/topic"
client = mqtt.Client()
client.on_message = on_message
client.connect(broker, port, 60)
client.subscribe(topic)
client.loop_forever()
4.4 실행 결과
Publisher 실행 결과
$ python3 publisher.py
출력:
Message published to topic: test/topic
Subscriber 실행 결과
$ python3 subscriber.py
출력:
Received message: Hello MQTT from Python on Raspberry Pi
'Computer Science > CS 지식' 카테고리의 다른 글
교류 전력과 역률(Power Factor) (0) | 2025.03.10 |
---|---|
[Modbus] Modscan & Modsim 으로 TCP 통신하기 (0) | 2025.03.09 |
모드버스(Modebus) 프로토콜 (feat. RTU, TCP/IP, Function Code) (0) | 2025.03.07 |
LoRa (Long Range)와 LoRaWAN(Long Range Wide Area Network) (1) | 2025.03.05 |
시리얼 통신(Serial Communication) (0) | 2025.03.05 |