Processamento de fluxo MQTT com EMQX e eKuiper: um tutorial rápido

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.

Processamento de fluxo MQTT com EMQX e eKuiper

descrição da cena

Suponha que tenhamos um tópico MQTT demo/sensorpara 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 Dockera 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 demoMqttStreamfluxo nomeado como uma fonte de dados do tipo MQTT. datasourceO valor da propriedade é demo/sensor, o que significa assinar o tópico do MQTT demo/sensor. O formato dos dados é JSON. SHAREDA 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.yamlas 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 .#datasourcedemo/+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/alertwebhook 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 rule1regra 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 demoMqttStreamseleciona os dados de temperatura e umidade cuja variação atende às nossas condições. LAGA função é usada para obter os dados anteriores.

actionsOs atributos especificam ações quando uma regra é acionada. Aqui, usamos resta 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/sensortó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 rule2regra 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 BYcom a cláusula TumblingWindow. Esse tipo de janela divide os dados MQTT em janelas de tamanho fixo. Na SELECTcláusula, usamos a função agregada avgpara 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. truncpara arredondar a média para duas casas decimais.

actionsOs atributos especificam ações quando uma regra é acionada. Aqui, usamos mqtta 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/sensortó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

Acho que você gosta

Origin blog.csdn.net/emqx_broker/article/details/131722962
Recomendado
Clasificación