使用 Amazon IoT Core 规则提取数据 - Amazon IoT SiteWise
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon IoT Core 规则提取数据

您可以使用 Amazon IoT Core 中的规则,将数据从 Amazon IoT 事物和其他 Amazon 服务发送到 Amazon IoT SiteWise。这些规则转换 MQTT 消息并执行与 Amazon 服务交互的操作。Amazon IoT SiteWise 规则操作将消息数据从 Amazon IoT SiteWise API 转发到 BatchPutAssetPropertyValue 操作。有关更多信息,请参阅Amazon IoT开发者指南Amazon IoT SiteWise》中的规则和操作

您可以按照教程逐步执行设置规则的步骤,该规则从 Amazon IoT 事物通过其设备影子提取数据。有关更多信息,请参阅将数据从 Amazon IoT 事物提取到 Amazon IoT SiteWise

您还可以将数据从 Amazon IoT SiteWise 发送到其他 Amazon 服务。有关更多信息,请参阅与其他 Amazon 服务交互

授予 Amazon IoT 所需的访问权限

您可以使用 IAM 角色来控制每个规则可以访问的Amazon资源。在创建规则之前,您必须创建一个 IAM 角色,并对其应用允许访问所需Amazon资源的策略。 Amazon IoT在运行规则时担任此角色。

如果您在Amazon IoT控制台中创建规则操作,则可以选择根资产来创建有权访问所选资产层次结构的角色。有关如何为规则手动定义角色的更多信息,请参阅Amazon IoT开发者指南Amazon IoT中的授予所需访问权限和传递角色权限

对于 Amazon IoT SiteWise 规则操作,您必须定义一个角色,该角色允许 iotsitewise:BatchPutAssetPropertyValue 访问规则向其发送数据的资产属性。为了提高安全性,您可以在 Condition 属性中指定 Amazon IoT SiteWise 资产层次结构路径。

