当前位置: 首页 > 知识库问答 >
问题:

使用Mosquitto/PAHO for Python无法接收超过20条MQTT消息

江志业
2023-03-14

我正在使用Mosquitto(现在是Paho)python MQTT客户机连接到HiveMQ代理。代码是非常基本的,摘自他们的文档--https://pypi.python.org/pypi/paho-MQTT

#SUBSCRIBER
import paho.mqtt.client as mqtt

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc):
    client.subscribe("GB/node0/", 2) 

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print "Topic: ", msg.topic+'\nMessage: '+str(msg.payload)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("192.168.15.4", 1883, 60)

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
client.loop_forever()
#PUBLISHER
import paho.mqtt.client as mqtt    
mqttc = mqtt.Client("python_pub")
mqttc.connect("192.168.15.4", 1883, 60)   
mqttc.publish("GB/node0/", "Hello, World baby!",2) 

这里的QoS也是2。

QoS的这种修改导致订户只接收到20条消息。经过进一步探讨,我意识到问题可能是由于max_inflight_messages_set(),这是一个选项函数,它设置了QoS>0的消息的最大数量,这些消息可以同时通过网络流的一部分。默认值是20。

但是,将其更改为任何其他值都不起作用。此外,为什么客户认为这些消息在收到后仍在飞行中?我如何解决这个问题?我如何确保客户明白这些消息不是“飞行中”的,并且已经交付了?

共有1个答案

郭皓
2023-03-14

尝试在发布服务器中的mqttc.publish()之后调用mqttc.loop(2,10),以便发布服务器能够处理来自代理的关于它已经收到发布的QOS2确认。

2秒超时和10个数据包可能比需要的多,但它应该可以工作

 类似资料:
  • 我试图让一些基于PAHO的客户机使用Vert.x MQTT服务器。我试图发布到我的接收客户端订阅的测试主题。我很难从客户端发布者向客户端订阅者发送消息。 使用我在Internet上看到的真实例子,我构建了一个MQTT代理。vert.x MQTT代理代码的代码如下所示: 我很确定我在这里错过了什么,但我想不出会是什么。有人能帮我把这个弄好吗??? 提前感谢您的任何帮助或见解。

  • mosquitto.conf将最大飞行消息设置为0,持久性为true。 发布服务器QOS=2 用户QOS=2 保持活力=60 还有其他参数我应该看吗?

  • 我的Mosquitto实例没有设置身份验证或密码。我尝试在Mosquitto日志中打开调试消息,但它们没有显示任何有用的信息。我不知所措。为什么我无法从C++Paho代码连接到Mosquitto? 编辑:这是客户端代码...同样,这对Adafruit很有效,但是当我把它指向我在localhost的蚊子时,它会像描述的那样挂起。(我省略了用户名和密码--我正在发送它们,但我真的不认为这些是问题所在,

  • null 有人帮忙吗? 谢谢,拉胡尔

  • 我目前正在使用python处理一个MQTT客户机,现在我可以创建发布和订阅Mosquitto代理的客户机。 如果实际需要,我很乐意为客户机提供代码。 稍后编辑:也许值得一提的是 如果在一个主题上有更多的订阅者,这种行为是不可观察的,代理发送数据包而不会在任何时候停止。

  • null 但是,我发现代理在重新连接时不会向客户机发送任何东西。 这就是我如何测试的:使用上面提到的四个参数将客户机连接到代理。用QOS=1订阅感兴趣的主题断开客户端 使用另一个客户端程序和另一个客户端id,连接到代理将消息发布到由现在脱机的客户端订阅的同一主题。请等待几秒钟,现在使用与以前相同的连接设置重新连接脱机客户端。