我正在尝试一种方法来知道何时特定设备停止向mqtt代理发布消息,在这种情况下,向我自己发送电子邮件。我想这样做是为了知道发布消息的设备是否存在问题,因此我可以检查并重新打开它。为此,我创建了一个mqtt客户端,该客户端订阅了设备发布的主题,例如测试/设备_1,然后设置为该设备状态/设备_1的最后遗嘱和遗嘱,我将其作为有效负载=“离线”放置。理想情况下,我希望能够在1台以上的设备上执行此操作,但让我们假设我只希望在1台设备的简单情况下执行此操作。
我创建了另一个脚本,该脚本实现了另一个订阅了主题status / device_1的客户端,然后在on_message函数上检查是否获得了有效载荷=“ Offline”,如果确实获得了,那么我向自己发送电子邮件
但是,这种方法不起作用,因为当我关闭设备时,订阅了test / device_1主题的mqtt客户端一直在监听,但没有收到任何消息。换句话说,即使主题为空,它也不会发送其最后的遗嘱。但是,当我停止订阅主题test / device_1的脚本时,它似乎起作用。
我错过了什么吗?还是无法完成我想做的事情?任何建议表示赞赏!
答案 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上设置保留标志,以便在设备脱机后进行预订的任何客户端仍然可以看到状态消息。
您还应该在设备启动时清除该消息,方法是发布Online
或null
有效负载之类的内容以清除保留的消息。