AWS IoT物联网状态不可靠

时间:2019-07-02 17:05:02

标签: amazon-web-services aws-iot

我需要确保IoT设备的状态可靠。

现在,我已将Lambda连接到IoT上的SELECT * FROM '$aws/events/presence/#'事件。

但是在连接的设备在大约40秒内断开连接并重新连接时,我无法获得可靠的设备状态。此方案的结果-事件的顺序为:  1.已连接-设备再次连接后不久  2.断开连接-大约40秒后。

在重新连接设备并在任何情况下连接超时后都不会发出消息disconnected

我找到了一种解决方法-从AWS_Things物联网索引中请求设备连接。实际上,我也收到以前的连接状态,但是它具有时间戳字段。然后,我只是将当前event.timestamp与来自索引的时间戳进行比较,如果该时间戳高于30秒-我会静静地丢弃disconnected事件。但是这种方法并不可靠,因为在更快地切换设备时(间隔5秒),我仍然会出现错误的行为。对于我的项目,这是不可接受的。

是否可以使用IoT事件解决我的问题?我不想参加设备索引轮询。

2 个答案:

答案 0 :(得分:2)

您还可以使用 sqs 延迟队列并在 5 秒后检查断开连接是否为真。这比使用阶跃函数便宜得多。这也是官方的解决方案。

答案 1 :(得分:0)

好吧,此刻我只使用StepFunction,它连接到SELECT * FROM '$aws/events/presence/#'事件,该事件在延迟10秒后检查实际的事物状态:

step function diagram

{
  "StartAt": "ChoiceEvent",
  "States": {
    "ChoiceEvent": {
      "Type": "Choice",
      "Choices": [
          {
            "Variable": "$.eventType",
            "StringEquals": "disconnected",
            "Next": "WaitDelay"
          }
      ],
      "Default": "CheckStatus"
    },
    "WaitDelay": {
      "Type": "Wait",
      "Seconds": 30,
      "Next": "CheckStatus"
    },
    "CheckStatus": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:xxxxxxx:function:connectivity-check",
      "End": true
    }
  }
}

当eventType为connectivity-check时,disconnected lambda只会检查IoT注册表中的实际事物状态