MQTT如何工作?如果在发送方文件之后启动接收方文件,则无法获取数据

问题描述 投票:1回答:1

大家好,我是MQTT的新手,我想打印一些简单的数字,我创建了2个文件,其中第一个文件将数据发送到第二个文件和脚本是这样的:

sender.py

import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("192.168.1.169", 1883, 60)
for i in range(1,100):
    client.publish("TestTopic", i)
    print(i)
client.disconnect()

receiver.py:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    client.subscribe("house/bulbs/bulb1")


def on_message(client, userdata, msg):
    # print(msg.topic+" "+str(msg.payload))
    print("message received ", str(msg.payload.decode("utf-8")))
    print("message topic=", msg.topic)
    print("message qos=", msg.qos)
    print("message retain flag=", msg.retain)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("192.168.1.169", 1883, 60)
client.loop_forever()

如果接收方文件处于活动状态,我就可以打印数据,但是如果我启动了发送方文件然后又启动了接收方文件,则在打印数据时出现问题,主要问题是MQTT是否遵循排队机制或不是如果是,则....如果我正在运行发送方文件,则其所有数据都应在队列中,然后在运行其他文件(即接收方)时,我应该被打印..但不是以同样的方式工作,请帮助我,我去了很多文件,但是我能够找到任何相关信息。.最近我发现clean_session如果有人对此有所了解,请告诉我....有任何相关问题我的代码或其他任何信息,请让我知道谢谢

python mqtt publish-subscribe
1个回答
1
投票

MQTT是发布/订阅协议,而不是消息排队系统。

这意味着在正常情况下,发布消息时,如果没有订阅者在运行,则不会传递该消息。

可以使代理对消息进行排队,但这要求订阅者在消息发布之前已连接,并且已订阅的QOS大于0。然后,只要它与干净会话标志重新连接即可。设置为false并在发布后使​​用相同的客户端ID,则代理将传递丢失的消息。

保留的消息有所不同。如果发布了一条消息,且保留标志设置为true,那么代理将在每个订阅者订阅匹配主题时将此消息传递给每个订阅者。给定主题只能保留1条消息。

© www.soinside.com 2019 - 2024. All rights reserved.