Ao criar uma regra de encaminhamento de dados, escreva uma instrução SQL para analisar e processar os dados JSON reportados pelos dispositivos. Dados em formato binário são transmitidos diretamente sem análise. Este tópico descreve como escrever expressões SQL para regras de encaminhamento de dados.
Expressões SQL
Se o identificador de um modelo da Thing Specification Language começar com um número, não será possível usar uma expressão SQL para acessar esse modelo. A versão anterior do recurso de encaminhamento de dados não oferece suporte ao encaminhamento de dados de modelos da Thing Specification Language cujos identificadores começam com um número.
Use a nova versão do recurso de encaminhamento de dados para editar um script que acesse um modelo da Thing Specification Language cujo identificador comece com um número e encaminhe seus dados. Para obter mais informações, consulte Guia de scripts.
É possível mapear dados JSON para uma tabela virtual. Nesse mapeamento, uma chave corresponde a uma coluna da tabela e um valor corresponde ao valor dessa coluna. Isso permite o uso de SQL para processamento de dados. A figura a seguir mostra uma expressão SQL para uma regra de encaminhamento de dados.

A seguir, são apresentados exemplos de SQL para regras de encaminhamento de dados:
-
Exemplo de SQL para processar dados de um tópico personalizado.
Um sensor ambiental coleta dados de temperatura, umidade e pressão atmosférica. O dispositivo reporta os seguintes dados ao tópico personalizado
/a1hRrzD****/+/user/update:{ "temperature":25.1, "humidity":65, "pressure":101.5, "location":"***,***" }Para acionar a regra quando a temperatura for superior a 38°C e filtrar as informações de nome do dispositivo, temperatura e localização, use a seguinte instrução SQL:
SELECT temperature as t, deviceName() as deviceName, location FROM "/a1hRrzD****/+/user/update" WHERE temperature > 38 -
Exemplo de SQL para processar dados de tópicos de comunicação básica e tópicos de comunicação de modelos da Thing Specification Language. Quando dados desses tópicos são encaminhados ao mecanismo de regras, o mecanismo os analisa. Para obter mais informações sobre o formato dos dados após a análise, consulte Formatos de dados. O sensor define duas propriedades personalizadas: Current Humidity (identificador:
CurrentHumidity, tipo de dados: float, intervalo de valores: 0 a 100) e Current Temperature (identificador:CurrentTemperature, tipo de dados: float, intervalo de valores: -40 a 120).Após o mecanismo de regras analisar os dados das propriedades de temperatura e umidade reportados pelo sensor, os dados assumem o seguinte formato:
{ "deviceType": "TemperatureHumidityDetector", "iotId": "N5KURkKdibnZvSls****000100", "productKey": "a15NNfl****", "gmtCreate": 1564569974224, "deviceName": "N5KURkKdibnZvSls3Yfx", "items": { "CurrentHumidity": { "value": 70, "time": 1564569974229 }, "CurrentTemperature": { "value": 23.5, "time": 1564569974229 } } }ImportanteEm uma consulta SQL, use
items.${PropertyIdentifier}.value
para acessar os dados de uma propriedade específica.
Para acionar a regra quando a temperatura for superior a 38°C e filtrar o nome do dispositivo, a temperatura atual e a umidade atual, use a seguinte instrução SQL:
SELECTdeviceName() as deviceName, items.CurrentHumidity.value as Humidity, items.CurrentTemperature.value as Temperature FROM "/sysa15NNfl****/N5KUR***/thing/event/property/post" WHERE items.CurrentTemperature.value > 38Caso a propriedade pertença a um módulo personalizado, como testFB, o identificador da propriedade seguirá o formato
${ModuleIdentifier}:${PropertyIdentifier}. Para acessar os dados de uma propriedade específica, use aspas duplas (""). A instrução SQL fica da seguinte forma:SELECTdeviceName() as deviceName, "items.testFB:CurrentHumidity.value" as Humidity, "items.testFB:CurrentTemperature.value" as Temperature FROM "/sysa15NNfl****/N5KUR***/thing/event/property/post" WHERE "items.testFB:CurrentTemperature.value" > 38
SELECT
-
Para formato de dados JSON
Os campos em uma instrução SELECT podem ser os valores-chave do payload JSON de uma mensagem reportada. Também é possível usar funções SQL integradas, como
deviceName(). Para obter mais informações sobre as funções SQL integradas do mecanismo de regras, consulte Lista de funções.O caractere
*pode ser usado em combinação com funções. Subconsultas não são suportadas.Os dados JSON reportados podem ser uma matriz ou um objeto JSON aninhado. As instruções SQL oferecem suporte a JSONPath para recuperar valores de propriedades. Por exemplo, para
{a:{key1:v1, key2:v2}}, usea.key2para recuperar o valorv2. Ao usar variáveis, observe a diferença entre aspas simples e duplas. Aspas simples indicam uma constante. Aspas duplas ou a ausência de aspas indicam uma variável. Por exemplo, se você usar aspas simples em'a.key2', o valor será a stringa.key2.Nos exemplos de SQL deste tópico:
Na instrução SQL
SELECTSELECT temperature as t, deviceName() as deviceName, location,temperatureelocationsão campos dos dados reportados, edeviceName()é uma função SQL integrada.-
Na instrução SELECT
SELECT deviceName() as deviceName, items.CurrentHumidity.value as Humidity, items.CurrentTemperature.value as Temperaturepara processar dados de um tópico de reporte de propriedades,items.CurrentHumidity.valueeitems.CurrentTemperature.valuesão campos dos dados de propriedade reportados do módulo padrão.deviceName()é uma função SQL integrada.Notaitems.testFB:CurrentHumidity.value
e
items.testFB:CurrentTemperature.value
são campos dos dados de propriedade reportados de um módulo personalizado.
-
Para dados binários
Insira
*para transmitir os dados diretamente. Não é possível usar funções após*.Use funções integradas. Por exemplo, utilize a função
to_base64(*)para converter os dados originais do payload binário em uma string Base64 e extraí-los. Use a funçãodeviceName()para extrair o nome do dispositivo.
Uma instrução SELECT pode conter no máximo 50 campos.
FROM
Na cláusula FROM, especifique um tópico para corresponder ao tópico de origem das mensagens do dispositivo que você deseja processar. Para o nível de nome do dispositivo no tópico, use o caractere curinga de sinal de adição (+). Esse caractere representa todos os dispositivos no nível atual, ou seja, todos os dispositivos sob o produto. Ao especificar um tópico personalizado, também é possível usar o caractere curinga de cerquilha (#). Esse caractere representa o nível atual e todos os níveis subsequentes no tópico. Para obter mais informações sobre caracteres curinga, consulte Usar tópicos personalizados para comunicação.
Quando uma mensagem do tópico especificado chega, seu payload é analisado como JSON e processado com base na instrução SQL. Se o formato da mensagem for inválido, ela será ignorada. Use a função topic() para referenciar um valor específico do tópico.
Nos exemplos de SQL acima:
A instrução
FROM "/a1hRrzD****/+/user/update"indica que a instrução SQL processa apenas mensagens do tópico personalizado/a1hRrzD****/+/user/update.A instrução
FROM "/sys/a15NNfl****/N5KURkKdibnZvSls3Yfx/thing/event/property/post"indica que a instrução SQL processa apenas mensagens do tópico no qual o dispositivo N5KURkKdibnZvSls3Yfx reporta propriedades.
WHERE
-
Para formato de dados JSON
A cláusula WHERE especifica a condição de acionamento da regra, que é uma expressão condicional. Subconsultas não são suportadas. Os campos utilizáveis na cláusula WHERE são os mesmos da instrução SELECT. Quando uma mensagem é recebida do tópico correspondente, a instrução WHERE é avaliada para determinar se a regra deve ser acionada. Para obter mais informações sobre expressões condicionais, consulte a seção Expressões condicionais suportadas abaixo.
Nos dois exemplos acima, a instrução condicional
WHERE temperature > 38indica que a regra é acionada somente quando a temperatura é superior a 38°C. -
Para formato de dados binários
Para dados binários, a cláusula WHERE suporta apenas funções integradas e expressões condicionais. Não é possível usar campos do payload.
Resultados do SQL
Após a execução da instrução SQL, um resultado SQL é gerado para a próxima etapa de encaminhamento. Se ocorrer um erro durante a análise do payload, a execução da regra falhará.
Para encaminhar dados ao Tablestore, use o formato de variável ${Expression} para referenciar o valor correspondente ao definir o destino do encaminhamento de dados.
Se as regras dos dois exemplos acima precisarem encaminhar dados para uma tabela de dados no Tablestore, configure os valores da chave primária da seguinte maneira:
${t}, ${deviceName} e ${location}.
${deviceName}, ${Humidity} e ${Temperature}.
Uso de matrizes
As expressões de matriz devem estar entre aspas duplas. O operador $. busca um objeto JSON. O operador $. é opcional. O operador . busca uma matriz JSON.
Por exemplo, se a mensagem do dispositivo for
{"a":[{"v":0},{"v":1},{"v":2}]}
, diferentes expressões produzem os seguintes resultados:
"a[0]"retorna{"v":0}"$.a[0]"retorna{"v":0}".a[0]"retorna[{"v":0}]
"a[1].v"retorna1-
"$.a[1].v"retorna1 ".a[1].v"retorna[1]- like: Consulta dados que contêm um caractere específico.
- not like: Consulta dados que não contêm um caractere específico.
Após escrever o SQL, clique em SQL Debug.
-
Na caixa de diálogo SQL Debugging, na aba Debugging Parameters, insira os dados para depuração e clique em Debug. Os parâmetros incluem Product, Device, Device Tag (é possível adicionar ou excluir tags de par chave-valor), Topic e Payload Data.
Insira os dados do payload para depuração de acordo com o formato de dados do tópico. O formato de dados é descrito da seguinte maneira:
Se o tópico for personalizado, o formato dos dados do payload inseridos deve ser idêntico ao formato dos dados reportados ao tópico.
Se o tópico for de comunicação básica ou de comunicação de modelo da Thing Specification Language, consulte Formatos de dados.
Clique na aba Debug Result para visualizar o resultado. O resultado da depuração é exibido em formato JSON e inclui campos como
attribute('b')com valor"b",payloadcom valor{"timeout":"test"},attribute('a')com valor"a",attribute('coordinate')para a coordenada do dispositivo,deviceNamepara o nome do dispositivo etimestampcom um valor como 1579004949668.
Expressões condicionais suportadas
| Operador | Descrição | Exemplo |
| = | Igual a | color = 'red' |
| <> | Diferente de | color <> 'red' |
| AND | E lógico | color = 'red' AND siren = 'on' |
| OR | OU lógico | color = 'red' OR siren = 'on' |
| + | Adição aritmética | 4 + 5 |
| - | Subtração aritmética | 5 - 4 |
| / | Divisão | 20 / 4 |
| * | Multiplicação | 5 * 4 |
| % | Módulo | 20 % 6 |
| < | Menor que | 5 < 6 |
| <= | Menor ou igual a | 5 <= 6 |
| > | Maior que | 6 > 5 |
| >= | Maior ou igual a | 6 >= 5 |
| Invocação de função | Suporta funções. Para obter mais informações, consulte Lista de funções. | deviceId() |
| Expressão de propriedade JSON | Extrai propriedades do payload da mensagem usando expressões JSON. | state.desired.color,a.b.c[0].d |
| CASE … WHEN … THEN … ELSE …END | Expressão Case. Não suporta aninhamento. | CASE col WHEN 1 THEN 'Y' WHEN 0 THEN 'N' ELSE '' END as flag |
| IN | Suporta apenas enumerações. Subconsultas não são suportadas. | Por exemplo: where a in(1,2,3). O seguinte formato não é suportado: where a in(select xxx). |
| like | Corresponde a um caractere. Apenas o caractere curinga % é suportado, correspondendo a qualquer string. |
where c1 like '%abc' |
| not like | where c1 not like '%def%' |
Depurar instruções SQL
Se você definir Data Format como JSON ao criar uma regra de encaminhamento de dados, será possível depurar a instrução SQL online no console do IoT Platform. O procedimento é descrito a seguir.