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 に答える