Objetivo

            Em diversos projetos de IOT- Internet Of Things (Internet Das Coisas) é necessário que haja um monitoramento dos dados obtidos pelos sensores, uma das formas de fazer a transmissão desses valores é via Internet, sendo que para sua utilização é necessário o uso de um protocolo de comunicação , podendo esse ser o MQTT, sobre o qual explicaremos mais adiante, além de mostrarmos na prática como publicar e se inscrever em um tópico, esse tutorial será dividido em:

Introdução
Protocolo MQTT
Forma de comunicação
Qualidade da Mensagem (QoS)
Tópicos
Last Will
Clean
Retain
Sessões Persistentes
Broker Mosquitto
Cliente MQTTBox
Conclusão


Introdução

            É um fato que estamos na Era da Informação ou Era Digital, essa Era formou-se acima de um grande pilar conhecido como Internet, presente na maioria das formas de comunicação e transmissão de dados atuais, a Internet trouxe consigo o que foi nomeado pelo pesquisador do MIT, Kevin Ashton, em 2009, como Internet of Things. Nesse mesmo contexto foram inseridas as propostas de protocolos de comunicação IoT, sendo uma das principais o MQTT, desenvolvido pela IBM, o mesmo tornou-se um protocolo comum para a comunicação da Internet das Coisas.

            Para que um dispositivo receba a alcunha de IoT, é necessário que ele converse com outros dispositivos ou sensores através da internet, em razão disso, grandes empresas de tecnologia como a Google, a IBM, a Apple e outras, buscam formas de melhorar continuamente essa comunicação, tendo surgido dessa forma o Protocolo MQTT, um protocolo simples, leve e seguro de ser aplicado.
 

Protocolo MQTT

            O MQTT- Message Queue Telemetry Transport ( Transporte de Filas de Mensagem de Telemetria) é um Protocolo de Comunicação baseado na pilha TCP/IP, sendo extremamente útil para desenvolvimento de projetos de comunicação entre Máquina-Máquina (M2M), seu conceito de transmissão é do tipo Publicação/Assinatura, que será explicado mais adiante.

            Desenvolvido por Andy Stanford-Clark da IBM e Arlen Nipper em 1999, sua aplicação de origem consistia em monitorar sensores em oleodutos de petróleo através de satélites, o MQTT foi liberado ao público de forma gratuita no ano de 2010. Em 29 de outubro de 2014 o protocolo se tornou padrão OASIS- Organization for the Advancement of Structured Information Standards (Organização para o Avanço dos Padrões de Informação Estruturada). Atualmente o protocolo está em sua versão 5.0 (3 de abril de 2019), com melhorias no que tange o relatório de erros, as assinaturas compartilhadas, as propriedades da mensagem, expiração de mensagens, expiração da sessão, alias do tópico, função atraso na entrega e descoberta de funções permitidas.

            O MQTT apresenta inúmeras qualidades e vantagens com relação a outros protocolos como o HTTP, mostrando-se ideal para comunicação entre dispositivos remotos em razão de sua qualidade de serviço, maior nível de segurança, facilidade de implementação, baixa alocação de banda, bibliotecas compatíveis com diversas linguagens de programação, seu conceito de distribuição, níveis de serviço de acordo com relevância da mensagem, garantias de entrega, variações de envio de dados, sendo que um dado pode ser enviado para nenhum, um, ou vários clientes, entre outras qualidades que o tornam ideal para projetos IoT.



Forma de comunicação


Comunicação MQTT

            A publicação e recebimento de dados são feitos através de um servidor nomeado de Broker. Um cliente no papel de Pulicador ou Publisher, que é a pessoa que transmite a mensagem, escreve um tópico de destino da mensagem e o seu Payload (conteúdo da mensagem), essa mensagem então é transmitida ao Broker que será responsável por gerir e encaminhá-la ao Subscrito ou Subscriber previamente inscrito no tópico. Da mesma forma, quando um cliente quer se tornar um Subscrito em um determinado tópico, ele encaminha uma mensagem de solicitação ao Broker, que fará essa interligação entre cliente e tópico.

            Podemos simplificar em:

  • Publicador/ Publisher:  Quem envia dados para um tópico, emissor.
  • Subscrito/ Subscriber:  Pessoa que está inscrita no tópico e recebe os dados, receptor.
  • Broker: Intermédio de comunicação entre Publicador e Subscrito, responsável por receber, enfileirar e enviar as mensagens.
  • Payload: Conteúdo da mensagem enviada.
  • Cliente/Client: Elemento capaz de interagir com o Broker, seja para enviar, receber ou os dois.
  • Mensagem: Pacote de dados trocados entre Clientes e Broker.
  • Tópico: Endereço para o qual os dados serão encaminhados.
  • Unsubscribe: Deixar de assinar um tópico.

            Vale mencionar que um Cliente pode agir tanto como Publicador quanto Subscrito.

           Uma grande vantagem do MQTT é o uso do Broker, pois ele garante a segurança entre Publicador e Subscrito através da comunicação indireta entre ambos.



