我需要确保IoT设备的状态可靠。
现在,我已将Lambda连接到IoT上的SELECT * FROM '$aws/events/presence/#'
事件。
但是在连接的设备在大约40秒内断开连接并重新连接时,我无法获得可靠的设备状态。此方案的结果-事件的顺序为: 1.已连接-设备再次连接后不久 2.断开连接-大约40秒后。
在重新连接设备并在任何情况下连接超时后都不会发出消息disconnected
。
我找到了一种解决方法-从AWS_Things
物联网索引中请求设备连接。实际上,我也收到以前的连接状态,但是它具有时间戳字段。然后,我只是将当前event.timestamp与来自索引的时间戳进行比较,如果该时间戳高于30秒-我会静静地丢弃disconnected
事件。但是这种方法并不可靠,因为在更快地切换设备时(间隔5秒),我仍然会出现错误的行为。对于我的项目,这是不可接受的。
是否可以使用IoT事件解决我的问题?我不想参加设备索引轮询。
答案 0 :(得分:2)
您还可以使用 sqs 延迟队列并在 5 秒后检查断开连接是否为真。这比使用阶跃函数便宜得多。这也是官方的解决方案。
答案 1 :(得分:0)
好吧,此刻我只使用StepFunction,它连接到SELECT * FROM '$aws/events/presence/#'
事件,该事件在延迟10秒后检查实际的事物状态:
{
"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注册表中的实际事物状态