5

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

但是,将其更改为任何其他值都不起作用。另外,为什么客户认为这些消息在收到时仍然在进行中?我该如何解决问题?我如何确保客户理解这些消息不是“飞行中”并且已经传递?

4

2 回答 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")
于 2014-09-12T21:02:55.090 回答
4

尝试在发布者mqttc.loop(2,10)之后调用,mqttc.publish()以便发布者可以处理来自代理的 QOS2 确认,即它已收到发布。

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

于 2014-09-12T20:44:18.820 回答