3

我每分钟在以下 URL 上执行一次 GET,以获取我的 IOT 注册表中所有设备的设备状态

GET https://cloudiot.googleapis.com/v1/{name=projects/*/locations/*/registries/*/devices/*}

获得Device后,我有兴趣确定以下字段是否在当前时间戳的最后一分钟内:

  "lastHeartbeatTime": string
  "lastStateTime": string
  "lastEventTime": string

我的设备经常 ping 远程代理,MQTT Keep Alive 时间为 10 秒,所以我假设一分钟内最多有 6 次心跳。

这个想法是我想收集每个设备的可用性和正常运行时间指标以及警报的统计信息。

所有这些都有效,但我怀疑 Google 后端没有足够频繁地更新心跳、事件和状态时间戳,有时会导致上述设置记录我的设备未启动的统计信息,而实际上它们是。

我的问题是:

  • 我的设备心跳时间在设备状态下的更新速度有多快?一分钟太短了吗?

  • 您会推荐一种更好的方法来实现上述目标吗?这意味着什么?

4

2 回答 2

1

仔细查看设备的 API 文档,状态似乎“过时了几分钟”。有什么暗示这个最大值可以是什么?:

lastHeartbeatTime 字符串(时间戳格式)

上次收到 MQTT PINGREQ 的时间。该字段仅适用于通过 MQTT 连接的设备。MQTT 客户端通常只在连接空闲时才发送 PINGREQ 消息,并且没有发送其他消息。定期收集时间戳并写入存储;它们可能会过时几分钟

RFC3339 UTC“Zulu”格式的时间戳,精确到纳秒。示例:“2014-10-02T15:01:23.045123456Z”。

lastEventTime 字符串(时间戳格式)

上次收到遥测事件的时间。定期收集时间戳并写入存储;它们可能会过时 几分钟

RFC3339 UTC“Zulu”格式的时间戳,精确到纳秒。示例:“2014-10-02T15:01:23.045123456Z”。

lastStateTime 字符串(时间戳格式)

最后一次收到状态事件。定期收集时间戳并写入存储;它们可能会过时 几分钟

RFC3339 UTC“Zulu”格式的时间戳,精确到纳秒。示例:“2014-10-02T15:01:23.045123456Z”。

于 2018-05-23T20:30:38.783 回答
1

“lastHeartbeatTime”是最后一次接收到 PINGREQ 的时间,如果连接空闲并且没有发送其他消息,则接收它。PINGREQ 是您的 MQTT Keep Alive 时间为 10 秒。因此,如果 10 秒内没有消息,您应该得到一个 PINGREQ。此信息应在设备日志中可用。我建议将设备日志发送到 stacdriver 并使用日志来获取设备统计信息以了解可用性和正常运行时间。是一个如何做到这一点的例子。

于 2018-07-19T22:07:43.240 回答