반응형
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()
설명:
- 브로커 연결:
client.connect("localhost", 1883, 60)
는 로컬 브로커에 연결합니다. 원격 브로커의 경우 IP 주소나 호스트 이름을 변경해야 합니다. - 메시지 퍼블리싱:
client.publish("test/topic", payload="Hello, MQTT")
를 통해test/topic
토픽으로 "Hello, MQTT" 메시지를 전송합니다. - QoS 및 retain 설정:
qos
: 메시지 전송 품질 (0, 1, 2 중 선택 가능)retain
: 메시지를 브로커에 보관할지 여부 (True
또는False
)
- 콜백 함수:
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()
코드 설명
- 브로커 정보 설정:
BROKER
: 브로커 주소를 설정합니다. 로컬 브로커일 경우localhost
로 설정하고, 원격 브로커라면 해당 IP 또는 도메인을 입력하세요.PORT
: MQTT 브로커의 포트 번호(기본값은 1883).TOPIC
: 구독 및 출판에 사용할 MQTT 토픽입니다.
- 콜백 함수:
on_message(client, userdata, message)
: 메시지를 구독했을 때 호출되는 함수로, 메시지 내용과 토픽을 출력합니다.on_connect(client, userdata, flags, rc)
: 브로커에 연결되었을 때 호출되며, 연결 성공 시 토픽을 구독합니다.
- 메시지 출판:
publish_message(client, topic, message)
: 주어진 토픽에 메시지를 퍼블리시하는 함수입니다. 이 예제에서는 주기적으로"Hello MQTT"
메시지를 5초 간격으로 퍼블리시합니다.
- MQTT 클라이언트 동작:
client.loop_start()
: 비동기적으로 MQTT 클라이언트를 시작하여 구독과 퍼블리시 작업을 동시에 처리할 수 있게 합니다.- 무한 루프 안에서
publish_message()
함수를 통해 주기적으로 메시지를 퍼블리시합니다.
- 종료 처리:
KeyboardInterrupt
를 통해 프로그램을 중단하면,client.loop_stop()
과client.disconnect()
로 안전하게 클라이언트를 종료합니다.
반응형
'컴퓨터|인터넷 > 라즈베리파이' 카테고리의 다른 글
Node-red: WebSocket In/out (1) | 2024.10.03 |
---|---|
Node-red: http in (2) | 2024.10.03 |
Node-red 설치 (0) | 2024.09.22 |
라즈베리파이를 위한 모스키토+paho-mqtt+Node-RED+dashboard2 설치 (0) | 2024.07.30 |
라즈베리파이+피코+파이썬 메모리 관리 (0) | 2024.07.20 |
댓글