1

paho-mqtt を使用して、キューに入れられたメッセージを受信しようとしています。私が使用しているブローカーは emqx 4.2.2 で、これが私のスクリプトです:

from paho.mqtt.client import Client, MQTTv5


def on_connect(mqttc, obj, flags, rc, other):
    print("    Session present: " + str(flags['session present']))
    print("    Connection result: " + str(rc))
    mqttc.subscribe([
        ('/message/1', 1)
    ])


def on_message(*args, **kwargs):
    print("received a message")


client = Client(
    client_id='test-client-id',
    protocol=MQTTv5,
)


client.username_pw_set(
    username="test-user-2",
    password="test"
)

client.on_connect = on_connect
client.on_message = on_message

client.connect(
    host='localhost',
    port=1883,
    keepalive=60,
    clean_start=False,
)

client.loop_forever()

次に、ブローカーにメッセージを発行します。

mosquitto_pub -u test-user-2 -P test -t '/message/1' -m 'this is a message' -q 1 -V mqttv5

クライアントがブローカーに接続されている間、メッセージを受信しますが、私が QoS 1 でサブスクライブしていて、メッセージが QoS 1 で発行されていることを考えると、クライアントをブローカーから切断すると、さらに QoS を発行することを期待しています。 1 つのメッセージをそのトピックに送信し、同じ固定 client_id を使用してクライアントをブローカーに再接続すると、クライアントは、クライアントが離れている間にキューに入れられたメッセージを受信します。それは起こらず、mosquitto_sub で -c フラグを指定して同じ機能をシミュレートすると、すべてが期待どおりに機能します。私は何か間違ったことをしていますか?

4

3 に答える 3

0

QOS は、クライアントが SUBSCRIBE されている場合にのみ機能します...購読される前にメッセージを受信したい場合は、Retain フラグを設定してメッセージを PUBLISH する必要があります...その後、最後に送信されたメッセージのみを取得します。本当に複数のメッセージを取得する必要がある場合は、MQTT ではなく AMQ などを使用する必要があります。

于 2020-12-18T04:56:38.790 に答える
0

そうではclean_sessionなく、関数ではなくコンストラクターclean_startに渡す必要があります。Clientconnect()

...
client = Client(
    client_id='test-client-id',
    protocol=MQTTv5,
    clean_session=False
)


client.username_pw_set(
    username="test-user-2",
    password="test"
)

client.on_connect = on_connect
client.on_message = on_message

client.connect(
    host='localhost',
    port=1883,
    keepalive=60
)
...
于 2020-12-18T14:18:16.073 に答える