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

5 投票
2 回答
6555 浏览
提问于 2025-04-21 09:28

我正在使用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()

在client.subscribe()中,你会注意到QoS设置为2。这是对官方文档代码的唯一修改。

发布客户端的代码是-

#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。

不过,把这个值改成其他数字也没有用。而且,为什么客户端会认为这些消息还在传输中,明明已经收到了呢?我该如何解决这个问题?怎样才能让客户端明白这些消息不是“在传输中”,而是已经送达了呢?

2 个回答

4

@hardillb说得对,你需要某种形式的loop*()调用。为了更确定,可以这样做:

import paho.mqtt.client as mqtt

def on_publish(client, userdata, mid):
    client.disconnect()

mqttc = mqtt.Client() # There's normally no need to set a client id.
mqttc.on_publish = on_publish
mqttc.connect("192.168.15.4", 1883, 60)
mqttc.publish("GB/node0/", "Hello, World baby!",2)
mqttc.loop_forever()

或者:

import paho.mqtt.publish as paho
paho.single("GB/node0/", "Hello, World baby!", qos=2, hostname="192.168.15.4")
4

试着在发布者的 mqttc.publish() 之后调用 mqttc.loop(2,10),这样发布者就可以处理来自代理的 QOS2 确认,确认它已经收到了发布的信息。

这里的 2 秒超时和 10 个数据包可能比实际需要的多,但这样做应该是没问题的。

撰写回答