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()