本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 AWS IoT SiteWise 规则操作
AWS IoT SiteWise 规则操作将启动规则的MQTT消息中的数据发送到中的资产属性 AWS IoT SiteWise。您可以同时将多个数据条目上传到不同的资产属性,以便在一条消息中发送设备所有传感器的更新。您还可以为每个数据条目一次上传多个数据点。
注意
当您 AWS IoT SiteWise 使用规则操作向发送数据时,您的数据必须满足BatchPutAssetPropertyValue
操作的所有要求。例如,您的数据的时间戳不能早于当前 Unix 纪元时间 7 天。有关更多信息,请参阅使用提取数据。 AWS IoT SiteWise
API
对于规则操作中的每个数据条目,您可以标识资产属性,并为该资产属性指定每个数据点的时间戳、质量和值。规则操作要求所有参数均为字符串。
要在条目中标识资产属性,可以指定以下项之一:
-
资产 ID (
assetId
) 和 属性 ID (propertyId
),这是您要将数据发送到的资产属性的值。您可以使用查找资产 ID 和财产 ID AWS IoT SiteWise 控制台。如果您知道资产 ID,则可以使用 to call AWS CLI DescribeAsset来查找资产 ID。 -
属性别名 (
propertyAlias
),这是一个数据流别名(例如,/company/windfarm/3/turbine/7/temperature
)。要使用此选项,您必须首先设置资产属性的别名。要了解如何设置属性别名,请参阅将工业数据流映射到资产属性。
对于每个条目中的时间戳,请使用您的设备报告的时间戳或提供的时间戳。 AWS IoT Core时间戳有两个参数:
-
时间(以秒为单位)(
timeInSeconds
) – 传感器或设备报告数据的 Unix 纪元时间(以秒为单位)。 -
偏移量(以纳秒为单位)(
offsetInNanos
) –(可选)以秒为单位的时间的纳秒偏移量。
重要
如果您的时间戳是一个字符串、包含小数部分或不是以秒为单位,则 AWS IoT SiteWise 会拒绝该请求。您必须将时间戳转换为秒和纳秒偏移量。使用 AWS IoT 规则引擎的功能来转换时间戳。有关更多信息,请参阅下列内容:
在执行计算、调用函数以及从消息负载中提取值的操作中,您可以为多个参数使用替换模板。有关更多信息,请参阅 AWS IoT 开发人员指南中的替换模板。
注意
由于替换模板中的表达式与 SELECT
语句分开评估,因此您不能使用替换模板来引用使用 AS
子句创建的别名。除了支持的函数和运算符之外,您只能引用原始负载中存在的信息。
获取未报告准确时间的设备的时间戳
如果您的传感器或设备未报告准确的时间数据,请使用 time stamp () 从 AWS IoT 规则引擎获取当前 Unix 纪元时间。此函数以毫秒为单位输出时间,因此您必须将值转换为以秒为单位的时间,并将偏移量转换为以纳秒为单位。为此,请使用以下转换:
-
对于 时间 (以秒为单位) (
timeInSeconds
),使用${floor(timestamp() / 1E3)}
将时间从毫秒转换为秒。 -
对于 偏移量 (以纳秒为单位) (
offsetInNanos
),使用${(timestamp() % 1E3) * 1E6}
计算时间戳的纳秒偏移量。
转换字符串格式的时间戳
如果您的传感器或设备以字符串格式报告时间数据(例如,2020-03-03T14:57:14.699Z
),请使用 t ime_to_epoch(字符串、字符串)。此函数将时间戳和格式模式作为参数输入,并以毫秒为单位输出时间。然后,您必须将时间转换为以秒为单位的时间和以纳秒为单位的偏移量。为此,请使用以下转换:
-
对于时间(以秒为单位)(
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
函数支持高达毫秒精度的时间戳字符串。要转换精度为微秒或纳秒的字符串,请配置规则调 AWS Lambda 用的函数以将时间戳转换为数值。有关更多信息,请参阅 转换纳秒精度的时间戳字符串。
转换纳秒精度的时间戳字符串
如果您的设备以精度为纳秒的字符串格式发送时间戳信息(例如 2020-03-03T14:57:14.699728491Z
),请使用以下过程配置规则操作。你可以创建一个 AWS Lambda 函数,将时间戳从字符串转换为以秒为单位的时间 (timeInSeconds
) 和以 nanos 为单位的偏移量 (offsetInNanos
)。然后,在规则操作参数中使用 aws_lambda (functionArn,inputJson) 来调用该 Lambda 函数并在规则中使用输出。
注意
本节包含高级说明(假设您已熟悉如何创建以下资源):
-
Lambda 函数。有关更多信息,请参阅AWS Lambda 开发人员指南中的创建您的第一个 Lambda 函数。
-
AWS IoT 带有规则操作的 AWS IoT SiteWise 规则。有关更多信息,请参阅 使用 AWS IoT Core 规则摄取数据。
创建解析时间戳字符串的 AWS IoT SiteWise 规则操作
-
创建具有以下属性的 Lambda 函数:
-
函数名称 – 使用描述性函数名称(例如
ConvertNanosecondTimestampFromString
)。 -
运行时 — 使用 Python 3 运行时,例如 Python 3.11 (
python3.11
)。 -
权限-创建具有基本 Lambda 权限的角色 () AWS LambdaBasicExecutionRole。
-
图层 — 添加 AWS SDKPandas-Python311 层以供 Lambda 函数使用。
numpy
-
函数代码 – 使用以下函数代码,该函数使用名为
timestamp
的字符串参数,并为该时间戳输出timeInSeconds
和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 函数使用来自 datetime64 输入 ISO8601
格式的时间戳字符串。 NumPy 注意
如果您的时间戳字符串不是 ISO 8601 格式,则可以使用定义时间戳格式pandas来实现解决方案。有关更多信息,请参阅 pandas.to_datetime
。
-
-
为规则配置 AWS IoT SiteWise 操作时,请使用以下替换模板来替换时间(以秒为单位
timeInSeconds
)和以纳为单位的偏移量(offsetInNanos
)。这些替换模板假定您的消息负载包含timestamp
格式的时间戳字符串。该aws_lambda
函数的第二个参数使用一个JSON结构,因此您可以根据需要修改以下替换模板。-
对于 时间 (以秒为单位) (
timeInSeconds
),请使用以下替换模板。${aws_lambda('arn:aws:lambda:
region
:account-id
:function:ConvertNanosecondTimestampFromString
', {'timestamp': timestamp}).timeInSeconds} -
对于以 偏移量 (以纳秒为单位) (
offsetInNanos
),请使用以下替换模板。${aws_lambda('arn:aws:lambda:
region
:account-id
:function:ConvertNanosecondTimestampFromString
', {'timestamp': timestamp}).offsetInNanos}
对于每个参数,替换
region
以及account-id
使用您的地区和 AWS 账户 ID。如果您为 Lambda 函数使用了不同的名称,请相应更改。 -
-
授予使用该 AWS IoT 权限调用您的函数的
lambda:InvokeFunction
权限。有关更多信息,请参阅 aws_lambda (functionArn,)。inputJson -
测试您的规则(例如,使用 AWS IoT MQTT测试客户端),并验证该规则 AWS IoT SiteWise 接收了您发送的数据。
如果您的规则未按预期工作,请参阅 对 AWS IoT SiteWise 规则操作进行故障排除。
注意
此解决方案为每个时间戳字符串调用 Lambda 函数两次。如果您的规则处理各个负载中具有相同时间戳的多个数据点,则可以创建另一个规则来减少 Lambda 函数的调用次数。
为此,请使用重新发布操作创建规则,该操作会调用 Lambda 并发布原始负载,其中时间戳字符串转换为 timeInSeconds
和 offsetInNanos
。然后,创建一个带有规则操作的 AWS IoT SiteWise 规则,以消耗转换后的有效负载。使用这种方法,您可以减少规则调用 Lambda 的次数,但可以增加规则操作的 AWS IoT 运行次数。如果将此解决方案应用于您的使用案例,请考虑每项服务的定价。
示例规则配置
本节包含用于创建带有 AWS IoT SiteWise 操作的规则的示例规则配置。
例 使用属性别名作为消息主题的示例规则操作
以下示例创建了一个规则,其 AWS IoT SiteWise 操作使用主题(通过 topi c ())作为属性别名来标识资产属性。使用此示例定义一条规则,用于将双类型数据采集到所有风力发电场中的所有风力涡轮机。此示例要求您为所有涡轮机资产的属性定义属性别名。您需要定义另一个类似的规则来摄取整数型数据。
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() 确定时间的示例规则操作
以下示例创建了一个规则,其 AWS IoT SiteWise 操作通过标识资产属性IDs并使用 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" }
规则操作问题排查
要对中的 AWS IoT SiteWise 规则操作进行故障排除 AWS IoT Core,请为您的规则配置 CloudWatch 日志或配置重新发布错误操作。有关更多信息,请参阅 对 AWS IoT SiteWise 规则操作进行故障排除。