Qualidade da Mensagem (QoS)

           Nesse protocolo de comunicação as mensagens são definidas por qualidade, de forma a determinar os níveis de importância e necessidade de recebimento. A mensagem pode ser definida em três níveis diferentes, sendo eles:

QoS 0 (at most once)- A mensagem deve ser recebida no máximo uma vez, podendo ser recebida uma vez ou nenhuma, não há confirmação de recebimento.
QoS 1 (at least once)-
A mensagem deve ser recebida pelo menos uma vez, podendo uma mesma mensagem ser recebida uma ou mais vezes, há confirmação de entrega de uma mensagem.
QoS 2 (exactly once)-
A mensagem deve ser recebida uma única vez, confirmação de recebimento de uma única mensagem.

          Lembrando que não existe qualidade melhor ou pior, isso vai depender da finalidade da mensagem que será enviada.

          As pré-configurações da mensagem são definidas pelo Publicador e pelo Subscrito, sendo que cada um realiza as suas próprias configurações, podendo existir as seguintes situações:
Tabela QoS



Tópicos

             Um tópico é um endereço para qual uma mensagem será encaminhada, um Publicador cria o endereço e o Subscrito se inscreve naquele endereço para receber as informações, um Subscrito pode se inscrever em diversos tópicos simultâneos, enquanto um Publicador pode criar diversos tópicos e subtópicos de forma a organizar e categorizar as informações, assim como pastas no computador. Um cliente também pode publicar em um tópico, desde que o mesmo não seja restrito. Abaixo eu fiz um exemplo de tópicos de uma automação residencial, de forma a elucidar melhor a explicação.


Tópicos MQTT

 OBS: Devemos nos atentar ao uso de caracteres maiúsculos e minúsculos, existe essa diferenciação entre tópicos, um tópico ArCondicionado não é igual a um tópico arcondicionado.

         Eu criei o tópico do Ar Condicionado e criei subtópicos dos cômodos com ar condicionado, em seguida criei outro tópico dentro do subtópico para definir a informação que quero receber, se é de temperatura ou do estado do mesmo. Assim como quando crio pastas dentro de uma pasta no computador, seria como se eu tivesse uma pasta chamada de Ar Condicionado, e dentro dessa pasta houvessem duas pastas, uma chamada de Sala e outra de Quarto, dentro da Sala haveriam mais duas pastas, sendo de Temperatura e Estado, na pasta Quarto também haveriam duas pastas, igualmente de Temperatura e Estado. 
           O Diagrama de Venn dos tópicos que eu criei, pode ajudar na compreensão. 

Diagrama de Venn dos Tópicos
             Além disso, ainda existem caracteres curingas para inscrição de tópicos, sendo o + e o #. Ambos permitem a inscrição em mais de um tópico de forma simplificada, sem precisar se inscrever em cada um individualmente, sendo o + utilizado no meio do endereço do tópico, e a # no final, como segue o exemplo com base na tabela acima:

Iluminacao/# → Se assino esse tópico, eu atomaticamente assino todos os tópicos de iluminação, sendo que receberei as informações de:
Iluminacao/Sala
Iluminacao/Quarto
Iluminacao/Cozinha
Iluminacao/Banheiro
Iluminacao/Externa

            O mesmo aconteceria se eu assinasse:
ArCondicionado/# → Se eu assino esse tópico, eu automaticamente estou me inscrevendo em todos esses tópicos:
ArCondicionado/Sala/Estado
ArCondicionado/Sala/Temperatura
ArCondicionado/Quarto/Estado
ArCondicionado/Quarto/Temperatura

           O + é utilizado da seguinte forma:
ArCondicionado/+/Temperatura→ Se eu assino esse tópico, eu estarei me inscrevendo em todos os tópicos de Temperatura do Ar Condicionado, sendo esses:
ArCondicionado/Sala/Temperatura
ArCondicionado/Quarto/Temperatura

ArCondicionado/+/Estado→ Nesse caso eu estou me inscrevendo em todos os tópicos de Estado do Ar Condicionado
ArCondicionado/Sala/Estado
ArCondicionado/Quarto/Estado

           Um outro caractere utilizado é o $, ele é utilizado em tópicos especiais, os tópicos especiais são tópicos que:
-Não podem receber publicações de clientes;
-Não podem ser assinados por curingas;
-Não há formalização do seu uso;
         
           Sendo que tópicos inicializados por $SYS/ fornecem estatísticas internas do Broker, por exemplo: 

$SYS/broker/clients/total 
$SYS/broker/messages/sent
$SYS/broker/uptime


