124 lines
3.3 KiB
Python
124 lines
3.3 KiB
Python
|
|
import threading
|
||
|
|
import os, sys
|
||
|
|
import paho.mqtt.client as mqtt
|
||
|
|
|
||
|
|
"""
|
||
|
|
todo
|
||
|
|
|
||
|
|
log 설정 별도 필요
|
||
|
|
상수값 설정 필요
|
||
|
|
"""
|
||
|
|
|
||
|
|
MQTT_USER_ID = "a2d2admin"
|
||
|
|
MQTT_USER_PW = "a2d24992!"
|
||
|
|
MQTT_HOST = "localhost"
|
||
|
|
MQTT_PORT = 52002
|
||
|
|
|
||
|
|
class MQTTManager:
|
||
|
|
"""
|
||
|
|
MQTT manager
|
||
|
|
subscribe 사용시 set_onmessage 함수 이용하여 on_message세팅
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self,
|
||
|
|
name="MQTT",
|
||
|
|
id=MQTT_USER_ID,
|
||
|
|
pw=MQTT_USER_PW,
|
||
|
|
host=MQTT_HOST,
|
||
|
|
port=MQTT_PORT) -> None:
|
||
|
|
self.name = name
|
||
|
|
self.id = id
|
||
|
|
self.pw = pw
|
||
|
|
self.host = host
|
||
|
|
self.port = port
|
||
|
|
|
||
|
|
self.status = False
|
||
|
|
self.status_subscribe = False
|
||
|
|
|
||
|
|
self.client = mqtt.Client()
|
||
|
|
|
||
|
|
self.client.username_pw_set(self.id, self.pw)
|
||
|
|
self.client.on_connect = self.on_connect
|
||
|
|
self.client.on_disconnect = self.on_disconnect
|
||
|
|
self.client.on_subscribe = self.on_subscribe
|
||
|
|
self.client.on_unsubscribe = self.on_unsubscribe
|
||
|
|
self.client.on_message = self.on_message
|
||
|
|
|
||
|
|
self.mqtt_lock = threading.Lock()
|
||
|
|
|
||
|
|
def __del__(self):
|
||
|
|
self.end()
|
||
|
|
|
||
|
|
def set_onmessage(self, function):
|
||
|
|
self.client.on_message = function
|
||
|
|
|
||
|
|
def get_status(self):
|
||
|
|
return self.status
|
||
|
|
|
||
|
|
def mqtt_connect(self):
|
||
|
|
try:
|
||
|
|
if self.status:
|
||
|
|
pass #log.warning('Already connected to mqtt')
|
||
|
|
else:
|
||
|
|
self.client.connect(self.host, self.port)
|
||
|
|
except Exception as e:
|
||
|
|
pass #log.error((f"{self.name} connect fail"))
|
||
|
|
raise ConnectionError(f"{self.name} connect fail")
|
||
|
|
|
||
|
|
def on_connect(self, client, userdata, flags, rc):
|
||
|
|
"""
|
||
|
|
mqtt 연결 확인 함수
|
||
|
|
연결이 정상적으로 되었다면 rc = 0
|
||
|
|
"""
|
||
|
|
if rc == 0:
|
||
|
|
self.mqtt_lock.acquire()
|
||
|
|
self.status = True
|
||
|
|
pass #log.info(f"{self.name} connected OK")
|
||
|
|
self.mqtt_lock.release()
|
||
|
|
else:
|
||
|
|
pass #log.warning("Bad connection Returned code=", rc)
|
||
|
|
|
||
|
|
def on_disconnect(self, client, userdata, flags, rc=0):
|
||
|
|
pass #log.info(f"{self.name} disconnected")
|
||
|
|
self.mqtt_lock.acquire()
|
||
|
|
self.status = False
|
||
|
|
self.mqtt_lock.release()
|
||
|
|
|
||
|
|
def on_subscribe(self, client, userdata, mid, granted_qos):
|
||
|
|
self.status_subscribe = True
|
||
|
|
pass #log.info("subscribed: " + str(mid) + " " + str(granted_qos))
|
||
|
|
|
||
|
|
def on_unsubscribe(self, client, userdata, mid):
|
||
|
|
self.status_subscribe = False
|
||
|
|
pass #log.info("unsubscribed: " + str(mid))
|
||
|
|
|
||
|
|
def on_message(self, client, userdata, msg):
|
||
|
|
"""
|
||
|
|
구독중인 상태에서 메세지가 들어왔을때 처리 함수
|
||
|
|
set_onmessage 에서 set 하여 사용
|
||
|
|
"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
def start_pub(self):
|
||
|
|
self.client.loop_start()
|
||
|
|
|
||
|
|
def start_sub(self, topic):
|
||
|
|
self.client.subscribe(topic)
|
||
|
|
self.client.loop_start()
|
||
|
|
|
||
|
|
def end_sub(self, topic):
|
||
|
|
self.client.unsubscribe(topic)
|
||
|
|
# self.client.loop_stop()
|
||
|
|
|
||
|
|
def end(self):
|
||
|
|
self.client.loop_stop()
|
||
|
|
self.client.disconnect()
|
||
|
|
pass #log.info(f"{self.name} Ending Connection")
|
||
|
|
|
||
|
|
|
||
|
|
mqtt_publisher = None
|
||
|
|
|
||
|
|
if mqtt_publisher is None:
|
||
|
|
mqtt_publisher = MQTTManager()
|
||
|
|
mqtt_publisher.mqtt_connect()
|
||
|
|
mqtt_publisher.start_pub()
|