Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MQTT是如何工作的?如果在发送方文件之后启动接收方文件,则无法获取数据_Python_Mqtt_Publish Subscribe - Fatal编程技术网

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

Python MQTT是如何工作的?如果在发送方文件之后启动接收方文件,则无法获取数据,python,mqtt,publish-subscribe,Python,Mqtt,Publish Subscribe,我是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.disconnec

我是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是一种发布/订阅协议,而不是消息队列系统

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

可以让代理为特定订阅者排队消息,但这要求订阅者在消息发布之前已连接,并且已以大于0的QOS订阅。然后,只要它在发布后使用设置为false的clean session标志和相同的客户机id重新连接,那么代理将传递丢失的消息


保留的消息是不同的。如果发布消息时将保留标志设置为true,则代理将在每个订阅方订阅匹配主题时将此消息传递给每个订阅方。对于给定主题,只能保留一条消息

在邮件上设置retain标志,以保留最后一个发送到主题的邮件。和它的名字相反,MQTT并不排队,正如您从AMQP服务中可能知道的那样。谢谢你的回复,但是你能给我解释一下怎么做吗?实际上我不明白设置保留标志是什么意思?你已经在打印保留标志了,所以我希望你熟悉它。您只需在
publish()
@klauds上设置
retain=True
。thnx的,但我想得到所有的数据,不仅是最后一个,这是任何方式做它…现在它打印的99,这是最后的,但我想从开始到结束,请告诉我有可能吗?出版商的代码真的很讨厌。将客户端创建/连接和断开连接移动到loop.thnx之外以获取答案,但MQTT中是否有某种东西允许我在MQTT订阅服务器关闭时发布数据并将其存储在某处。一旦订阅服务器处于活动状态,它将从中获取数据。基本上,我希望使用MQTT,我不希望任何数据丢失,因此订阅者是否处于活动状态……请让我知道我们是否可以这样实现,任何帮助都将不胜感激…感谢这是我在第三段中所描述的。是的,我知道我已经用这种方式实现了,但在我的代码中,我尝试发送范围为1到100的数据,如果我使用retain=True,它只发送99,正如你所说的一样,但主要动机是打印所有数据,不仅是99或一个数据,请不要介意,但是我的问题从一开始就是一样的,我不想丢失任何一个数据,请告诉我,我仍然不清楚……谢谢,不是关于保留消息的段落,不是之前关于高QOS订阅的段落,也不是关于为先前连接的客户端设置代理队列的段落,该客户端当前处于脱机状态。