View a markdown version of this page

Modelos de substituição - AWS IoT Core

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Modelos de substituição

Você pode usar um modelo de substituição para aumentar os dados JSON retornados quando uma regra é acionada e AWS IoT executa uma ação. A sintaxe de um modelo de substituição é ${ expressão}, em que expressão pode ser qualquer expressão suportada AWS IoT nas cláusulas SELECT, nas cláusulas WHERE e. AWS IoT ações de regras Essa expressão pode ser conectada a um campo de ação em uma regra, permitindo que você configure dinamicamente uma ação. Na verdade, esse recurso substitui uma informação em uma ação. Isso inclui funções, operadores e informações presentes na carga da mensagem original.

Importante

Como uma expressão em um modelo de substituição é avaliada separadamente da instrução "SELECT...", você não pode fazer referência a um alias criado com a cláusula AS. Você pode fazer referência somente às informações presentes na carga original, além das funções e dos operadores compatíveis.

Para obter mais informações sobre as expressões compatíveis, consulte AWS IoT Referência SQL.

As ações de regra a seguir oferecem suporte a modelos de substituição. Cada ação oferece suporte a campos diferentes que podem ser substituídos.

Os modelos de substituição aparecem nos parâmetros de ação dentro de uma regra:

{ "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" } }] }

Se essa regra for acionada pelo JSON a seguir publicado em my/iot/topic:

{ "deviceid": "iot123", "temp": 54.98, "humidity": 32.43, "coords": { "latitude": 47.615694, "longitude": -122.3359976 } }

Em seguida, essa regra publica o seguinte JSON emmy/iot/topic/republish, que AWS IoT substitui de: ${topic()}/republish

{ "deviceid": "iot123", "temp": 54.98, "humidity": 32.43, "coords": { "latitude": 47.615694, "longitude": -122.3359976 }, "timestamp": 1579637878451 }

Per-element substituição de cargas úteis de matriz em AWS IoT regras

Com AWS IoT, você pode usar a ${ expressão } padrão do modelo de substituição. Esse modelo é resolvido uma vez por mensagem, em relação à carga da mensagem conforme o dispositivo a publicou, antes que a instrução SQL da regra a transforme. Se o payload da mensagem for uma matriz JSON, use o campo de sequência @{ por elemento em vez disso. } Essa sequência é resolvida uma vez para cada elemento da carga que a instrução SQL da regra produz. A ação da regra grava um ponto InfluxDB de protocolo de linha por elemento. Ele usa o valor do elemento correspondente.

nota

As duas sequências leem cargas diferentes, para que possam ser resolvidas em valores diferentes para o mesmo nome de campo. Se a instrução SQL da regra renomear ou remodelar os campos, dentro do @{ campo, } você deverá referenciar o nome do campo conforme ele aparece na saída SQL. Se um elemento não contiver o campo, a sequência será resolvida para um valor vazio. Ele não volta para um valor no nível da mensagem e AWS IoT descarta um valor de tag vazio do protocolo de linha que ele grava.

Importante

A } sequência de @{ campo funciona somente na configuração da ação da AWS IoT InfluxDB regra. Não funciona nesses lugares:

  • A instrução SQL da regra (as cláusulas SELECT, WHERE ou SET)

  • Qualquer outra ação de regra

  • Uma função do . A sequência não pode conter uma, como@{upper(room)}. Você também não pode passar a sequência para uma função de modelo de substituição, porque um único valor de configuração não pode conter tanto @{...} e. ${...}

  • A ação de erro da regra, mesmo quando essa ação de erro é uma InfluxDB ação. A ação de erro é executada uma vez para a mensagem, portanto, nunca é resolvida por elemento.

Se você usá-lo em qualquer um desses lugares, as ReplaceTopicRule operações CreateTopicRule e falharão com um erro.

O @{ campo de sequência por elemento } tem os seguintes requisitos:

  • Deve fazer referência a um único campo, como @{room} ou @{meta.sensor_id}

  • Não deve incluir funções, aritmética, comparações ou literais

  • Deve aparecer no máximo uma vez em um valor de configuração

  • Não deve aparecer no mesmo valor de configuração de um modelo ${...} de substituição

  • Deve aparecer em um valor de configuração, não em uma chave (por exemplo, um valor de InfluxDB tag, mas não em uma chave de tag)

Mapear elementos da matriz para InfluxDB pontos

Neste exemplo, uma ação de InfluxDB regra define o nome da medida (tableName) como @{measurement_type} e uma location tag como@{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" } } ] } }

A carga útil da matriz a seguir aciona a regra:

[ { "measurement_type": "temperature", "room": "kitchen", "value": 5, "timestamp": 1700000000000 }, { "measurement_type": "humidity", "room": "bedroom", "value": 15, "timestamp": 1700000001000 } ]

A ação grava um ponto InfluxDB de protocolo de linha para cada elemento da matriz. Cada elemento é resolvido @{measurement_type} com seu próprio nome de medição e @{room} com sua própria location tag:

temperature,location=kitchen value=5i 1700000000000 humidity,location=bedroom value=15i 1700000001000
nota

AWS IoT exclui do conjunto de campos qualquer @{ campo referenciado por uma } sequência de campos. AWS IoT usa o valor desse campo como nome da medida ou valor da tag. Neste exemplo, measurement_type fornece a medida e room fornece a location etiqueta. AWS IoT exclui ambos, então cada ponto é mantido apenas value como um campo.

O exemplo anterior usaSELECT *, portanto, a carga que a ação recebe corresponde à carga que o dispositivo publicou. Se a instrução SQL renomear um campo, use o nome que aparece na saída SQL. Por exemplo, se a declaração incluirroom AS location_name, use @{location_name} em vez de@{room}.

Resolva em relação a uma carga que a instrução SQL produz

A carga que a ação recebe nem sempre é a carga que o dispositivo publicou. Neste exemplo, o dispositivo publica um objeto que contém uma matriz de leituras:

{ "device_id": "sensor-1", "readings": [ { "measurement_type": "temperature", "room": "kitchen", "value": 5, "timestamp": 1700000000000 }, { "measurement_type": "humidity", "room": "bedroom", "value": 15, "timestamp": 1700000001000 } ] }

A regra é usada SELECT VALUE para retornar a readings matriz como carga útil de nível superior. Para obter mais informações, consulte Produzir uma matriz como um objeto de nível superior.

SELECT VALUE readings FROM 'iot/topic'

A ação recebe a seguinte matriz, mesmo que o dispositivo tenha publicado um objeto. Ele escreve os mesmos dois pontos do exemplo anterior, porque cada elemento ainda contém measurement_typeroom, e. value

[ { "measurement_type": "temperature", "room": "kitchen", "value": 5, "timestamp": 1700000000000 }, { "measurement_type": "humidity", "room": "bedroom", "value": 15, "timestamp": 1700000001000 } ]
nota

O device_id campo está na carga que o dispositivo publicou, mas não na matriz que a instrução SQL produz. Por esse motivo, @{device_id} não resolve nesta regra. Faça referência somente aos campos que aparecem nos elementos da matriz produzida.