Como construir uma arquitetura IIoT faça você mesmo

No ano passado, projetamos (e continuamos a apoiar) vários projetos de IIoT. Você já deve ter ouvido falar sobre a IIoT, mas, no caso, tentaremos explicar da maneira mais simples possível o que é e por que é interessante para desenvolvedores, arquitetos e administradores de soluções altamente carregadas.



A IoT - a Internet das coisas - envolve o controle de dispositivos projetados para executar tarefas domésticas simples (abra a porta da garagem quando o carro parar, acenda a luz usando um sensor ou comando de movimento, monitore a temperatura ambiente) e, em seguida, sob a IIoT - a Internet industrial das coisas - geralmente há tendo em vista a “digitalização” dos dados das indústrias, com base nas quais análises especializadas podem ser realizadas, geralmente com a ajuda do aprendizado de máquina.


Por exemplo, você pode coletar e analisar dados de motores rotativos para aprender sobre falhas no tempo e economizar em reparos. Substituir uma turbina completamente quebrada é muito mais caro do que um reparo oportuno. Outro exemplo é a mineração de carvão. A análise de dados sobre a composição do ar nas minas permite que você responda a tempo de exceder os valores permitidos. Isso ajuda a evitar situações de risco de vida para os mineiros.


O fluxo de dados - dos sensores nos campos, das máquinas industriais, dos sensores de gás - vai para os agregados de hubs e, além disso, para a plataforma de processamento e análise de dados.


Queremos falar sobre a aparência de uma arquitetura, como coletar e analisar dados de maneira bastante simples, e nos concentrarmos nas especificidades de aplicativos individuais. Contaremos com traduções de artigos em inglês e nossa própria experiência em design. Este artigo está traduzido com nossas explicações e adições.


No primeiro artigo, tentaremos criar uma arquitetura IIoT, na qual transmitiremos ainda mais os dados dos sensores e depois os transferiremos para um sistema que fornece processamento, análise, aprendizado de máquina e monitoramento dos dados recebidos.


Arquitetura criada


Freqüentemente, na IoT industrial, não há acesso direto aos sensores e sistemas de controle; portanto, um gateway é usado para conectar os níveis OT (tecnologia operacional) e TI (tecnologia da informação).


Assim, a arquitetura IIoT geralmente inclui: dispositivos finais, gateways, hubs regionais e, finalmente, sistemas de processamento e armazenamento de informações.


A arquitetura criada deve oferecer uma oportunidade:


  • Colete dados dos sensores para o gateway
  • Transferir dados para a nuvem ou data center
  • Atualizar automaticamente configurações de gateway
  • Manter transferência e processamento seguros de dados

Na imagem: arquitetura do sistema e software criados que usaremos para construí-lo em cada nível.



Os sensores coletam dados e os enviam para o gateway usando uma variedade de protocolos com e sem fio (Serial, RS-485, MODBUS, barramento CAN, OPC UA, BLE, WiFi, etc.). Em nosso exemplo, teremos em mente que os dados chegam ao gateway via Wi-Fi.


Como gateway, usaremos o Raspberry Pi, no qual o intermediário Mosquitto e o agente MiNiFi serão lançados. Mosquitto é um broker de mensagens leve e de código aberto que usaremos para transmitir dados a partir de sensores usando o protocolo MQTT. O MQTT adiciona uma sobrecarga mínima e, portanto, é conveniente para uso na IoT quando os recursos de hardware dos dispositivos finais são limitados (por exemplo, telefones e microcontroladores são usados).


Apache MiNiFi - um subprojeto Apache NiFi - um agente leve que implementa a funcionalidade principal do Apache NiFi, projetado especificamente para coletar dados em dispositivos finais.


O MiNiFi é compacto, utiliza minimamente os recursos e permite o gerenciamento centralizado de todos os agentes. Ele se conecta facilmente ao NiFi usando o Site-to-Site (S2S), o que permite criar um controle completo do fluxo de dados - escalável, seguro e com uma ideia clara de todos os estágios da transferência de informações.


Em nosso sistema, o MiNiFi se inscreverá em todos os tópicos do broker Mosquitto e encaminhará cada mensagem ao NiFi definido no nível regional. Você também pode usá-lo para conectar-se a um sistema SCADA ou qualquer outra fonte de dados OT.


