使用 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规则操作将消息数据转发到BatchPutAssetPropertyValue操作来自Amazon IoT SiteWiseAPI。有关更多信息,请参阅 。RuleAmazon IoT SiteWise行动中的Amazon IoT开发人员指南.

您可以按照教程逐步执行设置规则的步骤,该规则从 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 IoT SiteWise在最新的Amazon区域。

  • 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规则引擎timestamp(). 此函数以毫秒为单位输出时间,因此您必须将值转换为以秒为单位的时间,并将偏移量转换为以纳秒为单 为此,请使用以下转化:

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

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

转换字符串格式的时间戳

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

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

  • 适用于纳米偏移(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) 和纳米偏移(offsetInNanos)。然后,您可以使用。aws_lambda(functionArn, inputJson)在规则操作参数中,以调用该 Lambda 函数并在规则中使用输出。

注意

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

创建解析时间戳字符串的 Amazon IoT SiteWise 规则操作

  1. 创建具有以下属性的 Lambda 函数:

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

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

    • Permissions (权限)— 创建具有基本 Lambda 权限的角色 (Amazonlambda Basic 执行角色)。

    • — 添加Amazonlambda python38-scipy1x允许 Lambda 函数使用的层numpy.

    • 函数代码— 使用以下函数代码,该代码将使用名为的字符串参数timestamp和输出timeInSecondsoffsetInNanos该时间戳的值。

      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 函数在中输入时间戳字符串ISO 8601使用格式日期时间 64来自 NumPy。

      注意

      如果时间戳字符串不是 ISO 8601 格式,则可以使用pandas它定义了时间戳格式。有关更多信息,请参阅 。pandas.to_datetTime.

  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 SiteWiseaction.

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

以下示例创建一个带有 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 Logs,或者为规则配置重新发布错误操作。有关更多信息,请参阅Amazon IoT SiteWise 规则操作故障排除