本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
替换模板
您可以使用替换模板来增加触发规则并 AWS IoT 执行操作时返回的 JSON 数据。替换模板的语法是${表达式},其中表达式可以是 SELECT 子句、WHERE 子句和 AWS IoT 中支持的任何表达式AWS IoT 规则操作。此表达式可插入到规则的操作字段中,使您可以动态配置操作。在生效时,此特征替换操作中的一段信息。这包括函数、运算符和原始消息有效载荷中存在的信息。
有关支持的表达式的更多信息,请参阅AWS IoT SQL 参考。
以下规则操作支持替换模板。每个操作都支持不同的可替换字段。
替换模板显示在规则内的操作参数中:
{ "sql": "SELECT *, timestamp() AS timestamp FROM 'my/iot/topic'", "ruleDisabled": false, "actions": [{ "republish": { "topic": "${topic()}/republish", "roleArn": "arn:aws:iam::123456789012:role/my-iot-role" } }] }
如果该规则由发布到 my/iot/topic 的以下 JSON 触发:
{ "deviceid": "iot123", "temp": 54.98, "humidity": 32.43, "coords": { "latitude": 47.615694, "longitude": -122.3359976 } }
然后,此规则将以下 JSON 发布到my/iot/topic/republish,其 AWS IoT 替换为:${topic()}/republish
{ "deviceid": "iot123", "temp": 54.98, "humidity": 32.43, "coords": { "latitude": 47.615694, "longitude": -122.3359976 }, "timestamp": 1579637878451 }
Per-element 替换中的数组有效负载 AWS IoT 规则
使用 AWS IoT,您可以使用标准替换模板${表达式}。在规则的 SQL 语句转换之前,此模板根据设备发布消息时的消息负载对每条消息进行一次解析。如果您的消息负载是 JSON 数组,请}改用每元素序列@{字段。对于规则的 SQL 语句生成的有效负载的每个元素,此序列解析一次。规则操作为每个元素写入一个InfluxDB线路协议点。它使用来自匹配元素的值。
注意
这两个序列读取不同的有效载荷,因此它们可以为相同的字段名解析为不同的值。如果规则的 SQL 语句重命名或重塑字段,}则在@{字段内必须引用 SQL 输出中显示的字段名称。如果元素不包含该字段,则序列将解析为空值。它不会回退到消息级别的值,而是从它写入的线路协议中 AWS IoT 删除一个空标签值。
重要
@{字段}序列仅在 AWS IoT InfluxDB规则操作配置中起作用。它在以下地方不起作用:
-
规则 SQL 语句(SELECT、WHERE 或 SET 子句)
-
任何其他规则操作
-
函数 该序列不能包含一个,例如
@{upper(room)}。您也不能将序列传递给替换模板函数,因为单个配置值不能同时包含@{...}和${...}。 -
规则的错误操作,即使该错误操作是一个InfluxDB操作也是如此。错误操作会对消息运行一次,因此它永远不会针对每个元素进行解析。
如果您在其中任何一个地方使用它,则CreateTopicRule和ReplaceTopicRule操作会因错误而失败。
每元素序列@{字段}具有以下要求:
-
必须引用单个字段,例如
@{room}或@{meta.sensor_id} -
不得包含函数、算术、比较或文字
-
在配置值中最多必须出现一次
-
不得出现在与
${...}替换模板相同的配置值中 -
必须出现在配置值中,而不是键中(例如,InfluxDB标签值但不是标签键)
将数组元素映射到 InfluxDB 点
在此示例中,InfluxDB规则操作将测量名称 (tableName) 设置为@{measurement_type},将location标签设置为@{room}:
{ "topicRulePayload": { "sql": "SELECT * FROM 'iot/topic'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "influxDB": { "destinationArn": "arn:aws:iot:us-east-1:123456789012:ruledestination/influxdb/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "roleArn": "arn:aws:iam::123456789012:role/aws_iot_influxdb", "databaseName": "device_metrics", "tableName": "@{measurement_type}", "organization": "my_organization", "tags": { "location": "@{room}" }, "timestampUnit": "ms" } } ] } }
以下数组负载会触发规则:
[ { "measurement_type": "temperature", "room": "kitchen", "value": 5, "timestamp": 1700000000000 }, { "measurement_type": "humidity", "room": "bedroom", "value": 15, "timestamp": 1700000001000 } ]
该操作为数组的每个元素写入一个InfluxDB行协议点。每个元素都解析@{measurement_type}为自己的测量名称和@{room}自己的location标签:
temperature,location=kitchen value=5i 1700000000000 humidity,location=bedroom value=15i 1700000001000
注意
AWS IoT 从字段集中排除@{字段}序列引用的任何字段。 AWS IoT 使用该字段的值作为测量名称或标签值。在此示例中,measurement_type提供测量值并room提供location标签。 AWS IoT
将两者都排除在外,因此每个点仅value作为一个字段保留。
前面的示例使用SELECT *,因此操作接收的负载与设备发布的有效负载相匹配。如果 SQL 语句重命名字段,请使用 SQL 输出中显示的名称。例如,如果语句包含room AS location_name,则使用@{location_name}而不是@{room}。
针对 SQL 语句生成的有效负载进行解析
操作接收的有效载荷并不总是设备发布的有效负载。在此示例中,设备发布了一个包含读数数组的对象:
{ "device_id": "sensor-1", "readings": [ { "measurement_type": "temperature", "room": "kitchen", "value": 5, "timestamp": 1700000000000 }, { "measurement_type": "humidity", "room": "bedroom", "value": 15, "timestamp": 1700000001000 } ] }
该规则用于SELECT VALUE将readings数组作为顶级有效载荷返回。有关更多信息,请参阅 将数组作为顶级对象输出。
SELECT VALUE readings FROM 'iot/topic'
即使设备发布了对象,操作也会收到以下数组。它写入的两个点与前面的示例相同,因为每个元素仍包含measurement_typeroom、和value。
[ { "measurement_type": "temperature", "room": "kitchen", "value": 5, "timestamp": 1700000000000 }, { "measurement_type": "humidity", "room": "bedroom", "value": 15, "timestamp": 1700000001000 } ]
注意
该device_id字段位于设备发布的有效负载中,但不在 SQL 语句生成的数组中。出于这个原因,在这条规则中@{device_id}没有解决。仅引用出现在生成的数组元素中的字段。