Mqtt检查订阅的主题是否已停止发布消息

时间:2020-06-30 14:48:39

标签: python mqtt mosquitto paho

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

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

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

我错过了什么吗?还是无法完成我想做的事情?任何建议表示赞赏!

2 个答案:

答案 0 :(得分:2)

当设备将消息发布为心跳时,您可以使用last timestamp;在另一个脚本中,可以使用(current_time - last_timestamp) > 30,如果您使用mqttCient.on_message(msg): last_timestamp = time.time() ,则可以通过电子邮件向您发送电子邮件,告知您设备已离线。这样,您就可以设置时间阈值,以使设备的电子邮件离线。

脚本1:

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

脚本2:

Json

使用last_timestamp 文件或数据库作为缓冲区来存储和访问 pool: alm-aws-pool resources: repositories: - repository: AzurePipelines name: ALM/AzurePipelines type: git ref: master #branch name steps: - template: TG1_build&Nuget.yml@AzurePipelines parameters: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' IsNugetPrerelaseVersion: true

答案 1 :(得分:2)

仅当客户端意外脱机时,代理才会发布第一条LWT消息,这意味着,如果客户端完全关闭,则它将无法发布,您必须在关闭过程中手动发布消息。

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

您还应该在设备启动时清除该消息,方法是发布Onlinenull有效负载之类的内容以清除保留的消息。