No nível regional, existem dois componentes:


O Apache NiFi é um poderoso sistema de gerenciamento de fluxo de dados que suporta mais de 200 conectores. Uma interface gráfica permite projetar rápida e facilmente fluxos de dados.


O NiFi não sacrifica o poder pela simplicidade. É um sistema distribuído bem escalável, com entrega garantida, contrapressão (a capacidade de armazenar dados antes de enviá-los para outros sistemas mais lentos) e balanceamento de carga. Essa funcionalidade faz do NiFi uma excelente ferramenta para aplicativos de IoT que geralmente funcionam em ambientes de rede instáveis.


Em nosso sistema, o NiFi é um centro de coleta de dados que os redireciona para vários sistemas e aplicativos (HDFS, HBase, Kafka, S3 etc.).


O MiNiFi C2 Server (Comando e Controle do MiNiFi) é outro subprojeto do Apache NiFi que ainda está em desenvolvimento. Seu papel é ser o ponto central da configuração de centenas e milhares de agentes de MiNiFi que estão em produção no campo (várias salas, fábricas, territórios). O servidor C2 gerencia as configurações de fluxo MiNiFi (na terminologia C2 - classe de aplicativos com versão) e as publica por meio da API Rest. Os agentes MiNiFi podem se conectar a essa API em uma determinada frequência para atualizar sua própria configuração.


Então, vamos começar a criar nosso protótipo.


Contrato de Nome de Domínio


Para configurações adicionais dos vários sistemas que devem entrar em contato, vamos concordar com os nomes de domínio que usaremos nas configurações.


#  Apache NiFi      192.168.0.20 nifi.iot.local #  Apache MiNiFi C2     MiNiFi 192.168.0.20 minifi-c2.iot.local #raspberry pi,      Apache MiNiFi  MQTT  192.168.0.68 iot-hub-1.iot.local 

Preparação para Raspberry Pi: MQTT e MiNiFi


Para instalar o broker MQTT Mosquitto e o agente MiNiFi, execute os seguintes comandos no seu Raspberry Pi.


Por padrão, o MiNiFi contém um conjunto mínimo de manipuladores de dados. É possível adicionar manipuladores adicionais do kit NiFI adicionando um arquivo NAR (arquivo NiFi) ao diretório da biblioteca.


Com o último comando, adicionamos o manipulador NAR MQTT.


 sudo apt-get update #install and run Mosquitto broker on default port 1883 sudo apt-get install mosquitto mosquitto #install and prepare MiNiFi agent wget http://apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-0.4.0-bin.tar.gz tar -xvf minifi-0.4.0-bin.tar.gz cd minifi-0.4.0 #add mqtt processor wget https://github.com/ahadjidj-hw/NiFi/raw/master/nifi-mqtt-nar-1.5.0.nar -P ./lib/ 

Agora vamos instalar o servidor de gerenciamento de configuração MiNiFi C2 no servidor que estará disponível com o Raspberry Pi


Instalação e configuração do servidor MiNiFi C2.


Instale o servidor MiNiFi C2 em um servidor público que estará disponível com os agentes do MiNiFi. Você pode usar a distribuição hierárquica de servidores C2 para infraestruturas de rede complexas, conforme descrito abaixo. Execute o seguinte comando para instalar o servidor C2:


 wget http://apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-c2-0.4.0-bin.tar.gz tar -xvf minifi-c2-0.4.0-bin.tar.gz cd minifi-c2-0.4.0 

  • O servidor C2 publicará a configuração organizada da classe. O C2 suporta "provedores de configuração" conectáveis:
  • O CacheConfigurationProvider, que atualiza a configuração com base na configuração especificada no sistema de arquivos ou no S3
  • O DelegatingConfigurationProvider, que passa a delegação para outro servidor C2 para criar estruturas hierárquicas de servidores C2.
  • O NiFiRestConfigurationProvider, que remove modelos dos servidores Apache NiFi por meio de sua API REST.

Vamos configurar o servidor C2 para usar o NiFi como um provedor de configuração. Edite o arquivo ./conf/minifi-c2-context.xml, descomente o bloco xml


 <bean class="org.apache.nifi.minifi.c2.provider.nifi.rest.NiFiRestConfigurationProvider"> 

