Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Hub IoT fornece uma poderosa linguagem semelhante ao SQL para recuperar informações sobre gêmeos de dispositivos, gêmeos de módulos, trabalhos e roteamento de mensagens. Este artigo apresenta:
- Uma introdução aos principais recursos da linguagem de consulta do Hub IoT, e
- A descrição detalhada da língua. For more information about query language for message routing, see IoT Hub message routing query syntax.
For specific examples, see Queries for IoT Hub device and module twins or Queries for IoT Hub jobs.
Nota
Alguns dos recursos mencionados neste artigo, como mensagens de nuvem para dispositivo, gêmeos de dispositivo e gerenciamento de dispositivos, estão disponíveis apenas na camada padrão do Hub IoT. Para obter mais informações sobre as camadas básica e padrão/gratuita do Hub IoT, consulte Escolha a camada e o tamanho certos do Hub IoT para sua solução.
Executar consultas do Hub IoT
Você pode executar consultas em seu hub IoT diretamente no portal do Azure.
- Entre no portal do Azure e navegue até seu hub IoT.
- Selecione Consultas na seção Gerenciamento de dispositivos do menu de navegação.
- Introduza a sua consulta na caixa de texto e selecione Executar consulta.
Você também pode executar consultas em seus aplicativos usando os SDKs e APIs de serviço do Azure IoT.
For example code implementing IoT Hub queries, see the Query examples with the service SDKs section.
For links to SDK reference pages and samples, see Azure IoT Hub SDKs.
Noções básicas de uma consulta do Hub IoT
Cada consulta do Hub IoT consiste em cláusulas SELECT e FROM, com cláusulas opcionais WHERE e GROUP BY.
Queries are run on a collection of JSON documents, for example device twins. A cláusula FROM indica a coleção de documentos a ser iterada ( devices, devices.modules ou devices.jobs).
Em seguida, o filtro na cláusula WHERE é aplicado. Com agregações, os resultados desta etapa são agrupados conforme especificado na cláusula GROUP BY. Para cada grupo, uma linha é gerada conforme especificado na cláusula SELECT.
SELECT <select_list>
FROM <from_specification>
[WHERE <filter_condition>]
[GROUP BY <group_specification>]
Cláusula SELECT
A cláusula SELECT <select_list> é necessária em todas as consultas do Hub IoT. Ele especifica quais valores são recuperados da consulta. Ele especifica os valores JSON a serem usados para gerar novos objetos JSON. Para cada elemento do subconjunto filtrado (e opcionalmente agrupado) da coleção FROM, a fase de projeção gera um novo objeto JSON. Este objeto é construído com os valores especificados na cláusula SELECT.
Por exemplo:
Retornar todos os valores
SELECT *Retornar propriedades específicas
SELECT DeviceID, LastActivityTimeAgregar os resultados de uma consulta para retornar uma contagem
SELECT COUNT() as TotalNumber
Currently, selection clauses different than SELECT are only supported in aggregate queries on device twins.
A sintaxe a seguir é a gramática da cláusula SELECT:
SELECT [TOP <max number>] <projection list>
<projection_list> ::=
'*'
| <projection_element> AS alias [, <projection_element> AS alias]+
<projection_element> :==
attribute_name
| <projection_element> '.' attribute_name
| <aggregate>
<aggregate> :==
count()
| avg(<projection_element>)
| sum(<projection_element>)
| min(<projection_element>)
| max(<projection_element>)
Attribute_name refere-se a qualquer propriedade do documento JSON na coleção FROM.
FROM clause
A cláusula FROM <from_specification> é necessária em todas as consultas do ioT Hub. Deve ser um de três valores:
- devices to query device twins
- devices.modules to query module twins
- devices.jobs to query job per-device details
Por exemplo:
Retrieve all device twins
SELECT * FROM devices
WHERE clause
A cláusula WHERE <filter_condition> é opcional. Ele especifica uma ou mais condições que os documentos JSON na coleção FROM devem satisfazer para serem incluídos como parte do resultado. Qualquer documento JSON deve avaliar as condições especificadas como "true" para ser incluído no resultado.
Por exemplo:
Retrieve all jobs that target a specific device
SELECT * FROM devices.jobs WHERE devices.jobs.deviceId = 'myDeviceId'
The allowed conditions are described in the Expressions and conditions section.
GROUP BY clause
A cláusula GROUP BY <group_specification> é opcional. Esta cláusula é executada após o filtro especificado na cláusula WHERE e antes da projeção especificada na cláusula SELECT. Ele agrupa documentos com base no valor de um atributo. Esses grupos são usados para gerar valores agregados conforme especificado na cláusula SELECT.
Por exemplo:
Retornar a contagem de dispositivos que estão a relatar cada estado de configuração de telemetria.
SELECT properties.reported.telemetryConfig.status AS status, COUNT() AS numberOfDevices FROM devices GROUP BY properties.reported.telemetryConfig.status
Currently, the GROUP BY clause is only supported when querying device twins.
Atenção
O termo group é atualmente tratado como uma palavra-chave especial em consultas. In case, you use group as your property name, consider surrounding it with double brackets to avoid errors, as shown in this example: SELECT * FROM devices WHERE tags.[[group]].name = 'some_value'.
A sintaxe formal para GROUP BY é:
GROUP BY <group_by_element>
<group_by_element> :==
attribute_name
| < group_by_element > '.' attribute_name
Attribute_name refere-se a qualquer propriedade do documento JSON na coleção FROM.
Paginação dos resultados da consulta
Um objeto de consulta é instanciado com um tamanho máximo de página menor que ou igual a 100 registos. To obtain multiple pages, call the nextAsTwin on Node.js SDK or GetNextAsTwinAsync on .NET SDK method multiple times. Um objeto de consulta pode expor vários valores Next, dependendo da opção de desserialização exigida pela consulta. For example, a query object can return device twin or job objects, or plain JSON when using projections.
Expressões e condições
At a high level, an expression:
- Evaluates to an instance of a JSON type (such as Boolean, number, string, array, or object).
- É definido pela manipulação de dados provenientes do documento JSON do dispositivo e constantes usando operadores e funções incorporadas.
Conditions are expressions that evaluate to a Boolean. Qualquer constante diferente de Boolean true é considerada como falsa. Esta regra inclui null, undefined, qualquer objeto ou instância de matriz, qualquer string e o Boolean false.
A sintaxe das expressões é:
<expression> ::=
<constant> |
attribute_name |
<function_call> |
<expression> binary_operator <expression> |
<create_array_expression> |
'(' <expression> ')'
<function_call> ::=
<function_name> '(' expression ')'
<constant> ::=
<undefined_constant>
| <null_constant>
| <number_constant>
| <string_constant>
| <array_constant>
<undefined_constant> ::= undefined
<null_constant> ::= null
<number_constant> ::= decimal_literal | hexadecimal_literal
<string_constant> ::= string_literal
<array_constant> ::= '[' <constant> [, <constant>]+ ']'
Para entender o que significa cada símbolo na sintaxe das expressões, consulte a tabela a seguir:
| Símbolo | Definição |
|---|---|
| nome_do_atributo | Qualquer propriedade do documento JSON na coleção FROM . |
| operador binário | Qualquer operador binário listado na seção Operadores . |
| function_name | Qualquer função listada na seção Funções . |
| decimal_literal | Um número flutuante expresso em notação decimal. |
| hexadecimal_literal | Número expresso pela cadeia «0x» seguida de uma cadeia de algarismos hexadecimais. |
| string_literal | Cadeias de caracteres Unicode representadas por uma sequência de zero ou mais caracteres Unicode ou sequências de escape. String literals are enclosed in single quotes or double quotes. Escapes permitidos: \', \", \\, \uXXXX para caracteres Unicode definidos por quatro dígitos hexadecimais. |
Operadores
Os seguintes operadores são suportados:
| Família | Operadores |
|---|---|
| Arithmetic | +, -, *, /, % |
| Lógico | AND, OR, NOT |
| Comparação | =, !=, <, >, <=, >=, <> |
Funções
When querying twins and jobs the only supported function is:
| Function | Descrição |
|---|---|
| IS_DEFINED(property) | Returns a Boolean indicating if the property is assigned a value (including null). |
Em condições de rotas, as seguintes funções matemáticas são suportadas:
| Function | Descrição |
|---|---|
| ABS(x) | Devolve o valor absoluto (positivo) da expressão numérica especificada. |
| EXP(x) | Devolve o valor exponencial da expressão numérica especificada (e^x). |
| POTÊNCIA (x,y) | Retorna o valor da expressão especificada para a potência especificada (x^y). |
| SQUARE(x) | Devolve o quadrado do valor numérico especificado. |
| CEILING(x) | Retorna o menor valor inteiro maior ou igual à expressão numérica especificada. |
| FLOOR(x) | Retorna o maior inteiro menor ou igual à expressão numérica especificada. |
| SIGN(x) | Devolve o sinal positivo (+1), zero (0) ou negativo (-1) da expressão numérica especificada. |
| SQRT(x) | Retorna a raiz quadrada do valor numérico especificado. |
In routes conditions, the following type checking and casting functions are supported:
| Function | Descrição |
|---|---|
| AS_NUMBER | Converte a cadeia de caracteres de entrada em um número.
noop if input is a number; Undefined if string doesn't represent a number. |
| IS_ARRAY | Retorna um valor booleano que indica se o tipo da expressão especificada é uma matriz. |
| IS_BOOL | Retorna um valor booleano que indica se o tipo da expressão especificada é booleano. |
| IS_DEFINED | Returns a Boolean indicating if the property is a value. Esta função é suportada apenas quando o valor é um tipo primitivo. Os tipos primitivos incluem string, booleano, numérico ou null. DateTime, object types, and arrays aren't supported. |
| IS_NULL | Retorna um valor booleano indicando se o tipo da expressão especificada é null. |
| IS_NUMBER | Retorna um valor booleano que indica se o tipo da expressão especificada é um número. |
| IS_OBJECT | Retorna um valor booleano indicando se o tipo da expressão especificada é um objeto JSON. |
| IS_PRIMITIVE | Retorna um valor booleano que indica se o tipo da expressão especificada é uma primitiva (string, booleana, numérica ou null). |
| IS_STRING | Retorna um valor booleano que indica se o tipo da expressão especificada é uma cadeia de caracteres. |
Em condições de rotas, as seguintes funções de cadeia de caracteres são suportadas:
| Function | Descrição |
|---|---|
| CONCAT(x, y, ...) | Retorna uma cadeia de caracteres que é o resultado da concatenação de dois ou mais valores de cadeia de caracteres. |
| LENGTH(x) | Retorna o número de caracteres da expressão de cadeia de caracteres especificada. |
| LOWER(x) | Retorna uma expressão de cadeia de caracteres depois de converter dados de caracteres maiúsculos em minúsculas. |
| UPPER(x) | Retorna uma expressão de cadeia de caracteres depois de converter dados de caracteres minúsculos em maiúsculas. |
| SUBSTRING(string, start [, length]) | Retorna parte de uma expressão de cadeia de caracteres começando na posição baseada em zero do caractere especificado e continua até o comprimento especificado ou até o final da cadeia de caracteres. |
| INDEX_OF(string, fragment) | Retorna a posição inicial da primeira ocorrência da segunda expressão de cadeia de caracteres dentro da primeira expressão de cadeia de caracteres especificada, ou -1 se a cadeia de caracteres não for encontrada. |
| STARTS_WITH(x, y) | Retorna um booleano indicando se a primeira expressão de cadeia de caracteres começa com a segunda. |
| ENDS_WITH(x, y) | Retorna um Boolean indicando se a primeira expressão de cadeia de caracteres termina com a segunda. |
| CONTAINS(x,y) | Retorna um Boolean indicando se a primeira expressão de cadeia de caracteres contém a segunda. |
Query examples with the service SDKs
Exemplo de C#
The query functionality is exposed by the Azure IoT Hub service SDK for .NET in the RegistryManager class.
Aqui está um exemplo de uma consulta simples:
var query = registryManager.CreateQuery("SELECT * FROM devices", 100);
while (query.HasMoreResults)
{
var page = await query.GetNextAsTwinAsync();
foreach (var twin in page)
{
// do work on twin object
}
}
The query object is instantiated with the parameters mentioned in the Query results pagination section. Várias páginas são recuperadas chamando os métodos GetNextAsTwinAsync várias vezes.
Node.js exemplo
The query functionality is exposed by the Azure IoT Hub service SDK for Node.js in the Registry object.
Aqui está um exemplo de uma consulta simples:
var query = registry.createQuery('SELECT * FROM devices', 100);
var onResults = function(err, results) {
if (err) {
console.error('Failed to fetch the results: ' + err.message);
} else {
// Do something with the results
results.forEach(function(twin) {
console.log(twin.deviceId);
});
if (query.hasMoreResults) {
query.nextAsTwin(onResults);
}
}
};
query.nextAsTwin(onResults);
The query object is instantiated with the parameters mentioned in the Query results pagination section. Várias páginas são recuperadas chamando o método nextAsTwin várias vezes.
Próximos passos
- Saiba mais sobre o roteamento de mensagens com base nas propriedades ou no corpo da mensagem com a sintaxe de consulta de roteamento de mensagens do Hub IoT.
- Get specific examples of Queries for IoT Hub device and module twins or Queries for IoT Hub jobs.