【问题标题】:Mqtt check if subscribed topic has stopped publishing messagesMqtt 检查订阅的主题是否已停止发布消息
【发布时间】:2020-06-30 14:48:39
【问题描述】:

我正在尝试实现一种方法来了解特定设备何时停止向 mqtt 代理发布消息,并在这种情况下向我自己发送电子邮件。我想这样做是为了能够知道发布消息的设备是否存在问题,以便我可以检查它并重新打开它。为了尝试实现这一点,我创建了一个订阅设备发布的主题的 mqtt 客户端,例如test/device_1,然后设置为最后的遗嘱和遗嘱,我将其设置为有效负载 =“离线”的设备状态/设备_1。理想情况下,我希望能够为超过 1 台设备执行此操作,但假设我只希望在一台设备的简单情况下使用它。

我创建了另一个脚本,该脚本实现了另一个订阅主题 status/device_1 的客户端,然后在 on_message 函数上检查它是否获得了有效载荷 =“离线”,如果确实获得了它,那么我给自己发送一封电子邮件.

但是这种方法不起作用,因为当我关闭设备时,订阅主题 test/device_1 的 mqtt 客户端继续侦听但没有收到任何消息。换句话说,即使主题为空,它也不会发送最后的遗嘱。但是,当我停止订阅主题 test/device_1 的脚本时,它似乎可以工作。

我是否遗漏了什么或者无法完成我想要做的事情?任何建议表示赞赏!

【问题讨论】:

    标签: python mqtt mosquitto paho


    【解决方案1】:

    第一个 LWT 消息仅在客户端意外下线时由代理发布,这意味着如果它完全关闭则不会发布,您必须手动发布消息作为关闭过程的一部分。

    您可以在 LWT 上设置保留标志,以便在设备离线后订阅的任何客户端仍然可以看到状态消息。

    您还应该在设备启动时清除该消息,方法是发布Online 或null 有效负载以清除保留的消息。

    【讨论】:

    • 如何在关闭过程中手动发布消息?如何识别关闭进程?
    • 这取决于你如何结束你的脚本,但假设你使用的是 ctrl-c 那么你需要添加一个信号处理程序。
    • 关闭脚本后问题不存在。该脚本应该永远运行。当我关闭设备时存在问题。脚本实现的客户端一直在监听,但收到的消息为零。这就是我想捕捉并通过电子邮件通知的情况。
    • 如果您只是关闭设备电源(没有正常关机),那么 LWT 将在 1.5 * 保活时间触发
    • 感谢您的建议。所以我试着用这种方式来做。我设置了 keepalive period=10,当我每 10 秒关闭一次设备时,客户端发送 PINGREQ 并接收 PINGRESP。因此,LWT 永远不会触发。即使我关闭设备,它如何接收 PINGRESP。此外,我尝试修改客户端代码以抑制 PINGREQ 和 PINGRESP,然后我遇到另一个问题,因为客户端每 10 秒重新连接一次,然后再次断开连接。因此,LWT 每 15 秒发送一次。有什么办法可以解决这个问题吗?
    【解决方案2】:

    当设备将消息发布为心跳时,您可以使用last timestamp,并且在您的另一个脚本中使用(current_time - last_timestamp) > 30,那么您可以通过电子邮件向自己发送您的设备处于离线状态。这样,当您想离线获取设备的电子邮件时,您可以获得时间阈值。

    脚本 1:

    mqttCient.on_message(msg):
        last_timestamp = time.time()
    

    脚本 2:

    cur_time = time.time()
    if ((cur_time - last_timestamp) > 30):
        # email yourself 
    

    使用Json文件或数据库作为缓冲区来存储和访问last_timestamp

    【讨论】:

    • 我在想类似的事情,但我怎么能在 30 秒后只给自己发一次电子邮件,如果设备上线然后又下线,那么我能再次给自己发电子邮件吗?
    • 我认为您每次设备离线超过 30 秒时都会收到电子邮件,如果设备离线,您会收到电子邮件,如果设备在 30 秒内再次在线,您将不会获取电子邮件(假设这不是问题)。如果您每次都希望设备离线和在线时发送邮件。您可以将threshold 减少到 5 秒。它将确保您在设备离线时大部分时间都能收到邮件
    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2020-11-24
    • 2020-06-23
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多