본문 바로가기
컴퓨터|인터넷/라즈베리파이

MQTT Python client

by 즐거운 지니 2024. 9. 22.
반응형

paho-mqtt 라이브러리는 Python에서 MQTT 프로토콜을 사용하여 메시지를 퍼블리싱하고 구독하는 데 많이 사용됩니다. 아래는 paho-mqtt를 사용하여 퍼블리셔 역할을 수행하는 간단한 Python 예제입니다.

설치:

먼저 paho-mqtt 라이브러리를 설치해야 합니다. 다음 명령어를 통해 설치할 수 있습니다.

pip install paho-mqtt

기본 퍼블리셔 예제:

import paho.mqtt.client as mqtt

# 브로커에 연결되었을 때 실행될 콜백 함수
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected successfully to broker")
    else:
        print(f"Connection failed with code {rc}")

# 메시지를 퍼블리시한 후 실행될 콜백 함수
def on_publish(client, userdata, mid):
    print(f"Message {mid} published.")

# MQTT 클라이언트 생성
client = mqtt.Client()

# 콜백 함수 연결
client.on_connect = on_connect
client.on_publish = on_publish

# 브로커 연결 (호스트 이름과 포트)
client.connect("localhost", 1883, 60)

# 연결 유지 및 메시지 퍼블리시
client.loop_start()

# 메시지 퍼블리시 (토픽: test/topic, 메시지: Hello, MQTT)
client.publish("test/topic", payload="Hello, MQTT", qos=0, retain=False)

# 연결 유지 시간을 주기 위해 잠시 대기
import time
time.sleep(2)

# 연결 종료
client.loop_stop()
client.disconnect()

설명:

  1. 브로커 연결: client.connect("localhost", 1883, 60)는 로컬 브로커에 연결합니다. 원격 브로커의 경우 IP 주소나 호스트 이름을 변경해야 합니다.
  2. 메시지 퍼블리싱: client.publish("test/topic", payload="Hello, MQTT")를 통해 test/topic 토픽으로 "Hello, MQTT" 메시지를 전송합니다.
  3. QoS 및 retain 설정:
    • qos: 메시지 전송 품질 (0, 1, 2 중 선택 가능)
    • retain: 메시지를 브로커에 보관할지 여부 (True 또는 False)
  4. 콜백 함수:
    • on_connect: 브로커와 연결되었을 때 호출되는 함수.
    • on_publish: 메시지가 성공적으로 퍼블리시되었을 때 호출되는 함수.

바이너리 파일 퍼블리싱 예제:

바이너리 파일을 퍼블리시하려면, 파일을 바이너리로 읽어서 publish 메서드의 payload에 전달하면 됩니다.

import paho.mqtt.client as mqtt

# 브로커에 연결되었을 때 실행될 콜백 함수
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected successfully to broker")
    else:
        print(f"Connection failed with code {rc}")

# 메시지를 퍼블리시한 후 실행될 콜백 함수
def on_publish(client, userdata, mid):
    print(f"Message {mid} published.")

# MQTT 클라이언트 생성
client = mqtt.Client()

# 콜백 함수 연결
client.on_connect = on_connect
client.on_publish = on_publish

# 브로커 연결 (호스트 이름과 포트)
client.connect("localhost", 1883, 60)

# 연결 유지 및 메시지 퍼블리시
client.loop_start()

# 바이너리 파일 읽기
with open("path/to/your/file.bin", "rb") as file:
    binary_data = file.read()

# 바이너리 데이터를 퍼블리시 (토픽: test/topic)
client.publish("test/topic", payload=binary_data, qos=0, retain=False)

# 연결 유지 시간을 주기 위해 잠시 대기
import time
time.sleep(2)

# 연결 종료
client.loop_stop()
client.disconnect()

구독 및 출판 예제 코드 (mqtt_example.py)

import paho.mqtt.client as mqtt
import time

# MQTT 브로커 정보
BROKER = 'localhost'  # 브로커 주소 (예: localhost 또는 IP)
PORT = 1883           # 브로커 포트
TOPIC = 'test/topic'  # 퍼블리시할 토픽과 구독할 토픽

# 구독했을 때 메시지를 받을 콜백 함수
def on_message(client, userdata, message):
    print(f"Received message: {str(message.payload.decode('utf-8'))} from topic: {message.topic}")

# MQTT 브로커에 연결되었을 때 호출될 콜백 함수
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected successfully to broker")
        # 연결되면 구독 시작
        client.subscribe(TOPIC)
        print(f"Subscribed to topic: {TOPIC}")
    else:
        print(f"Connection failed with code {rc}")

# MQTT 퍼블리시 함수
def publish_message(client, topic, message):
    client.publish(topic, message)
    print(f"Published message: {message} to topic: {topic}")

# MQTT 클라이언트 생성 및 콜백 함수 연결
client = mqtt.Client()

client.on_connect = on_connect
client.on_message = on_message

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

# 비동기로 MQTT 클라이언트 시작
client.loop_start()

# 메시지를 주기적으로 퍼블리시 (5초 간격)
try:
    while True:
        publish_message(client, TOPIC, "Hello MQTT")
        time.sleep(5)
except KeyboardInterrupt:
    print("Program stopped")

# 클라이언트 종료
client.loop_stop()
client.disconnect()

코드 설명

  1. 브로커 정보 설정:
    • BROKER: 브로커 주소를 설정합니다. 로컬 브로커일 경우 localhost로 설정하고, 원격 브로커라면 해당 IP 또는 도메인을 입력하세요.
    • PORT: MQTT 브로커의 포트 번호(기본값은 1883).
    • TOPIC: 구독 및 출판에 사용할 MQTT 토픽입니다.
  2. 콜백 함수:
    • on_message(client, userdata, message): 메시지를 구독했을 때 호출되는 함수로, 메시지 내용과 토픽을 출력합니다.
    • on_connect(client, userdata, flags, rc): 브로커에 연결되었을 때 호출되며, 연결 성공 시 토픽을 구독합니다.
  3. 메시지 출판:
    • publish_message(client, topic, message): 주어진 토픽에 메시지를 퍼블리시하는 함수입니다. 이 예제에서는 주기적으로 "Hello MQTT" 메시지를 5초 간격으로 퍼블리시합니다.
  4. MQTT 클라이언트 동작:
    • client.loop_start(): 비동기적으로 MQTT 클라이언트를 시작하여 구독과 퍼블리시 작업을 동시에 처리할 수 있게 합니다.
    • 무한 루프 안에서 publish_message() 함수를 통해 주기적으로 메시지를 퍼블리시합니다.
  5. 종료 처리:
    • KeyboardInterrupt를 통해 프로그램을 중단하면, client.loop_stop()client.disconnect()로 안전하게 클라이언트를 종료합니다.
반응형

댓글