introdução
O protocolo MQTT é um protocolo leve de transmissão de mensagens projetado para aplicativos IoT. É simples, aberto e fácil de implementar, tornando-o ideal para aplicações IoT. Os dados MQTT são transmitidos de maneira contínua em tempo real, o que é muito adequado para processamento por mecanismos de processamento de fluxo.
O EMQX é um IoT MQTT Broker distribuído em grande escala, que pode conectar dispositivos IoT maciços de forma eficiente e confiável e processar e distribuir mensagens e dados de fluxo de eventos em tempo real. eKuiper é um mecanismo de processamento de fluxo de código aberto que pode filtrar, transformar e agregar dados de fluxo.
Este artigo mostrará como usar o mecanismo de processamento de fluxo em tempo real eKuiper para processar dados MQTT do EMQX.
descrição da cena
Suponha que tenhamos um tópico MQTT demo/sensor
para receber dados de temperatura e umidade no EMQX. Esperamos usar o eKuiper para assinar este tópico e usar a tecnologia de processamento de fluxo para processar e analisar os dados. Então, com base nos resultados da análise, podemos acionar o serviço HTTP do usuário ou salvar os resultados em um armazenamento externo.
EMQX
Como o EMQX suporta o protocolo MQTT padrão, o eKuiper pode se conectar a qualquer versão do EMQX. Aqui, usamos o MQTT Broker público gratuito fornecido pela EMQX Cloud para teste:
conjunto | endereço do cluster | porta de escuta |
---|---|---|
emqx1 | broker.emqx.io |
1883 |
Kuiper
O eKuiper pode ser implantado na borda ou na nuvem. Podemos usar Docker
a instalação rápida.
docker run -p 9081:9081 -d --name kuiper -e MQTT_SOURCE__DEFAULT__SERVER=tcp://broker.emqx.io:1883 lfedge/ekuiper:1.10.0
Podemos usar este comando para extrair e executar a imagem do docker da versão eKuiper 1.10.0. Definimos a porta da API REST para 9081, neste tutorial, usaremos a API REST para gerenciar o eKuiper. Também apontamos o endereço padrão do MQTT Broker para o cluster EMQX Cloud por meio de variáveis de ambiente.
Se você deseja instalar o eKuiper usando outros métodos, verifique o guia de instalação .
EMQX ECP (Plataforma EMQX Edge-to-Cloud) é uma plataforma MQTT avançada especialmente criada para colaboração de ponta na nuvem. Ele fornece uma interface de usuário da Web profissional para você gerenciar o eKuiper de maneira conveniente. Neste tutorial, você também pode usar o ECP para gerenciar o eKuiper. Para obter mais detalhes, consulte a documentação do ECP .
Configure o eKuiper para assinar o fluxo de dados MQTT
Os dados MQTT são dados de streaming contínuos e ilimitados. No eKuiper, utilizamos o conceito de streams para mapear esse tipo de dado. Para processar dados MQTT, primeiro criamos um fluxo para descrever os dados.
Usamos a API REST do eKuiper para criar um stream:
POST http://127.0.0.1:9081/streams
Content-Type: application/json
{
"sql": "CREATE STREAM demoMqttStream (temperature FLOAT, humidity FLOAT) WITH (TYPE=\"mqtt\", DATASOURCE=\"demo/sensor\", FORMAT=\"json\", SHARED=\"true\")"
}
O envio da solicitação acima com um cliente HTTP, como o Postman, criará um demoMqttStream
fluxo nomeado como uma fonte de dados do tipo MQTT. datasource
O valor da propriedade é demo/sensor
, o que significa assinar o tópico do MQTT demo/sensor
. O formato dos dados é JSON. SHARED
A opção indica que esse fluxo pode ser compartilhado por todas as regras.
Nota :
Quando executamos o contêiner docker eKuiper, o endereço do MQTT Broker é padronizado como
tcp://broker.emqx.io:1883
. Se você estiver usando outro MQTT Broker, substitua-o pelo endereço do seu Broker durante a instalação.Se desejar alterar o endereço do MQTT Broker ou outros parâmetros de conexão MQTT, como configuração relacionada à autenticação, você pode modificar
data/mqtt_souce.yaml
as configurações no arquivo.Você pode se inscrever em vários tópicos com
+
curingas e usar esses curingas no atributo. Por exemplo, inscreva-se em todos os tópicos que começam com . é assinar todos os tópicos começando com e todos os subtópicos abaixo de .#
datasource
demo/+
demo/
demo/#
demo/
demo/
Dados MQTT de processamento de fluxo
No eKuiper, usamos regras para definir o fluxo de trabalho do processamento de fluxo. As regras são instruções SQL que especificam como os dados são processados e as ações a serem executadas após o processamento. Além do processamento contínuo de dados, os mecanismos de processamento de fluxo, como o eKuiper, também oferecem suporte ao processamento dinâmico. Demonstraremos dois exemplos de processamento de fluxo e processamento de estado.
Regras de alerta de estado
O primeiro exemplo de processamento de fluxo é monitorar os dados de temperatura e umidade e acionar um alarme se a temperatura subir acima de 0,5 ou a umidade subir acima de 1. Isso requer que o mecanismo de processamento seja capaz de lembrar o estado dos dados anteriores e compará-los com os dados atuais.
Suponha que temos um http://yourhost/alert
webhook HTTP com URL para receber dados de alarme. Começamos criando uma regra com a seguinte solicitação HTTP.
###
POST http://{
{host}}/rules
Content-Type: application/json
{
"id": "rule1",
"sql": "SELECT temperature, humidity FROM demoMqttStream WHERE temperature - LAG(temperature) > 0.5 OR humidity - LAG(humidity) > 1",
"actions": [{
"rest": {
"url": "http://yourhost/alert",
"method": "post",
"sendSingle": true
}
}]
}
A solicitação acima cria uma rule1
regra chamada , e a instrução SQL correspondente à regra é a seguinte:
SELECT temperature, humidity
FROM demoMqttStream
WHERE
temperature - LAG(temperature) > 0.5
OR humidity - LAG(humidity) > 1
Este SQL demoMqttStream
seleciona os dados de temperatura e umidade cuja variação atende às nossas condições. LAG
A função é usada para obter os dados anteriores.
actions
Os atributos especificam ações quando uma regra é acionada. Aqui, usamos rest
a ação para enviar dados para http://yourhost/alert
. Os dados filtrados pelo SQL são enviados no formato JSON. Então, os dados enviados são assim:
{
"temperature": 25.5,
"humidity": 60.5
}
regras de teste
Podemos usar MQTTX ou outros clientes MQTT para publicar dados MQTT no demo/sensor
tópico. As regras processam esses dados. Por exemplo, enviamos os seguintes dados para o tópico:
{"temperature": 25.5, "humidity": 60.5}
{"temperature": 26.1, "humidity": 62}
{"temperature": 25.9, "humidity": 62.1}
{"temperature": 26.5, "humidity": 62.3}
Receberemos os seguintes dados no serviço de alerta HTTP:
{"temperature": 26.1, "humidity": 62}
{"temperature": 26.5, "humidity": 62.3}
Isso porque somente na 2ª e 4ª mensagens, a temperatura sobe mais de 0,5 ou a umidade sobe mais de 1.
Regras de agregação de janela de tempo
O segundo exemplo é calcular a média de temperatura e umidade a cada minuto e enviar de volta para a EMQX. Isso envolve um conceito clássico de processamento de fluxo chamado janelas de tempo. Podemos criar uma regra com a seguinte solicitação HTTP.
###
POST http://{
{host}}/rules
Content-Type: application/json
{
"id": "rule2",
"sql": "SELECT
trunc(avg(temperature), 2) as avg_temperature, trunc(avg(humidity), 2) as avg_humidity, window_end() as ts FROM demoMqttStream GROUP BY TumblingWindow(mi, 1)",
"actions": [{
"mqtt": {
"server": "tcp://broker.emqx.io:1883",
"topic": "result/aggregation",
"sendSingle": true
}
}]
}
A solicitação acima cria uma rule2
regra chamada , e a instrução SQL correspondente à regra é a seguinte:
SELECT
trunc(avg(temperature), 2) as avg_temperature,
trunc(avg(humidity), 2) as avg_humidity,
window_end() as ts
FROM demoMqttStream
GROUP BY TumblingWindow(mi, 1)
Este SQL selecionará as médias de temperatura e umidade para cada minuto. A janela de tempo é definida GROUP BY
com a cláusula TumblingWindow
. Esse tipo de janela divide os dados MQTT em janelas de tamanho fixo. Na SELECT
cláusula, usamos a função agregada avg
para calcular a temperatura e a umidade médias dentro da janela de tempo. window_end()
A função é usada para obter o horário final da janela de tempo, para que possamos saber a que período correspondem essas médias. trunc
para arredondar a média para duas casas decimais.
actions
Os atributos especificam ações quando uma regra é acionada. Aqui, usamos mqtt
a ação para enviar dados para o tópico do EMQX result/aggregation
. Os dados filtrados pelo SQL são enviados no formato JSON. Então, os dados enviados para o tópico são esses:
{
"avg_temperature": 25.5,
"avg_humidity": 60.5,
"ts": 1621419600000
}
regras de teste
Da mesma forma, podemos usar MQTTX ou outros clientes MQTT para publicar dados MQTT no demo/sensor
tópico. As regras processam esses dados. Por exemplo, enviamos um dado para o tópico a cada 30 segundos, e os dados de dois minutos são os seguintes:
{"temperature": 25.5, "humidity": 60.5}
{"temperature": 26.1, "humidity": 62}
{"temperature": 25.9, "humidity": 62.1}
{"temperature": 26.5, "humidity": 62.3}
Receberemos os seguintes dados no serviço de alerta HTTP:
{"avg_temperature": 25.8, "avg_humidity": 61.25, "ts": 1621419600000}
{"avg_temperature": 26.2, "avg_humidity": 62.2, "ts": 1621419660000}
Enviamos dados por dois minutos, então obtemos duas médias por minuto.
epílogo
Neste tutorial, aprendemos como usar o eKuiper para processar dados MQTT. Com este tutorial, você será capaz de:
- Receba dados MQTT assinando o tópico EMQX MQTT Broker
- Crie regras para lidar com dados MQTT
- Feedback dos dados processados para EMQX Broker
Demonstramos os recursos de streaming do eKuiper para dados MQTT com dois exemplos. Os poderosos recursos de processamento de fluxo do eKuiper podem ser aplicados a uma variedade de fontes de dados de fluxo. Você está convidado a explorar várias funções do eKuiper e construir um canal de processamento de dados MQTT eficiente e em tempo real.
Declaração de direitos autorais: Este artigo é original da EMQ, indique a fonte para reimpressão.
Link original: https://www.emqx.com/zh/blog/mqtt-stream-processing-with-emqx-and-ekuiper