mqtt paho网络循环不必要?
问题描述:
我见过很多paho客户端读取传感器数据然后发布的例子,例如https://github.com/jamesmoulding/motion-sensor/blob/master/open.py。我见过的都没有启动网络循环,如https://eclipse.org/paho/clients/python/docs/#network-loop中所建议的。我想知道如果网络循环是不必要的发布?也许只有当我订阅某些东西时才需要?mqtt paho网络循环不必要?
答
需要对一些事物的网络环路:
- 为了应对收到的消息
- 要发送永葆
- 要处理需要额外的数据包连接所需的Ping报文高QOS
- 发送该占用多于一个的网络分组(比本地MTU大例如)消息
只有在消息速率较低(每个存活期间少于1 msg)时才需要ping消息。
鉴于你可以在一个单独的线程在后台启动网络环路这些日子里,我会建议无论
答
启动它为了扩大在什么@hardillb说了一下,他的观点2“送平安只有当您发布的速率不足以与您在连接时设置的Keepalive相匹配时,才需要保持连接处于活动状态所需的数据包“。换句话说,客户完全有可能永远不需要发送PINGREQ,因此永远不需要接收PINGRESP。
但是,更重要的一点是,不可能保证调用publish()
将实际完成发送消息而不使用网络循环。它可能在某些时候有效,但可能无法在任何时候完成发送消息。
客户端的下一个版本将允许你这样做:
m = mqttc.publish("class", "bar", qos=2)
m.wait_for_publish()
但这将要求,网络环路是在一个单独的线程进行处理,与loop_start()
。
我将继续按照建议使用网络回路。但是请注意,有很多浮动在网上的例子(在教程等中)不使用它。也许还没有让足够多的人受到伤害。不知道是否默认应该启动它,并强制人们手动关闭它。现在是什么颠倒了。 – fickas
是的,很多人没有阅读文档:(我不打算通过改变行为来打破向后兼容性,对于不处理循环的人来说,它只会是一个恼人的偶然错误。 – ralight