无法接收Python中的所有MQTT消息

无法接收Python中的所有MQTT消息,python,mqtt,Python,Mqtt,我正在尝试使用MQTT将消息从一个python脚本发送到另一个python脚本。一个脚本是发布者。第二个脚本是订阅服务器。我每0.1秒发送一次消息 出版商: client = mqtt.Client('DataReaderPub') client.connect('127.0.0.1', 1883, 60) print("MQTT parameters set.") # Read from all files count = 0 for i in range(1,51): payloa

我正在尝试使用MQTT将消息从一个python脚本发送到另一个python脚本。一个脚本是发布者。第二个脚本是订阅服务器。我每0.1秒发送一次消息

出版商:

client = mqtt.Client('DataReaderPub')
client.connect('127.0.0.1', 1883, 60)
print("MQTT parameters set.")

# Read from all files
count = 0
for i in range(1,51):
    payload = "Hello world" + str(count)
    client.publish(testtopic, payload, int(publisherqos))
    client.loop()
    count = count+1
    print(count, ' msg sent: ', payload)
    sleep(0.1)
订户:

subclient = mqtt.Client("DynamicDetectorSub")
subclient.on_message = on_message
subclient.connect('127.0.0.1')

subclient.subscribe(testtopic, int(subscriberqos))

subclient.loop_forever()
MOSQUITO代理版本-3.1

mosquitto.conf的max inflight messages设置为0,persistence true

发布服务器QOS=2

用户服务质量=2

两个脚本中的topic='test'

当我在同一脚本中运行subscriber和publisher时,消息将按预期发送和接收。但是,当它们在单独的脚本中时,我不会收到所有消息,有时甚至不会收到任何消息。我先运行订阅服务器,然后运行发布服务器。我已尝试使用loop.start()和loop.stop()订阅服务器,并等待了几分钟

我无法调试这个问题。任何指针都会很棒

编辑:

  • 我在发布后包含了client.loop()输出与以前相同
  • 当我在“on_connect”和“on_disconnect”中打印语句时,我注意到客户机mqtt连接几乎立即建立并断开连接。这种情况每秒钟都会发生。我甚至收到过一次这个消息-

    [WinError 10053]主机中的软件中止了已建立的连接

  • 保持活力=60


    是否还有其他参数需要查看?

    您还需要调用发布服务器中的网络循环函数,以便客户端实际有时间执行IO(以及QOS2的双握手)

    在客户端中调用
    client.publish()
    后添加
    client.loop()

    import paho.mqtt.client as mqtt
    import time
    
    client = mqtt.Client('DataReaderPub')
    client.connect('127.0.0.1', 1883, 60)
    print("MQTT parameters set.")
    
    # Read from all files
    count = 0
    for i in range(1,51):
        payload = "Hello world" + str(count)
        client.publish("test", payload, 2)
        client.loop()
        count = count+1
        print(count, ' msg sent: ', payload)
        time.sleep(0.1)
    
    用户代码:

    import paho.mqtt.client as mqtt
    
    def on_message(client, userdata, msg):
      print(msg.topic + " " + str(msg.payload))
    
    subclient = mqtt.Client("DynamicDetectorSub")
    subclient.on_message = on_message
    subclient.connect('127.0.0.1')
    
    subclient.subscribe("test", 2)
    
    subclient.loop_forever()
    

    当我运行您的代码时,订户经常丢失最后一个数据包。否则,我无法重现您描述的问题

    如果我像这样重写出版商

    from time import sleep
    import paho.mqtt.client as mqtt
    
    client = mqtt.Client('DataReaderPub')
    client.connect('127.0.0.1', 1883, 60)
    print("MQTT parameters set.")
    
    client.loop_start()
    
    # Read from all files
    count = 0
    for i in range(1,51):
        payload = "Hello world" + str(count)
        client.publish('test', payload, 2)
        count = count+1
        print(count, ' msg sent: ', payload)
        sleep(0.1)
    
    client.loop_stop()
    client.disconnect()
    

    …然后我再也看不到丢弃的数据包了。我在这里使用的是
    start\u loop
    /
    stop\u loop
    方法,它异步运行mqtt循环。我不确定是什么原因导致了您的数据包丢失,但我怀疑当代码退出时,最后一条消息仍在发布者的发送队列中。

    这是一个愚蠢的错误。 正如哈迪勒建议的那样,我查看了代理日志。它显示订户客户端已连接。
    很长一段时间后,我开始使用Pycharm。因此,我意外地多次运行publisher和subscriber,以至于它们在输出控制台中并行运行。难怪他们断开了连接,因为客户端ID是相同的。抱歉给你添麻烦了。BTW client.loop()在发布后是不需要的。谢谢hardillb。

    没有。那没用。是的,有用。编辑您的问题以包含发布者的完整代码和此更改我编辑了答案以显示我编写的测试的完整代码,以证明
    client.loop()
    是必需的。根据您的建议编辑代码。仍然不起作用。正如在上面的编辑中提到的,我得到一个错误,即主机系统中的软件中止了已建立的连接。我不知道那是什么意思。我不知道还有什么软件会干扰订阅服务器mqtt连接。请编辑此问题以包含发布服务器的完整代码。另外,如果您有来自代理的日志,那么您一次运行的发布服务器实例有多少?只有一个发布服务器和一个订阅服务器。