以下示例信任策略允许访问特定资产及其子级。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*", "Condition": { "StringLike": { "iotsitewise:assetHierarchyPath": [ "/root node asset ID", "/root node asset ID/*" ] } } } ] }

您可以从策略中删除 Condition,以允许访问您的所有资产。以下示例信任策略允许访问您在当前区域中的所有资产。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*" } ] }

配置 Amazon IoT SiteWise 规则操作

Amazon IoT SiteWise规则操作将来自启动规则的 MQTT 消息中的数据发送到中的资产属性Amazon IoT SiteWise。您可以同时将多个数据条目上传到不同的资产属性,这样就可以在一条消息中发送设备的所有传感器的更新。您还可以为每个数据条目一次上传多个数据点。

注意

使用规则操作向 Amazon IoT SiteWise 发送数据时,数据必须满足 BatchPutAssetPropertyValue 操作的所有要求。例如,您的数据的时间戳不能早于当前 Unix 纪元时间的 7 天。有关更多信息,请参阅使用 Amazon IoT SiteWise API 提取数据

对于规则操作中的每个数据条目,您可以标识资产属性,并为该资产属性指定每个数据点的时间戳、质量和值。规则操作要求所有参数均为字符串。

要在条目中标识资产属性,可以指定以下项之一:

  • Asset ID (资产 ID) (assetId) 和 Property ID (属性 ID) (propertyId),这是您要将数据发送到的资产属性的值。如果您在Amazon IoT控制台中选择此选项,则可以使用列表从当前Amazon区域Amazon IoT SiteWise中选择资产模型和财产。

  • Property alias (属性别名) (propertyAlias),这是一个数据流别名(例如,/company/windfarm/3/turbine/7/temperature)。要使用此选项,您必须首先设置资产属性的别名。要了解如何设置属性别名,请参阅将工业数据流映射到资产属性

对于每个条目中的时间戳,您可以使用设备报告的时间戳或提供的时间戳Amazon IoT Core。时间戳有两个参数:

  • 以秒为单位的时间 (timeInSeconds) — 传感器或设备报告数据的 Unix 纪元时间,以秒为单位。

  • 以纳为单位的偏移量 (offsetInNanos) — (可选) 与以秒为单位的时间的纳秒偏移量。

重要

如果您的时间戳是字符串、包含小数部分或不是以秒为单位,则Amazon IoT SiteWise拒绝请求。必须将时间戳转换为秒和纳秒偏移量。使用Amazon IoT规则引擎的功能来转换时间戳。有关更多信息,请参阅下列内容:

您可以使用操作中多个参数的替代模板来执行计算、调用函数以及从消息负载中提取值。有关更多信息,请参阅《Amazon IoT开发者指南》中的替代模板

注意

由于替换模板中的表达式与 SELECT 语句分开评估,因此您不能使用替换模板来引用使用 AS 子句创建的别名。除了支持的函数和运算符之外,您只能引用原始负载中存在的信息。

为未报告准确时间的设备获取时间戳

如果您的传感器或设备未报告准确的时间数据,则可以使用时间戳 () 从Amazon IoT规则引擎获取当前 Unix 纪元时间。此函数以毫秒为单位输出时间,因此您必须将该值转换为以秒为单位的时间,并将偏移量转换为以纳秒为单位的偏移量。为此,请使用以下转换:

  • 对于 Time in seconds (时间 (以秒为单位)) (timeInSeconds),使用 ${floor(timestamp() / 1E3)} 将时间从毫秒转换为秒。

  • 对于 Offset in nanos (偏移量 (以纳秒为单位)) (offsetInNanos),使用 ${(timestamp() % 1E3) * 1E6} 计算时间戳的纳秒偏移量。

转换字符串格式的时间戳

如果您的传感器或设备以字符串格式报告时间数据(例如,2020-03-03T14:57:14.699Z),则可以使用 t ime_to_epoch(字符串、字符串)。此函数将时间戳和格式模式作为参数输入,并以毫秒为单位输出时间。然后,必须将时间转换为以秒为单位的时间,并以纳秒为单位将偏移量转换为时间。为此,请使用以下转换:

  • 对于${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)}以秒为单位的时间 (timeInSeconds),使用将时间戳字符串转换为毫秒,然后转换为秒。

  • 对于 nanos (offsetInNanos) 中的偏${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6}移量,用于计算时间戳字符串的纳秒偏移量。

注意

time_to_epoch函数支持高达毫秒精度的时间戳字符串。要转换精度为微秒或纳秒的字符串,可以配置规则调Amazon Lambda用的函数,将时间戳转换为数值。有关更多信息,请参阅转换纳秒精度时间戳字符串

转换纳秒精度时间戳字符串

如果您的设备以精度为纳秒的字符串格式发送时间戳信息(例如,2020-03-03T14:57:14.699728491Z),请使用以下步骤配置规则操作。您可以创建一个Amazon Lambda函数,将字符串的时间戳转换为以秒为单位的时间 (timeInSeconds) 和以 nanos (offsetInNanos) 表示的偏移量。然后,您可以在规则操作参数中使用 aws_lambda(FunctionArn、InputJson)来调用该 Lambda 函数并在规则中使用输出。

注意

本节包含高级说明(假设您已熟悉如何创建以下资源):

创建解析时间戳字符串的 Amazon IoT SiteWise 规则操作
  1. 使用以下属性创建 Lambda 函数:

    • 函数名称-使用描述性函数名称(例如,ConvertNanosecondTimestampFromString)。

    • 运行时 — 使用 Python 3 运行时,例如 Python 3.8 (python3.8)。

    • 权限 — 使用基本 Lambda 权限创建角色 (AmazonLambdaBasicExecutionRole)。

    • — 添加 AmazonLambda-Python38-SciPy 1x 层供 Lambda 函数使用numpy

    • 函数代码-使用以下函数代码,它使用名为的字符串参数,timestamptimeInSeconds并输出该时间戳的offsetInNanos值和值。

      import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }

      此 Lambda 函数使用 d atetime64 来输入 ISO 8601 格式的时间戳字符串 NumPy。

      注意

      如果您的时间戳字符串不是 ISO 8601 格式,则可以使用定义时间戳格式来实现解决方案。pandas有关更多信息,请参阅 p andas.to_datetime

  2. 当您为规则配置 Amazon IoT SiteWise 操作时,请为 Time in seconds (时间 (以秒为单位)) (timeInSeconds) 和 Offset in nanos (偏移量 (以纳秒为单位)) (offsetInNanos) 使用以下替换模板。这些替换模板假定您的消息负载包含 timestamp 格式的时间戳字符串。aws_lambda 函数为其第二个参数使用 JSON 结构,因此您可以根据需要修改以下替换模板。

    • 对于 Time in seconds (时间 (以秒为单位)) (timeInSeconds),请使用以下替换模板。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).timeInSeconds}
    • 对于以 Offset in nanos (偏移量 (以纳秒为单位)) (offsetInNanos),请使用以下替换模板。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).offsetInNanos}

    对于各个参数,将 regionaccount-id 替换为您的区域和 Amazon 账户 ID。如果您为 Lambda 函数使用了不同的名称,也要更改该名称。

  3. 授予 Amazon IoT 权限,以使用 lambda:InvokeFunction 权限调用您的函数。有关更多信息,请参阅 aws_lambda(functionArn, inputJson)

  4. 测试您的规则(例如,使用 Amazon IoT MQTT 测试客户端)并验证 Amazon IoT SiteWise 是否收到了您发送的数据。

    如果您的规则未按预期工作,请参阅 Amazon IoT SiteWise 规则操作故障排除

注意

此解决方案为每个时间戳字符串调用两次 Lambda 函数。如果您的规则处理每个负载中具有相同时间戳的多个数据点,则可以创建另一条规则来减少 Lambda 函数的调用次数。

为此,请使用重新发布操作创建规则,该规则调用 Lambda 并发布原始负载,并将时间戳字符串转换为timeInSecondsoffsetInNanos。然后,使用 Amazon IoT SiteWise 规则操作创建规则,以使用转换后的负载。使用这种方法,您可以减少规则调用 Lambda 的次数,但会增加Amazon IoT规则操作的运行次数。如果将此解决方案应用于您的使用案例,请考虑每项服务的定价。

规则配置示例

本部分包含规则配置示例,您可以使用这些配置通过Amazon IoT SiteWise操作创建规则。

例 使用属性别名作为消息主题的示例规则操作

以下示例创建一个带有 Amazon IoT SiteWise 操作的规则,该操作使用主题(通过 topic())作为属性别名来标识资产属性。您可以使用此示例定义一条规则,用于将双类型数据摄取到所有风力发电场的所有风力涡轮机。此示例要求您在所有涡轮机资产的属性上定义属性别名。你需要定义第二条类似的规则来摄取整数类型的数据。

aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json 中的示例负载包含以下内容。

{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

通过此规则操作,您可以将以下消息作为主题发送到风力涡轮机属性别名(例如 /company/windfarm/3/turbine/7/temperature),用于提取数据。

{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
例 使用 timestamp() 确定时间的示例规则操作

以下示例创建具有 Amazon IoT SiteWise 操作的规则,该操作按 ID 标识资产属性,并使用 timestamp() 来确定当前时间。

aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json 中的示例负载包含以下内容。

{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

使用此规则操作,您可以向 my/asset/property/topic 发送以下消息以提取数据。

{ "type": "double", "value": "38.3" }

通过基本提取降低成本

Amazon IoT Core 提供了一项名为“基本提取”的功能,您可以使用该功能通过 Amazon IoT Core 发送数据,而不会产生 Amazon IoT 消息发送成本。基本提取功能通过从提取路径中删除发布/订阅消息代理来优化大量数据提取工作负载的数据流。如果您知道消息应该路由到哪些规则,则可以使用“基本提取”。

要使用基本提取,您可以使用特殊主题 $aws/rules/rule-name,直接将消息发送到特定规则。例如,要向名为 SiteWiseWindFarmRule 的规则发送消息,您可以向主题 $aws/rules/SiteWiseWindFarmRule 发送消息。

如果您的规则操作使用包含 topic(Decimal) 的替换模板,则可以在“基本提取”特殊主题的末尾传递原始主题,例如 $aws/rules/rule-name/original-topic。例如,要将基本提取与之前部分中的风电场属性别名示例结合使用,您可以向以下主题发送消息。

$aws/rules/SiteWiseWindFarmRule//company/windfarm/3/turbine/7/temperature
注意

上述示例包含第二个斜杠 (//),因为 Amazon IoT 从对规则操作可见的主题中删除基本提取前缀 ($aws/rules/rule-name/)。在此示例中,规则接收主题 /company/windfarm/3/turbine/7/temperature

有关更多信息,请参阅《Amazon IoT开发者指南》中的 “通过基本采集降低消息传送成本”。

Amazon IoT SiteWise 规则操作问题排查

要对中的Amazon IoT SiteWise规则操作进行故障排除Amazon IoT Core,您可以配置 CloudWatch 日志,也可以为规则配置重新发布错误操作。有关更多信息,请参阅Amazon IoT SiteWise 规则操作故障排除