首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MQTT循环函数的max_packets值

MQTT循环函数的max_packets值
EN

Stack Overflow用户
提问于 2016-03-19 23:53:27
回答 3查看 2.2K关注 0票数 0

但是,我的代码应该无限期地运行,但是它没有。它继续从客户端每隔几个小时停止运行一次(停止发布,循环继续运行,但是代理没有接收到任何消息),唯一能做的事情就是重新运行它。

我被建议这里增加循环函数的max_packets数量,但是它不起作用,客户端没有继续就停止了随机发布。应该做些什么?我尝试了1,3,5,50和1000的数值,但是没有用。

代码:

代码语言:javascript
复制
client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    data = getdata()
    client.publish("$ahmed/",data,0)
    client.loop(timeout=1.0, max_packets = 1) # what should be the parameters here so it doesn't stop publishing?
    time.sleep(0.2)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-20 03:53:08

除了已发布/订阅的应用程序消息外,MQTT还具有内部保持活力,以避免半开放TCP (1)问题。客户端有责任确保保存文件被发送。根据规范,代理将断开客户端的连接,客户端不会在保持活动时间间隔的一个半时间内(在没有其他消息的情况下)发送保活。

除了发送消息外,loop()*函数还维护代理和客户端之间的这种保持活力的通信流。

随机尝试:尝试使用loop_start()一次,而不是在while循环中调用loop()。例如。

代码语言:javascript
复制
client = mqtt.Client()
client.connect(address)
#runs a thread in background to call loop function internally. 
#In addition, this also reconnects to broker on a lost connection. 
client.loop_start()

while True:
    data = getdata()
    client.publish("$ahmed",data)
client.loop_stop()
票数 2
EN

Stack Overflow用户

发布于 2016-03-21 08:13:07

只是随机猜测..。客户断了吗?

在您的代码中,您没有处理任何回调,比如当客户机断开与代理的连接时调用的on_disconnect(client, userdata, rc)

代码语言:javascript
复制
def on_disconnect_handler(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection.")

client.on_disconnect = on_disconnect_handler

您也没有检查loop() 返回值

在成功时返回MQTT_ERR_SUCCESS。

代码语言:javascript
复制
     _Returns >0 on error._

你应该做这样的事

代码语言:javascript
复制
while True:
    rc = client.loop(timeout=1.0)
    if rc:
        # handle loop error here
票数 1
EN

Stack Overflow用户

发布于 2016-03-20 10:27:49

每次循环结束时,只要让客户端连接即可。我已经对它进行了测试,并且连接到代理不会在流中产生任何额外的延迟。因为我必须重新运行这个程序才能使它再次工作,所以我最好在循环中重新连接客户机,所以我不需要自己去做。这是我能想到的最起码的想法,似乎没有任何问题。

代码语言:javascript
复制
client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    client.connect(address, 1883, 60) # just let it reconnect every time it loops ;)! 
    data = getdata()
    client.publish("$ahmed/",data,0)
    client.loop(timeout=1.0, max_packets = 1) 
    time.sleep(0.2)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36108694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档