def connect(self): MQTT_Base.connect(self) self.mqtt_client = mqtt_client.Client( client_id=self.mqtt_settings['MQTT_CLIENT_ID']) self.mqtt_client.on_connect = self._on_connect self.mqtt_client.on_message = self._on_message #self.mqtt_client.on_publish = self._on_publish self.mqtt_client.on_disconnect = self._on_disconnect self.mqtt_client.enable_logger(mqtt_logger) self.mqtt_client.enable_logger() if self.mqtt_settings['MQTT_USERNAME']: self.mqtt_client.username_pw_set( self.mqtt_settings['MQTT_USERNAME'], password=self.mqtt_settings['MQTT_PASSWORD']) try: self.mqtt_client.connect( self.mqtt_settings['MQTT_BROKER'], port=self.mqtt_settings['MQTT_PORT'], keepalive=self.mqtt_settings['MQTT_KEEPALIVE'], ) self.mqtt_client.loop_start() except Exception as e: logger.warning('MQTT Unable to connect to Broker {}'.format(e))
def connect(self): MQTT_Base.connect(self) self.mqtt_client = mqtt_client.Client( client_id=self.mqtt_settings["MQTT_CLIENT_ID"]) self.mqtt_client.on_connect = self._on_connect self.mqtt_client.on_message = self._on_message # self.mqtt_client.on_publish = self._on_publish self.mqtt_client.on_disconnect = self._on_disconnect #self.mqtt_client.enable_logger(mqtt_logger) #self.mqtt_client.enable_logger() self.set_will(self.last_will, "lost", True, 1) if self.mqtt_settings["MQTT_USERNAME"]: self.mqtt_client.username_pw_set( self.mqtt_settings["MQTT_USERNAME"], password=self.mqtt_settings["MQTT_PASSWORD"], ) try: self.mqtt_client.connect( self.mqtt_settings["MQTT_BROKER"], port=self.mqtt_settings["MQTT_PORT"], keepalive=self.mqtt_settings["MQTT_KEEPALIVE"], ) self.mqtt_client.loop_start() except Exception as e: logger.warning("MQTT Unable to connect to Broker {}".format(e)) self.mqtt_client.on_connect = self._on_connect self.mqtt_client.on_message = self._on_message self.mqtt_client.on_disconnect = self._on_disconnect if self.mqtt_settings["MQTT_USERNAME"]: self.mqtt_client.username_pw_set( self.mqtt_settings["MQTT_USERNAME"], password=self.mqtt_settings["MQTT_PASSWORD"], ) def start(): try: asyncio.set_event_loop(self.event_loop) logger.info('Starting Asyincio looping forever') self.event_loop.run_forever() logger.warning('Event loop stopped') except Exception as e: logger.error('Error in event loop {}'.format(e)) self.event_loop = asyncio.new_event_loop() logger.info("Starting MQTT publish thread") self._ws_thread = threading.Thread(target=start, args=()) self._ws_thread.daemon = True self._ws_thread.start()
def publish(self, topic, payload, retain, qos): MQTT_Base.publish(self, topic, payload, retain, qos) def p(): self.mqtt_client.publish(topic, payload, retain=retain, qos=qos) wrapped = functools.partial(p) self.event_loop.call_soon_threadsafe(wrapped)
def _on_disconnect(self, client, userdata, rc): self.mqtt_connected = False # note, change this uses the property setter, do not really need to catch this in the base class if rc > 0: # unexpected disconnect rc_text = "Unknown result code {}".format(rc) if rc in COONNECTION_RESULT_CODES: rc_text = COONNECTION_RESULT_CODES[rc] logger.warning("MQTT Unexpected disconnection {} {} {}".format( client, userdata, rc_text)) MQTT_Base._on_disconnect(self, rc)
def publish(self, topic, payload, retain, qos): MQTT_Base.publish(self, topic, payload, retain, qos) if self.mqtt_connected is True: wrapped = functools.partial(self.mqtt_client.publish, topic, payload, retain=retain, qos=qos) self.event_loop.call_soon_threadsafe(wrapped) else: logger.warning( "Device MQTT publish NOT CONNECTED: {}, retain {}, qos {}, payload: {}" .format(topic, retain, qos, payload))
def connect(self): MQTT_Base.connect(self) self.mqtt_client = MQTTClient( 'gmqtt' #self.mqtt_settings["MQTT_CLIENT_ID"] ) self.mqtt_client.on_connect = self._on_connect self.mqtt_client.on_message = self._on_message self.mqtt_client.on_disconnect = self._on_disconnect if self.mqtt_settings["MQTT_USERNAME"]: self.mqtt_client.set_auth_credentials( self.mqtt_settings["MQTT_USERNAME"], self.mqtt_settings["MQTT_PASSWORD"], ) def start(): try: logger.warning('Connecting to MQTT') asyncio.set_event_loop(self.event_loop) # self.event_loop.run_until_complete( # self.mqtt_client.connect(self.mqtt_settings["MQTT_BROKER"], self.mqtt_settings["MQTT_PORT"],keepalive=self.mqtt_settings["MQTT_KEEPALIVE"], version=MQTTv311) # ) logger.warning('Looping forever') self.event_loop.run_forever() logger.warning('Event loop stopped') #self.session.close() except Exception as e: logger.error('Error in event loop {}'.format(e)) self.event_loop = asyncio.new_event_loop() logger.warning("Starting MQTT thread") self._ws_thread = threading.Thread(target=start, args=()) self._ws_thread.daemon = True self._ws_thread.start() future = asyncio.run_coroutine_threadsafe( self.mqtt_client.connect( self.mqtt_settings["MQTT_BROKER"], self.mqtt_settings["MQTT_PORT"], keepalive=self.mqtt_settings["MQTT_KEEPALIVE"], version=MQTTv311), self.event_loop)
def publish(self, topic, payload, retain=True, qos=0): MQTT_Base.publish(self, topic, payload, retain, qos) self.mqtt_client.publish(topic, payload, retain=retain, qos=qos)
def publish(self, topic, payload, retain=True, qos=0): if isinstance(payload, bool): # boolean types must be sent as "true" or "false" payload = str(payload).lower() MQTT_Base.publish(self, topic, payload, retain, qos) self.mqtt_client.publish(topic, payload, retain=retain, qos=qos)
def __init__(self, mqtt_settings, last_will): MQTT_Base.__init__(self, mqtt_settings, last_will) self.mqtt_client = None
def close(self): MQTT_Base.close(self) self.event_loop.stop()
def connect(self): MQTT_Base.connect(self) self.mqtt_transport = "tcp" if "MQTT_TRANSPORT" in self.mqtt_settings: if (self.mqtt_settings["MQTT_TRANSPORT"] in ["tcp", "websockets"]): self.mqtt_transport = self.mqtt_settings["MQTT_TRANSPORT"] else: logger.warning( "MQTT transport {} not supported, falling back to TCP". format(self.mqtt_settings["MQTT_TRANSPORT"])) # If Websocket path is set, assume websockets transport if "MQTT_WS_PATH" in self.mqtt_settings: self.mqtt_transport = "websockets" self.mqtt_client = mqtt_client.Client( client_id=self.mqtt_settings["MQTT_CLIENT_ID"], transport=self.mqtt_transport #clean_session=0 ) self.mqtt_client.on_connect = self._on_connect self.mqtt_client.on_message = self._on_message # self.mqtt_client.on_publish = self._on_publish self.mqtt_client.on_disconnect = self._on_disconnect #self.mqtt_client.enable_logger(mqtt_logger) #self.mqtt_client.enable_logger() self.set_will(self.last_will, "lost", True, 1) if "MQTT_WS_PATH" in self.mqtt_settings: self.mqtt_client.ws_set_options( path=self.mqtt_settings["MQTT_WS_PATH"]) if self.mqtt_settings["MQTT_USERNAME"]: self.mqtt_client.username_pw_set( self.mqtt_settings["MQTT_USERNAME"], password=self.mqtt_settings["MQTT_PASSWORD"], ) if self.mqtt_settings["MQTT_USE_TLS"]: self.mqtt_client.tls_set() try: self.mqtt_client.connect( self.mqtt_settings["MQTT_BROKER"], port=self.mqtt_settings["MQTT_PORT"], keepalive=self.mqtt_settings["MQTT_KEEPALIVE"], ) self.mqtt_client.loop_start() except Exception as e: logger.warning("MQTT Unable to connect to Broker {}".format(e)) def start(): try: asyncio.set_event_loop(self.event_loop) logger.info('Starting Asyincio looping forever') self.event_loop.run_forever() logger.warning('Event loop stopped') except Exception as e: logger.error('Error in event loop {}'.format(e)) self.event_loop = asyncio.new_event_loop() logger.info("Starting MQTT publish thread") self._ws_thread = threading.Thread(target=start, args=()) self._ws_thread.daemon = True self._ws_thread.start()
def _on_message(self, client, userdata, msg): topic = msg.topic payload = msg.payload.decode("utf-8") MQTT_Base._on_message(self, topic, payload, msg.retain, msg.qos)
def set_will(self, will, topic, retain, qos): MQTT_Base.set_will(self, will, topic, retain, qos) self.mqtt_client.will_set(will, topic, retain, qos)
def unsubscribe(self, topic): # subclass to provide MQTT_Base.unsubscribe(self, topic) self.mqtt_client.unsubscribe(topic)
def subscribe(self, topic, qos): # subclass to provide MQTT_Base.subscribe(self, topic, qos) self.mqtt_client.subscribe(topic, qos)
def set_will(self, will, topic, retain, qos): MQTT_Base.set_will(self, will, topic, retain, qos)
def __init__(self, mqtt_settings): MQTT_Base.__init__(self, mqtt_settings) self.mqtt_client = None
def _on_disconnect(self, client, packet, exc=None): self.mqtt_connected = False # note, change this uses the property setter, do not really need to catch this in the base class logger.warning("MQTT Disconnection {} {} {}".format( client, packet, exc)) MQTT_Base._on_disconnect(self, 0)
def _on_message(self, client, topic, payload, qos, properties): #topic = msg.topic #payload = msg.payload.decode("utf-8") MQTT_Base._on_message(self, topic, payload, False, qos)