MQTT

MQTT(Message Queuing Telemetry Transport) é um protocolo de comunicação máquina para máquina (M2M - Machine to Machine) com foco em Internet of Things (IoT) que funciona em cima do protocolo TCP/IP. Um sistema MQTT se baseia na comunicação entre cliente e servidor, em que o primeiro pode realizar tanto “postagens” quanto “captação” de informação e o segundo administra os dados a serem recebidos e enviados. Para isso, é utilizado um Paradigma chamado Publish-Subscribe, que será melhor explicado nos próximos tópicos. O protocolo se popularizou pela simplicidade, baixo consumo de dados e pela possibilidade comunicação bilateral.


Como Surgiu

Nos anos 90 a IBM criou o protocolo MQTT. Sua origem se deu à necessidade de um protocolo simples e leve que conseguisse comunicar várias máquinas entre si, uma comunicação que ocorreria utilizando microcontroladores para a obtenção de dados que tivesse uma taxa de transmissão leve para a comunicação entre as máquinas e os sensores.

Devido à tão importante funcionalidade de “criar uma conexão” entre pequenos sensores e as máquinas onde esses dados serão tratados, o MQTT é visto como uma das principais tecnologias que podem tanto participar quanto impulsionar o desenvolvimento de uma nova “rede”, a chamada Internet das Coisas (IoT), que já está mostrando sua importância há muito tempo e, com certeza, ganhará ainda mais foco nos próximos anos.


Publish-subscribe

Para entendermos o padrão Publish-Subscribe, iremos compará-lo com os padrões Request-Response e Observer.

No padrão Request-Response nós possuímos dois atores: Cliente e Servidor. Nesse protocolo o servidor fica o tempo todo ouvindo requisições que podem chegar dos seus cliente, porém ele estabelece uma conexão apenas temporária com o servidor, a medida que for realizando as requisições e obtendo as respostas, após isso a conexão é quebrada e o cliente não será notificado de nenhuma modificação.

...
Figura 1 - Mensagens no Padrão Resquest-Responde. Fonte: https://ubidots.com/blog/top-3-online-tools-for-simulating-http-requests/

No padrão Observer possuímos dois atores principais: os observadores (observer) e o sujeito (subject). Os observadores irão realizar uma requisição para se inscrever no subject e dessa forma ser notificado quando houver alguma mudança de estado, o sujeito irá possuir uma lista dos seus observadores para que ele saiba para quem enviar as notificações quando houver a mudança de estado. Caso não seja mais interessante ao sujeito enviar informações para um observador específico ou o observador não se interessa mais pelo estado do sujeito, a inscrição pode ser desfeita.

...
Figura 2 - Mensagens no Padrão Observer. Fonte:https://medium.com/elp-2018/observe-the-observer-design-pattern-3b9a84fd559c

O Padrão Publish-Subscribe é muito parecido com o padrão Observe, porém nesse caso adicionamos o papel do Broker, que é responsável por filtrar as mensagens e saber exatamente para quem enviar. Dessa forma, o publisher e subscriber não precisam se conhecer diretamente e apenas precisam conhecer o Broker, que é quem fará a notificação da mudança de estados e enviará essa informação para aqueles que tiverem inscritos no tópico referenciado. Por fim, o publish precisa se preocupar apenas com enviar as informações e estabelecer a conexão exclusivamente com o Broker.

É comum em alguns casos os sistemas terem atuações tanto de Publisher quanto de Subscriber. Considerando um caso de sistema que possui um sensor de temperatura e está ligado a um ar-condicionado e um sistema que acompanha a temperatura e envia o sinal para ligar o ar, os dois terão as duas situações, considerando que o sistema 1 precisa publicar as mudanças de temperatura e receber o sinal para ligar o ar, enquanto o sistema 2 precisa receber as informações da temperatura e enviar o sinal para ligar o ar.

...
Figura 3 - Mensagens no Padrão Publish-Subscribe. Fonte:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c

Como funciona

...
Figura 5 - Exemplo de conexão MQTT com QoS-0 e flag de armazenamento da mensagem. Fonte: https://commons.wikimedia.org/wiki/File:MQTT_protocol_example_without_QoS.svg

Como usar o protocolo MQTT

