Esempio n. 1
0
    def thread_mqtt_listener(self):
        """
        Description :
            MQTT Thread launching the loop and subscripbing to the right topics
        """
        mqtt_default_qos = 2
        self.mqtt_topics = [
            (topic, mqtt_default_qos)
            for topic in self.configuration['mqtt']['subscribedTopics']
        ]

        def on_connect(client, userdata, flags, rc):
            log.info(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                     msg=f'Connected to MQTT broker. Result code {str(rc)}')
            mqtt_connect_result, self.mqtt_connect_mid = client.subscribe(
                self.mqtt_topics)
            if mqtt_connect_result == mqtt.MQTT_ERR_SUCCESS:
                log.warning(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                            msg=f'Successfully subscribed to '
                            f'topics in input config file')
                log.debug(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                          msg=f'Topics subcribed = {self.mqtt_topics}')
            else:
                log.error(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                          'MQTT Broker subscription problem.')

        def on_message(client, userdata, message):
            """ callback function used for the mqtt client (called when
            a new message is publisehd to one of the queues we subscribe to)
            """
            log.info(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                     msg=f'Received MID {message.mid} : '
                     f'"{str(message.payload)}" '
                     f'on topic {message.topic} with QoS {message.qos}')
            self.mqtt_message_queue.put_nowait(message)

        def on_disconnect(client, userdata, rc=0):
            """callback for handling disconnects
            """
            log.warning(
                ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                f'Disconnected MQTT result code = {rc}. '
                f'Should automatically re-connect to broker')

        def on_subscribe(client, userdata, mid, granted_qos):
            if mid == self.mqtt_connect_mid:
                log.debug(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                          msg=f'Subscribed to topics. Granted '
                          f'QOS = {granted_qos}')
            else:
                log.error(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                          msg=f'Strange... MID does not match '
                          f'self.mqtt_connect_mid')

        try:
            self.mqttClient = mqtt.Client(
                client_id=self.configuration["mqtt"]["clientID"],
                clean_session=True,
                transport=self.configuration["mqtt"]["brokerProto"])
            self.mqttClient.enable_logger(logger=RoboLogger.getSpecificLogger(
                ct.LOG_TASKMAN_THREAD_MQTT_LISTENER))
            self.mqttClient.on_subscribe = on_subscribe
            self.mqttClient.on_connect = on_connect
            self.mqttClient.on_disconnect = on_disconnect
            self.mqttClient.on_message = on_message
            self.mqttClient.connect(
                host=self.configuration["mqtt"]["brokerIP"],
                port=self.configuration["mqtt"]["brokerPort"])
            self.mqttClient.loop_forever()
        except Exception:
            log.error(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                      f'Error : {traceback.print_exc()}')
        finally:
            log.warning(ct.LOG_TASKMAN_THREAD_MQTT_LISTENER,
                        msg=f'Exiting MQTT connection thread.')
Esempio n. 2
0
    def threadImplMQTT(self):
        """
        MQTT Thread launching the loop and subscripbing to the right topics
        """
        mqtt_default_qos = 2
        self.mqtt_topics = [
            (topic, mqtt_default_qos) for topic in
            self.robotConfiguration["mqtt"]["subscribedTopics"]]

        def on_connect(client, userdata, flags, rc):
            log.warning(LOGGER_DDR_THREADIMPLMQTT,
                        msg=f'Connected to MQTT broker. '
                            f'Result code {rc}')
            mqtt_connect_result, self.mqtt_connect_mid = \
                client.subscribe(self.mqtt_topics)
            if mqtt_connect_result == mqtt.MQTT_ERR_SUCCESS:
                log.warning(LOGGER_DDR_THREADIMPLMQTT,
                            msg=f'Successfully subscribed '
                                f'to {self.mqtt_topics}')
            else:
                log.error(LOGGER_DDR_THREADIMPLMQTT,
                          msg=f'MQTT Broker subscription problem.')

        def on_message(client, userdata, message):
            """ callback function used for the mqtt client (called when
            a new message is publisehd to one of the queues we subscribe to)
            """
            log.info(LOGGER_DDR_THREADIMPLMQTT,
                     msg=f'Received MID {message.mid} : '
                         f'{str(message.payload)} on topic '
                         f'{message.topic} with QoS {message.qos}')
            self.mqttMoveQueue.put_nowait(message)

        def on_disconnect(client, userdata, rc=0):
            """callback for handling disconnects
            """
            log.info(LOGGER_DDR_THREADIMPLMQTT,
                     msg=f'Disconnected MQTT result code = {rc}.'
                         f'Should automatically re-connect to broker')

        def on_subscribe(client, userdata, mid, granted_qos):
            if mid == self.mqtt_connect_mid:
                log.warning(LOGGER_DDR_THREADIMPLMQTT,
                            msg=f'Subscribed to topics. Granted QOS '
                                f'= {granted_qos}')
            else:
                log.error(LOGGER_DDR_THREADIMPLMQTT,
                          msg=f'Strange... MID doesn\'t match '
                              f'self.mqtt_connect_mid')

        self.mqttClient = mqtt.Client(
            client_id="mybot",
            clean_session=True,
            transport=self.robotConfiguration["mqtt"]["brokerProto"])
        self.mqttClient.enable_logger(
            logger=RoboLogger.getSpecificLogger(LOGGER_DDR_THREADIMPLMQTT))
        self.mqttClient.on_subscribe = on_subscribe
        self.mqttClient.on_connect = on_connect
        self.mqttClient.on_disconnect = on_disconnect
        self.mqttClient.on_message = on_message
        self.mqttClient.connect(
            host=self.robotConfiguration["mqtt"]["brokerIP"],
            port=self.robotConfiguration["mqtt"]["brokerPort"])
        self.mqttClient.loop_start()