MQTT · 2025-12-10

Python(Paho)로 MQTT 클라이언트 만들기 예제

Python과 Paho 라이브러리를 사용해 MQTT 브로커 연결, 구독과 발행을 구현하는 단계별 코드 설명 자료

작성일 : 2025-12-10 ㆍ 작성자 : 관리자
post
목차

개요

이 글은 Python 환경에서 Paho 라이브러리로 MQTT 클라이언트를 만드는 방법을 친절하게 설명한다. MQTT 개념이 처음인 독자도 이해할 수 있도록 연결, 구독, 발행, QoS, 콜백 처리 흐름을 차근차근 정리했다. 또한 실무에서 바로 사용할 수 있는 코드 예제를 포함한다.

사전 준비

필수 요소

  • Python 3.6 이상
  • paho-mqtt 패키지 설치: pip install paho-mqtt
  • 접속 가능한 MQTT 브로커(예: public broker 또는 로컬 Mosquitto)

기본 개념 요약

MQTT는 경량 메시지 프로토콜로 발행-구독 모델을 사용한다. 클라이언트는 브로커에 연결한 뒤 특정 토픽을 구독하거나 메시지를 발행한다. QoS는 메시지 전달 신뢰도를 제어하는 값이다.

핵심 콜백과 흐름

주요 콜백 함수

  • on_connect: 브로커에 연결되었을 때 호출
  • on_disconnect: 연결이 끊겼을 때 호출
  • on_message: 구독한 토픽으로 메시지가 도착했을 때 호출
  • on_publish: 메시지 발행이 완료되었을 때 호출

간단한 통합 예제 코드

다음 코드는 하나의 스크립트에서 연결, 구독, 발행을 모두 보여준다. 테스트용으로 로컬 브로커나 공개 브로커를 사용할 수 있다.

import time
import paho.mqtt.client as mqtt

BROKER = "test.mosquitto.org"
PORT = 1883
TOPIC = "example/python/paho"

# 연결 시 호출
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to broker")
        client.subscribe(TOPIC, qos=1)
    else:
        print("Connect failed with code", rc)

# 메시지 수신 시 호출
def on_message(client, userdata, msg):
    print(f"Received topic={msg.topic}, payload={msg.payload.decode()}")

# 발행 완료 시 호출
def on_publish(client, userdata, mid):
    print("Message published, mid=", mid)

# 클라이언트 초기화
client = mqtt.Client(client_id="paho_example_client")
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish

# 브로커 연결
client.connect(BROKER, PORT, keepalive=60)

# 백그라운드 루프 시작
client.loop_start()

try:
    # 주기적으로 메시지 발행
    for i in range(1, 6):
        payload = f"hello {i}"
        result = client.publish(TOPIC, payload=payload, qos=1)
        status = result[0]
        if status == 0:
            print(f"Sent `{payload}` to topic `{TOPIC}`")
        else:
            print(f"Failed to send message to topic {TOPIC}")
        time.sleep(2)
    # 메시지 수신을 위한 대기 시간
    time.sleep(5)
finally:
    client.loop_stop()
    client.disconnect()

구독과 발행을 분리한 구조

실무에서는 발행자와 구독자를 분리해 운용하는 편이 바람직하다. 구독자는 항상 연결을 유지하며 메시지를 비동기로 처리하고, 발행자는 필요한 시점에만 브로커에 메시지를 보낸다.

QoS와 메시지 신뢰도

QoS 레벨은 0, 1, 2로 나뉜다. QoS=0은 최소 전달, QoS=1은 한 번 이상 전달, QoS=2는 정확히 한 번 전달을 보장한다. 일반적인 센서 데이터는 QoS=0이나 1이 적절하다.

연결 유지와 재접속 전략

  • keepalive 값을 적절히 설정하면 연결 유지를 도울 수 있다.
  • 네트워크 불안정 환경에서는 on_disconnect에서 재접속 로직을 구현한다.
  • 백오프(backoff) 전략으로 재시도를 제어하면 브로커 부담을 줄인다.

보안 고려사항

실서비스에서는 TLS와 사용자 인증을 사용해 통신을 보호한다. Paho는 TLS 연결과 username/password 인증을 지원한다. 브로커의 인증서와 포트를 확인해서 설정을 적용한다.

실행 팁과 문제 해결

  • 접속 실패 시 브로커 주소와 포트, 방화벽 설정을 점검한다.
  • 토픽 이름 규칙을 일관성 있게 정하면 관리가 수월하다.
  • 로그 레벨을 올려 연결 과정과 에러를 확인한다.

마무리

이상으로 python mqtt paho 예제 중심의 paho mqtt 튜토리얼을 마무리한다. 제공한 통합 예제는 python mqtt 구독 발행 흐름을 이해하는 데 도움이 되며, 보안과 재접속 전략을 추가하면 실제 서비스에도 적용 가능한 구조가 된다.

python mqtt paho 예제 paho mqtt 튜토리얼 python mqtt 구독 발행 mqtt python paho-mqtt mqtt 예제 mqtt qos python mqtt