Assim como já foi comentado, o protocolo MQTT é principalmente utilizado em aplicações de IoT, devido a sua simplicidade e facilidade de implementação. Além de aplicações de IoT, alguns usos muito comuns são para a obetenção de dados em tempo real.

Podemos citar o exemplo apresentado no tópico acima "Como funciona", onde o protocolo MQTT é utilizado para se obter informações da temperatura e nível de umidade do solo. Caso o solo esteja pouco úmido e a temperatura esteja alta, por exemplo, o sistema de irrigação será ativado.

Os usos desse protocolo depende apenas da criatividade do desenvolvedor. Podem ser criados sistemas de controle de mercadorias, automação de processos, controle de fluxo de pessoas, controle para eficiência energética, entre muitos outros.

Como começar a usar o protocolo MQTT

Atualmente existem inúmeras implementações tanto para brokers como para clientes MQTT em diversas linguagens, tais como Python, JavaScript, C#, entre outros. Podemos encontrar facilmente várias dessas implementações na internet, sendo boa parte delas open source e de fácil acesso e download pelo público.

Uma dessas implementações é o broker Mosquitto. Sendo um dos brokers mais utilizados atualmente devido à sua simplicidade e facilidade de implementação, esta tecnologia open source ganhou um grande espaço no mercado de IoT por estar intimamente relacionado com o protocolo MQTT.

Nós utilizaremos o Mosquitto para exemplificar alguns métodos e mostraremos também como instalá-lo e como começar a implementá-lo em uma aplicação real. Caso você tenha interesse em outros exemplos de Brokers, listaremos ao final algumas opções que podem ser utilizadas.

O "Mosquitto" pode ser facilmente baixado para vários sistemas operacionais. Os arquivos de download podem ser encontrados na página oficial do broker, na aba de downloads. Ao baixar o broker escolhido, este vai ser utilizado para rodar o servidor onde o sistema e o relacionamento entre os clientes e o broker será hospedado.

A partir deste momento já é possível testar seu broker. Este teste pode ser realizado pelo próprio prompt de comando do computador, onde podem ser feitas as inscrições de clientes em certos tópicos. Ao mesmo tempo, caso você já possua uma aplicação web é possível relacioná-la ao seu broker (ao seu servidor), adicionando a aplicação tanto como um cliente subscriber como um cliente publisher.

Como já foi citado anteriormente, vários sistemas podem ser utilizados como clientes deste protocolo. Podemos utilizar sensores, que pegariam alguns dados do ambiente e os enviariam pro broker, por exemplo. Podemos usar um RaspberryPi, que pegaria esses dados do broker - que foram enviados pelos sensores - para controlar alguma máquina. Também podemos ter um sistema, como foi apontado acima, que usaria esses mesmos dados enviados ao broker pelos sensores, mas com um objetivo que pode ser diferente ou não do RaspberryPi.

Outros tipos de Brokers




Qualidade de serviço

No protocolo MQTT nós temos 3 qualidades de serviço(QoS) e cada conexão com o broker pode especificar qual será utilizada., sendo estas: "no máximo uma vez", "no mínimo uma vez" e "exatamente uma vez".


Vantagens

Em relação às vantagens, três ficam muito claras, o baixo consumo de memória, baixa necessidade de processamento para o envio de mensagem e baixo consumo de banda. Como o publisher não envia a informação direto para os subscribers, ele não precisa guardar a informação de todos os seus subscritores e nem precisa fazer várias envios de informação(uma para cada subscriber).

Apenas é necessário que ele realize um envio de informação para o broker com a informação que ele quer que seja enviada daquele tópico, dessa forma o processamento realizado e o consumo de memória do Publisher pode ser reduzido. Além disso, o header de uma mensagem no protocolo MQTT é muito menor do que um Header no protocolo HTTP, o que economiza muito o consumo de banda.


Perguntas

Quais as vantagens do MQTT sobre o HTTP?

As vantagens são: baixo consumo de memória, a baixa necessidade de processamento para o envio de mensagem e o baixo consumo de banda. A primeira referente a necessidade de armazenar apenas a informação dos brokers que estão conectados e os tópicos e ao envio de pacotes pequenos, considerando que o mqtt possui um header mais enxuto.

Explique o paradigma Publish-subscribe.

