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



我是MQTT的新手,我想打印一个简单的数字范围。我创建了两个文件,其中第一个文件将数据发送到第二个文件,脚本如下:

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如果有人知道这方面的知识,请告诉我。。。。有任何与我的代码或任何事情有关的问题,请告诉我感谢

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

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

可以让代理为特定订阅者对消息进行排队,但这需要订阅者在消息发布之前已经连接,并且订阅的QOS大于0。然后,只要在发布后将clean session标志设置为false并且具有相同的客户端id的情况下重新连接,代理就会传递丢失的消息。

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

最新更新