Last Will

            Outra configuração possível é a de Last Will ou Última Vontade, essa função pode ser configurada quando é desejável que uma mensagem seja encaminhada para o Broker caso a conexão de um cliente seja perdida, o Broker encaminhará a Last Will para todos os assinantes do tópico pré-selecionado pelo cliente. O teste de conexão é feito periodicamente pelo Broker, sendo a conexão detectada pela interação do cliente ou pelo Ping enviado para o Broker em uma fração de tempo.

Last Will: Última mensagem definida pelo cliente para o caso de perca de conexão.
Ping: Dados de conexão enviados ao Broker periodicamente.
Sessão: Período em que o cliente está conectado.
Keep alive:  Intervalo de tempo de teste de Ping.



Clean

            Ao ativar Clean, o usuário define que ao encerrar a sessão e depois retorná-la, todos os dados obtidos anteriormente ou no momento da desconexão não serão recebidos, a tela inicia-se vazia.



Retain

            O Retain trata-se da retenção de uma mensagem pelo Broker até que outra mensagem seja recebida, então quando um novo Cliente é Subscrito em um tópico, ele receberá a última mensagem enviada nesse tópico, até que outra a sobreponha.



Sessões Persistentes

            
Quando um cliente acessa uma sessão persistente e depois desconecta, todas as mensagens QoS não confirmadas e as novas mensagens QoS  1 publicadas nos tópicos no qual o mesmo está inscrito, são armazenadas pelo Broker, e ao se conectar novamente, o cliente recebe todas essas mensagens em uma taxa de 10 mensagens por segundo.

            Uma sessão persistente é criada quando o cliente encaminha uma mensagem de CONNECT  ao Broker, definindo o cleanSession como 0, caso já exista uma sessão persistente, o cliente é conectado a ela, caso ainda não exista, uma nova é criada.

Broker Mosquitto

            Para teste de envio e recebimento de mensagens, utilizaremos o broker gratuito chamado Mosquitto. O  Eclipse Mosquitto funciona como um intermediário entre mensagens de código aberto, sendo uma instância pública, ele implementa todas as versões do Protocolo MQTT, é leve e adequado ao uso em todos os dispositivos,  indo de computadores de baixa potência à servidores complexos, basta que sua URL seja inserida no host do programa.

test.mosquitto.org



Cliente MQTTBox

            Complementando o teste, usaremos o programa gratuito MQTTBox para a criação de clientes MQTT, ele viabiliza a conexão com diversos brokers Mqtt de forma simultânea, possibilita a publicação e inscrição em tópicos, além de disponibilizar outras configurações que serão demonstradas abaixo.
           
            Primeiramente, baixe e instale o programa que se encontra disponível no seguinte site:

http://workswithweb.com/mqttbox.html

            Ao acessar o site, clique em Download Apps

Download_MQTT_Site


            Feito isso, uma página será aberta para a seleção do seu Sistema Operacional, selecione-o.

Seleção de Sistema Operacional para baixar MQTT

           
           Depois de clicar, role o scroolbar até o fim da página e baixe o arquivo executável 
MQTTBox.exe

            Ao término do download e da instalação, abra o programa e crie um Cliente MQTT

Criar um cliente MQTT

           
            Uma janela será aberta para que façamos as configurações do nosso Cliente, inicialmente definiremos o nome do nosso Cliente MQTT em “MQTT Client Name”.

MQTT Client name

           
            Em seguida, definiremos o protocolo como mqt/tcp, esse é o protocolo utilizado pelo cliente MQTT para se conectar ao Broker, o MQTTBox suporta TCP, SSL/TLS, MQTT, MQTTs WebSockets (WS) e Secure WebSockets (WSS).

Protocol MQTT
           
            Em username é possível inserir seu nome de usuário, no entanto, como estamos usando um Broker público de teste, não é necessário se identificar para que ocorra a autorização de uso.


Username MQTT
           
            Essa definição se refere ao período em milissegundos entre duas reconexões, não realizaremos nenhuma alteração.


Reconect Period


            Em seguida tem a configuração do tópico que receberá a Last Will caso a conexão seja perdida, criaremos um tópico ou usaremos um pronto, caso queira criar, você pode usar o mesmo que usará para o Publicador mais adiante.

Will-topic



            Esse é o nosso ID de Cliente, ele é gerado de forma randômica pelo próprio programa, cada cliente possuí o seu próprio e único identificador. O Broker se utiliza do ID para identificar cada cliente e o seu estado de conexão, caso queira que o programa gere outro, clique nas setas que formam um círculo.
MQTT Client ID



            Colocaremos agora o host do Broker Mosquitto, conforme citado anteriormente:

test.mosquitto.org

Host MQTT


           Pela mesma razão de não colocarmos o usuário, também não tem necessidade de colocarmos a senha
