2014-09-12 89 views
3

我正在使用Mosquitto(現在的Paho)python MQTT客戶端連接到HiveMQ代理。該代碼是非常基本的,因爲從這裏開始他們的資料爲準 - https://pypi.python.org/pypi/paho-mqtt無法使用Mosquitto/Paho for Python收到超過20條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(通知),服務質量是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

嘗試在發行商mqttc.publish()之後撥打mqttc.loop(2,10),以便發佈商可以處理來自已收到發佈的代理的QOS2確認。

2秒超時和10個數據包可能比需要的多,但它應該工作

+0

'的max_packets說法已經過時,應保持unset.' https://pypi.python.org/pypi/paho- MQTT/1.3.0#網絡環 – northtree 2017-07-12 07:06:56

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")