O que é MQTT e como ele se enquadra na indústria

Message Queue Telemetry (MQTT) é um protocolo de troca de mensagens projetado para um baixo consumo de rede sendo hoje um dos protocolos mais utilizados em dispositivos de baixo processamento conectados a uma rede de computadores.
Introdução
MQTT foi projetado para ser um protocolo de mensagens de baixo consumo de rede e recursos de hardware idealizado na decada de 90 pela IBM e Eurotech, em 1999 com a motivação de criar um sistema de monitoramento de oleodutos criou-se a primeira versao do protocolo MQTT.
Em 2013 ja na versão 3.1, os criadores do protocolo atribuiram a OASIS, uma organização sem fins lucrativos de gestão de tecnologias open sources, a sua manutenção e evolução.
Atualmente a versão 5.0 é a mais recente tendo sua especificação disponibilizada pela OASIS. Mesmo tendo a versão atual trazendo consigo uma série de melhorias, a versão mais utilizada atualmente é a 3.1.1, pois é a versão que esta a mais tempo estável e operando no mercado e possui uma maior quantidade de brokers compatíveis. Um fato intrigante sobre as versões do protocolo MQTT é a ausência da versão 4, este fato deu-se na forma pela qual o protocolo MQTT gerencia a sua versão na estrutura de troca de mensagens. Para entendermos o real motivo precisamos entender um pouco mais a fundo como o protocolo MQTT organiza as messages para serem trafegadas.
MQTT Protocol
Tendo que o MQTT é um protocolo layer 7 (application layer) uma de suas funções é encapsular as mensagens que serão trafegadas utilizando a estrutura definida pela especificação e entregar estas para a camada inferior.
Internamente no protocolo MQTT todas as operacoes sao “envelopadas” em um formato denominado MQTT Control Package, é por meio deste formato que o MQTT realiza todas as etapas da comunicação. A baixo temos uma imagem ilustrando o formato padrão do MQTT Control Package, vale resaltar que todas as trocas de mensagens que são realizadas no MQTT utilizam este mesmo formato porem em alguns momentos não se faz necessario a utilização de todos os elementos contidos na especificação.
Como pode-se ver o primeiro elemento do control package é um cabeçalho fixo, este cabeçalho é composto basicamente por apenas dois bytes como pode ser observado na figura a baixo:
O cabecalho variável pode ser composto de ate 10 bytes, abaixo segue um exemplo do header variável no momento do estabelecimento da conexão.
Pode-se observar que o byte 7 contem o valor do level, e neste exemplo apresentado esta indicando level (4), este valor representa a versão do protocolo que ser utilizado para a traca das mensagens após a conexão ser estabelecida, o valor apresentado esta relacionado a versão 3.1.1. Entre a versão 3.0 e a versão 3.1.1 em função de alterações que foram feitas na forma em que é gerenciado o envio e o recebimento das mensagens foi preciso incrementar o level de para 4 mesmo ainda estando na versao 3 e é justamente por este motivo da ausência da versão 4 do protocolo MQTT.
MQTT Protocol
O design do protocolo MQTT utiliza-se da arquitetura de Pulish/Subiscrebe, sendo o publisher o responsavel por enviar/publicar dados e o subscriber quem deseja receber estes dados quando publicados. Para poder habilitar este mecanismo de troca de mensagens utilizando Pub/Sub faz-se necessário a utilização de uma peça de software denominada Broker. O Broker MQTT é um serviço que pode ser hospedado/executado pelo proprio cliente ou contratado em uma plataforma SaaS como por exemplo: AWS, HiveMQ, EMQx, dentre outras.
Pode-se entender o Broker MQTT como sendo um concentrado e roteador de mensagens, ele é o responsavel por receber e entregar todas as mensagens para todos os clientes para qual a mensagem é destinada. As figuras abaixo ilustram como a comunicação é estabelicida entre um cliente e o Broker.
Como pode-se observar na figura, os clientes estabelecem uma conexão com o Broker e apartir deste momento o cliente esta habilidade a publicar e subscrever em tópicos para receberem mensagens.
O topico é um mecanismo para segregar as mensagens que são publicadas, algumas literaturas representam os topicos como sendo namespaces podendo ter uma representação simbólica com relação sobre onde o dado foi gerado/coletado, exemplo de um topico: “empresa/planta/setor/equipamento/temperatura”. Como pode-se perceber o tópico é separado por um indentificador “/”, este identificador tem como função segregar o topico em blocos lógicos que podem ser utilizados juntamente com alguns wildcards viabilizando um mecanismo de subscrição inteligente. Seguindo o exemplo apresentado, caso um cliente MQTT tenha a necessidade de receber todas as mensagens enviadas de um setor da empresa, este cliente pode subescrever-se no seguinte topico: “empresa/+/setor/#”. Tendo que o wildcard “+” aceita qualquer valor que estiver contido no bloco lógico em questao e o wildcard “#” habilita todos os demais blocos lógicos posteriores.
MQTT no contexto industrial
Atualmente uma das maiores aplicações para IoT é no ambiente industrial onde dispositivos conectados na internet ajudam as indústrias a entenderem o comportamento dos equipamentos na linha de produção, localizar ativos, identificar e prever falhas em equipamentos dentro outras aplicações. Porem estruturar um projeto de IIoT nao é uma tarefa fácil, a decisão mais difícil a ser tomada é como os dados gerados serão disponibilizados de forma segura, distribuída e com uma integração generica possibilitando que qualquer sistema da indústria possa consumir os dados.
Uma solução largamente utilizada atualmente na indústria para habilitar a interconectividade entre sistemas é o MQTT, pois com o MQTT viabilizamos um ponto central de acesso onde os dados podem ser enviados e qualquer cliente com as devidas permissões pode conectar e consumir estes dados. Porem mesmo utilizando o MQTT facilmente pode ocorrer débitos técnicos nas definições da estrutura das mensagens e da estrutura dos topicos a ser utilizada. Em 2016 a Cirrus Link Solutions criou a primeira release da especificação MQTT Sparckplub como sendo uma solução para os problemas citados anteriormente.
O MQTT Sparkplug é uma especificação de interoperabilidade que fornece aos clientes MQTT a estrutura para integrar dados de fontes industriais na infraestrutura MQTT de maneira bidirecional e interoperável. Hoje a especificação é mantida pela Eclipse Foundation e gerenciada pelo Sparckplug Working Group.
Sparkplug Specification auxilia no projeto da infraestrutura IIoT trazendo consigo as seguintes vantagens: Single source of truth, Decoupled data, immediate discovery, inherited security, state awareness entre outros. A figura a seguir exemplifica o quão complexo são as integrações entre sistemas existentes em uma indústria:
Em seguida tem-se como estas integracoes podem ser simplificados utitilizando MQTT juntamente com a especificação Sparckplug:
Conclusão
Desde sua concepção até os dias atuais o MQTT vem sendo utilizado largamente na indústria para viabilizar a comunicação entre dispositivos e extendendo sua utilização em aplicações de IoT e IIoT provando o quao relevante é a tecnologia para o seguimento. A utilização do MQTT com a especificação Sparkplug mostra ser uma ferramenta muito robusta para auxiliar as indústrias no seu processo de digitalização e integração com dispositivos inteligentes, abrindo as portas para a indústria 4.0.