e anote o endereço do servidor NiFi ( http: //nifi.iot.local: 8080 )


 <constructor-arg> <value>http://nifi.iot.local:8080/nifi-api</value> </constructor-arg> 

Outras configurações do MiNiFi no Raspberry Pi


Por padrão, para adicionar manipuladores e suas configurações, você precisa editar a configuração ./conf/config.yml. A configuração também pode ser escrita manualmente ou criada usando a GUI do Apache NiFi, seguida pela exportação da configuração como um modelo. Um modelo é um arquivo XML que deve ser convertido em um arquivo de configuração YML do MiMLiFi usando o kit de ferramentas do MiNiFi. Aqui está um exemplo de arquivo de configuração que monitora o arquivo no dispositivo e encaminha cada nova linha para o NiFi usando o protocolo S2S.


Para o nosso projeto, não usaremos o ajuste manual. De fato, se houver muitos agentes MiNiFi, não será fácil parar manualmente, editar o config.yml e reiniciar o agente sempre que a configuração for alterada.


O MiNiFi usa o Change Ingestor, com o qual o agente aprende sobre as novas configurações possíveis. O Change Ingestor é um plug-in e há três ChangeIngestor que são suportados originalmente pelo MiNiFi.


  • FileChangeIngestor
  • RestChangeIngestor
  • PullHttpChangeIngestor

Usaremos o PullHttpChangeIngestor para acessar periodicamente o servidor C2 e baixar a nova configuração. Para configurar este Ingestor, você precisa editar o arquivo ./conf/bootstrap.conf, descomente as linhas correspondentes e defina as seguintes configurações:


 nifi.minifi.notifier.ingestors=org.apache.nifi.minifi.bootstrap.configuration.ingestors.PullHttpChangeIngestor # Hostname on which to pull configurations from nifi.minifi.notifier.ingestors.pull.http.hostname=minifi-c2.iot.local # Port on which to pull configurations from nifi.minifi.notifier.ingestors.pull.http.port=10080 # Path to pull configurations from nifi.minifi.notifier.ingestors.pull.http.path=/c2/config # Query string to pull configurations with nifi.minifi.notifier.ingestors.pull.http.query=class=iot-minifi-raspberry-agent # Period on which to pull configurations from, defaults to 5 minutes if commented out nifi.minifi.notifier.ingestors.pull.http.period.ms=60000 

Com essa configuração, cada agente MiNiFi acessará o servidor C2 usando o protocolo API REST em http: //minifi-c2.iot.local: 10080 / c2 / config a cada minuto e solicitará uma nova configuração para a classe iot-minifi-raspberry-agent
Um ponto importante: a frequência de 1 minuto é configurada apenas para demonstração. Em um ambiente de produção, você provavelmente não precisará atualizar agentes com essa frequência.


Antes de iniciar o agente, vamos para o nível de controle e configure o servidor MiNiFi C2 e o próprio Apache NiFi.


Instalando e configurando um servidor NiFi


Instale o servidor NiFi acessível no servidor C2 e inicie-o.


 wget http://apache.crihan.fr/dist/nifi/1.6.0/nifi-1.6.0-bin.tar.gz tar -xvf nifi-1.6.0-bin.tar.gz cd nifi-1.6.0 ./bin/nifi.sh start 

Conecte-se à interface NiFi em http: // nifi-dev: 8080 / nifi / e crie um fluxo que será executado nos agentes MiNiFi, mas antes disso adicione a Porta de entrada (adicionada pressionando o botão Porta de entrada no menu) na camada raiz e nomeie-a de Raspberry MiNiFi. É aqui que o NiFi receberá arquivos de fluxo do MiNiFi.


Adicione Funil e conecte a Porta de Entrada ao Funil - em artigos futuros, abordaremos o processamento de dados no lado Apache NiFi.


Inclua um consumeMQTT do processador para assinar o broker do Mosquitto e inscreva-o em todos os tópicos iot / sensores / * observe que tcp: // raspberrypi: 1883 é equivalente a tcp: // localhost: 1883, pois esse encadeamento será executado no Raspberry Pi



Use o Processor UpdateAttribute para adicionar o atributo "version", que usaremos para notificar o sistema sobre a reconfiguração. Você pode adicionar atributos adicionais: registro de data e hora, local, nome do agente etc.



Por fim, adicione o Remote Process Group (RPG) - para enviar eventos recebidos ao NiFi. Combine todos os três desses processos.



Seu stream agora deve aparecer na captura de tela abaixo. O fluxo esquerdo será iniciado no próprio Apache NiFi e receberá dados do Apache MiNiFi. O encadeamento do lado direito não será iniciado no Apache Nifi, criado para fins de configuração e prototipagem, e será executado no Raspberry Pi.



Salve o fluxo correto como um modelo chamado "iot-minifi-raspberry-agent.v1". O princípio de nomeação é extremamente importante aqui. Devemos usar o mesmo nome que o nome da classe usado na configuração do MiNiFi.


É muito importante - você precisa destacar não apenas os componentes armazenados, mas também os relacionamentos entre eles.



Colocação e lançamento do aplicativo


Antes de iniciar os agentes MiNiFi no Raspberry Pi, vamos verificar se o servidor C2 está configurado corretamente. Abra o URL no seu navegador: http: // c2-server: 10080 / c2 / config? Class = iot-minifi-raspberry-agent & version = 1 O servidor C2 deve responder com um arquivo que contém a configuração do modelo que criamos no formato YML.



Se, em vez da configuração, o servidor lançar Java Exception, você encontrará um problema no servidor C2 mencionado aqui:
https://github.com/apache/nifi-minifi/pull/126#issuecomment-388856304
Você precisará instalar a versão 0.3.0 ou remover o arquivo javax.ws.rs-api-2.1.jar da pasta lib do diretório do servidor C2.


Se você observar os logs do servidor C2, poderá ver que o servidor aceitou a solicitação com os parâmetros {class = [agente-minifi-raspberry-iot], versão = [1]}



Agora que a conexão entre os componentes da arquitetura individual (MQTT, MiNiFi, NiFi e C2) foi estabelecida, inicie o agente MiNiFi no Raspberry Pi usando o comando:


 ./bin/minifi.sh start 

Após alguns segundos, você deverá ver os logs do servidor C2. O host 192.168.1.50 (no nosso caso, o endereço IP do dispositivo Raspberry Pi) solicitou ao servidor C2 que fornecesse a versão mais recente da classe “iot-minifi-raspberry-agent”. Em comparação com a nossa solicitação anterior, que fizemos no navegador, você pode observar que o MiNiFi não indicou a versão. Se você abrir a configuração do agente MiNiFi em ./conf/config.yml, verá a mesma configuração que recebemos no navegador, definindo a solicitação manualmente.



O MQTT mostra que o agente MiNiFi se conectou ao broker e se inscreveu nos tópicos iot / sensores / #



Controle de transmissão


Ótimo, agora vamos fazer com que nossos sensores comecem a gerar dados e publicá-los no MQTT. O MiNiFi começará a enviar informações e enviar para o NiFi, conforme mostrado na captura de tela abaixo.


Importante: Para que o componente Apache NiFi comece a funcionar, você deve clicar no botão Reproduzir.


Agora, vamos dar uma olhada em uma dessas postagens dentro do NiFi. As informações são provenientes do sensor “iot / sensores / LightIntensity / z”, versão do aplicativo - 1



Atualização da configuração do MiNiFi


Agora que nossa infraestrutura está funcionando e os dados estão indo para o nosso "centro de dados", vamos instalar uma nova configuração MiNiFi. Vá para a interface Apache NiFi e edite o manipulador updateAttribute. Altere o atributo "version" para 2 em vez de 1 e salve o novo modelo "iot-minifi-raspberry-agent.v2". Isso é tudo. A nova configuração será implantada automaticamente.


Você pode ver os logs do servidor C2 e ver que uma nova versão do V2 foi detectada, o servidor não o encontrou no cache e o carregou.



Então o MiNiFi descobre a nova configuração, reserva a configuração anterior, descarrega a nova e reinicia:



No próximo artigo, falaremos sobre como montamos os sensores e os incorporamos à nossa arquitetura. Depois disso, falaremos sobre análise de dados.

Source: https://habr.com/ru/post/pt415933/


All Articles