Password MQTT

           
              A configuração abaixo representa o tempo limite de conexão em milissegundos, é o tempo de espera antes de um novo CONNACK do Broker, CONNACK é a resposta do Broker ao CONNECT enviado pelo cliente, também não realizaremos nenhuma alteração
Connect timeout

           
            Em Will-QoS definiremos a qualidade da Last Will.
Will- QoS


            Nessa opção selecionaremos se queremos que o MQTT anexe a hora e a data ao ID do Cliente, isso ajuda a evitar que um mesmo usuário crie Clientes com o mesmo ID.
Append timestamp to MQTT client id

            Em seguida é possível selecionar se você quer iniciar com uma Clean Session sempre que reconectar, se você quiser iniciar com uma Sessão Persistida, como explicado mais acima, desmarque essa opção.
Clean Session

            Depois selecionaremos se desejamos reagendar Pings, isso faz com que os Pings sejam reenviados com frequência para demonstrar conexão.
Reschedule Pings

            O KeepAlive é o intervalo em segundos do envio do ping ao Broker, não faremos alterações
KeepAlive
           
            Ao selecionar a opção Will-Retain, é definido que a Last Will é retida até que uma nova mensagem a subscreva.
Will-Retain

   
           
            Em "Broker is MQTT v3.1.1 compliant?" demarcaremos se o Broker é compatível com a versão MQTT v3.1.1        
Broker is MQTT v3.1.1 compliant?


            Ao deixarmos essa opção selecionada, o cliente é conectado automaticamente ao Broker quando é iniciado o programa.
Auto connect Broker


            Ao ativar essa opção, se a conexão entre Cliente e Broker for interrompida, todas as mensagens da fila de espera de qualidade 0 serão publicadas ao reestabelecer conexão
Queue outgoing QoS zero messages

            

           Nessa caixa e texto definiremos a Last Will para o caso de conexão interrompida.
Will-Payload


             Clique em "Save" para salvar o seu Client MQTT, atente-se se foi estabelecida uma conexão entre o seu Client e o Broker.
Conectado com o broker            Uma tela será aberta com o Publicador e o Subscrito
MQTT Client
              Caso seja do seu desejo criar mais publicadores ou mais subscritos, clique nas seguintes opções:
   Adiciona publicadorAdiciona Publicador
  Adiciona subscrito←Adiciona Subscrito

           Agora faremos as configurações de Publicador, primeiramente, escolha um tópico para publicar, caso o tópico ainda não exista, será criado um novo, eu vou criar o tópico "CurtoCircuito/Tutorial".

Topic to publish

            Em seguida será definida a qualidade da mensagem como explicado em Qualidade da mensagem, para a minha eu defini QoS 2, ou seja, a mensagem será recebida exatamente uma vez.
Publisher_QoS

            Ao selecionar Retain, a mensagem é retida, 
de acordo com o explicado em Retain, em seguida eu defino o Payload Type, no meu caso eu não vou fazer nenhuma alteração no que se refere ao tipo de mensagem.

Payload type

            Para finalizar a parte do Publicador, eu vou escrever a mensagem que desejo publicar, no entanto, a mensagem não será encaminhada para a janela ao lado (Subscribe) caso eu clique imediantamente em "Publish", pois o Subscribe ainda não se inscreveu em nenhum tópico, vamos nos inscrever no tópico antes de realizar a publicação.
Topic to subscribe

            Depois de colocar o endereço do tópico, definiremos qualidade da mensagem que será recebida pelo Subscrito, eu coloquei a mesma qualidade que usei como Publicador.
Subscriber QoS            
            Depois de clicar em Subscribe para se inscrever no tópico, clique em Publish para publicar a mensagem

Teste mensagem MQTT
           Caso queira cancelar a inscrição no tópico, clique no ícone laranja acima dele.
Cancela assinatura no tópico
           Ao acessar o Menu→MQTT CLIENTS, mais Clients podem ser criados para os seus projetos e testes, basta apenas repetir a etapa de criação de cliente.



Conclusão

           O Protocolo de Comunicação MQTT se mostra a melhor opção para uso da Internet em projetos IoT, suas qualidades são inúmeras, valendo mencionar a possibilidade de monitoramento de diversos sensores de forma simultânea, até o seu suporte de comunicação assíncrona e baixo deslocamento de banda, como apresentado no decorrer do tutorial. Com o teste utilizando a ferramenta MQTTBox e o Broker gratuito do Mosquitto fica mais simples compreender seu funcionamento e função do Publisher, Broker e Subscribe, sendo o Broker o intermediário de ambos, de forma a manter um contato indireto e consequentemente mais seguro para ambas as partes. No próximo tutorial nos aprofundaremos ainda mais nesse protocolo que é tão importante para projetos embarcados com conexão por internet.


Abraços, Equipe Curto Circuito :)