1

假设传感器发送这样的数据:

{"timestamp": "2020-11-11 08:27:19", "temperature": 90, "device": "device1"}
  1. 创建 IoT 核心规则以将数据发送到 Timestream db 表。

  2. 规则 SQL:SELECT device, temperature, time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss') as fn_ts FROM 'topic'

  3. 方面:device

    价值:${device}

  4. 时间戳:${fn_ts}

    单元:MILLISECONDS

此数据未到达 Timestream db。但是,如果我删除在步骤 4 中设置的时间戳字段,那么数据将到达 Timestream 数据库。可能是什么问题?

令人惊讶的是 - 如果我将第 2 步的输出重新发布到一个新主题并创建一个规则,将该主题的 msg 发送到 Timestream db,其配置与上述第 3 步和第 4 步相同,那么数据将进入 Timestream db。

此外,如果原始 msg 是{"fn_ts": 1605083835000, "temperature": 90, "device": "device1"}并且我有一个规则以使用相同的步骤 3 和步骤 4 将数据发送到 Timestream db,那么数据将到达 Timestream 表。

4

2 回答 2

1

我只是浪费了 2 天时间来玩 IoT Rule 直接注入到 Timestream。我只能确认它从一开始就和它看起来一样有问题。使用自定义时间戳的唯一方法是执行您建议的解决方法,例如在单独的规则中转换有效负载并重定向到另一个 IoT 主题。因为由于某种原因,注入操作看不到 SQL 生成的 JSON 中的字段,我可以清楚地诊断它,因为我附加了一个 CloudWatch 操作来查看我尝试使用 SQL 生成的每个有效负载。


但是还有另一个大问题。当您最终设法将数据注入表中时,您会发现每个有效负载字段都是表中的单独度量字段,甚至时间戳本身以及您已标记为维度的所有字段。那太可笑了。在我浪费了这么多时间之后,我仍然需要继续使用自定义 lambda 来避免表中所有那些凌乱的措施。

于 2021-01-22T14:08:43.387 回答
0

使用 AWS IoT 规则时,当您使用引用在 SQL 的 AS 子句中定义的别名的替换模板时,它将无法按预期工作。

文档中:

因为替换模板中的表达式是与“SELECT ...”语句分开计算的,所以您不能引用使用 AS 子句创建的别名。您只能引用原始有效负载、函数和运算符中存在的信息。

因此,使用您的有效负载:

{"timestamp": "2020-11-11 08:27:19", "temperature": 90, "device": "device1"}

如果您将 SQL 更改为以下内容:

SELECT * FROM 'topic'

您仍然可以像以前一样设置尺寸和设备,但您可以像这样设置时间戳:

${time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss')}

这将使用您的时间戳调用 time_to_epoch 函数并将结果值用作时间流中的时间戳。

于 2021-05-27T23:48:45.337 回答