Nesse paradigma possuímos três papéis, o broker, o publisher e o subscriber. Nesse paradigma o Publisher enviará mensagens referentes a tópicos, o subscribe irá assinar tópicos para receber mensagens sobre ele e o Broker receberá as mensagens dos publishers e será responsável em enviar as mensagens para os subscribers que tenham interesse nesse assunto específico.

Explique o papel do Broker, dos clientes subscribers e dos clientes publishers.

O Broker é um intermediador entre os clientes do protocolo. É ele quem vai receber as informações de um cliente publisher e vai enviar essa informação aos clientes subscribers inscritos no tópico referente àquela informação. O Cliente Publisher é aquele que capta uma informação e a envia ao broker. Um exemplo seria um sensor, que envia os dados captados (como temperatura), ao broker que, por sua vez, enviará esse dado aos clientes subscribers. Cliente Subscriber é o cliente que recebe uma informação do broker. Ele deve se inscrever em tópicos definidos pelo broker, cada um sobre uma certa informação, que por sua vez foi captada por um cliente publisher. Vale dizer que o cliente pode ser, ao mesmo tempo, publisher e subscriber, ou seja, enviar e consumir dados ao/do broker.

Quais são as QoS (qualidade de serviço) disponíveis no protocolo e como são caracterizadas?

São 3 qualidades de serviço. Sendo o QoS=0, envio de mensagem pelo no máximo uma vez, QoS=1,envio de mensagem pelo menos uma vez e QoS=2, envio de mensagem exatamente uma vez.

Qual o tamanho do header fixo do MQTT?

2 bytes


Conclusões

O MQTT se mostra um ótimo protocolo para ser utilizado em serviços que não precisam de muita informação sendo enviada e não precisam de um histórico sendo guardado das modificações. Por ser fácil de implementar e por enviar informações pequenas, se mostra uma ótima opção dentro do mercado de IoT, já que não é necessário muita banda nem muito processamento para que a comunicação ocorra. Dessa forma, conseguimos ter um bom resultado em situações em que precisamos de soluções de baixo custo e em situação com conexões não muito boas. Hoje em dia com Brokers gratuitos e a facilidade de implementar esse tipo de conexão, fica ainda mais fácil de testar esse tipo de serviço e implementar em projetos.

No geral o MQTT mostra uma vantagem clara em relação ao HTTP, porém em algumas situações será encontrando um gargalo em relação ao MQTT. Considerando que a conexão dos clientes ao broker são conexões contínuas, que não são fechadas até o cliente se desconectar, podem haver situações onde temos várias conexões abertas em paralelo no mesmo roteador e devido às limitações desse roteador, podemos observar um congestionamento da rede, algo que não aconteceria com o HTTP já que as conexões são abertas apenas para verificar se houve uma modificação e logo em seguida é fechada, evitando assim que muitas conexões permaneçam abertas simultaneamente.

No geral saber qual é o melhor protocolo a ser usado é uma decisão de projeto que varia para cada situação, cada protocolo tem suas vantagens e desvantagens, assim recomendamos que seja avaliada a situação de acordo com os gargalos que podem ser apresentados utilizando cada tipo de protocolo e os custos referentes a utilização e aquele que obtiver os melhores dados seja escolhido.


Bibliografia

Redes de Computadores I - EEL878 - 2019.1

Departamento de Eletronica - Escola Politecnica UFRJ

Tema: MQTT

Alunos: Renan Neri, Matheus Lomba e Gabriel Bulhões

"Este trabalho foi totalmente produzido pelos autores que declaram não terem violado os direitos autorais de terceiros, sejam eles pessoas físicas ou jurídicas. Havendo textos, tabelas e figuras transcritos de obras de terceiros com direitos autorais protegidos ou de domínio público tal como idéias e conceitos de terceiros, mesmo que sejam encontrados na Internet, os mesmos estão com os devidos créditos aos autores originais e estão incluídas apenas com o intuito de deixar o trabalho autocontido. O(s) autor(es) tem(êm) ciência dos Artigos 297 a 299 do Código Penal Brasileiro e também que o uso do artifício de copiar/colar texto de outras fontes e outras formas de plágio é um ato ilícito, condenável e passível de punição severa. No contexto da Universidade a punição não precisa se restringir à reprovação na disciplina e pode gerar um processo disciplinar que pode levar o(s) aluno(s) à suspensão;"