【问题标题】:Python MQTT callbacks in OOPOOP 中的 Python MQTT 回调
【发布时间】:2019-03-26 16:29:21
【问题描述】:

我目前正在尝试在面向对象的上下文中使用 Python3 中的 paho mqtt 库。 但是,由于某种原因,回调函数没有被调用。

import paho.mqtt.client as mqtt
import time
import logging

logger = logging.getLogger("IDS_LOGGER.refining")
logging.basicConfig(level=logging.INFO)

class refiner(object):


def __init__(self,configpath="./sampleconfig.xml"):
    try:
        self.CONFIGPATH = configpath
        self.BROKER_IP = "localhost"

        self.parse_config()
        self.client = mqtt.Client()
        self.client.on_connect = self.on_connect
        self.client.on_message = self.on_message
        self.client.connect(self.BROKER_IP)
        logging.info("Connected to {0}, starting MQTT loop".format(self.BROKER_IP))
        self.client.loop_forever()
    except Exception as e:
        print("error")


def on_message(self,client,userdata,msg):
    """MQTT Callback function for handling received messages"""
    print("message received!")


def on_connect(self,client,userdata,msg):
    print("connected!")
    self.client.subscribe("TRACED")

为什么?

【问题讨论】:

    标签: python python-3.x oop mqtt


    【解决方案1】:

    将您的 on_connect() 定义替换为:

    def on_connect(self, client, userdata, flags, rc):
            print("connected!")
            self.client.subscribe("TRACED")
    

    同样出于调试目的,考虑在异常处理程序中打印实际的异常,而不是仅仅打印"error"

        try:
            ...
        except Exception as e:
            print(e)
    

    通过上述修复,我通过连接到test.mosquitto.org 测试了您的代码:

    class refiner(object):
    
        def __init__(self):
            try:
                self.BROKER_IP = "test.mosquitto.org"
                self.client = mqtt.Client()
                self.client.on_connect = self.on_connect
                self.client.connect(self.BROKER_IP, 1883, 60)
                logging.info("Connected to {0}, starting MQTT loop".format(self.BROKER_IP))
                self.client.loop_forever()
            except Exception as e:
                print(e)
    
        def on_connect(self, client, userdata, flags, rc):
            print("connected!")
            self.client.subscribe("TRACED")
    
    x = refiner()
    

    并成功输出:

    INFO:root:Connected to test.mosquitto.org, starting MQTT loop
    connected!
    

    【讨论】:

      【解决方案2】:

      我正在阅读罚款Docs。 他们说你应该:

      def on_connect(client, userdata, flags, rc):
      ....
      client = mqtt.Client()
      client.on_connect = on_connect
      

      Bbuuuttt,你没有那样做。 在 OO 类中,您有:

          def on_connect(self, client, userdata, msg):
      

      嗯。最初我认为添加self 是问题所在,您的方法期望在回调时比 paho 提供的参数多一个。 但是将它们都写出来后,现在我看到您将flags, rc 变成了msg,原因我无法理解。 我在想,在幕后的某个地方 paho 可能正在记录 takes 5 positional arguments but 4 were given python 错误,但现在还不清楚发生了什么。

      在任何情况下,您都可以处理这个细节并通过这段代码来解决问题:

      def on_connect(*args, **kwargs:
          with open('/tmp/log', 'a') as fout:
              fout.write('connected!\n')
      

      我避开了print(),以防sys.stdout 不再连接到您的shell 终端。

      考虑在 DEBUG 级别使用 enable_logger,甚至可能使用 on_log 回调。

      【讨论】:

      • “因为我无法理解的原因”。复制粘贴受害者,绝对是
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多