IoT

MQTT (mosquito com Debian e MQTT Explorer)

Escrito por Douglas Baiocco. Publicado em IoT.

O que é MQTT?

MQTT é a sigla de Message Queuing Telemetry Transport. Ele é um protocolo de mensagens utilizado principalmente para IoT (Internet das Coisas). Desenvolvido inicialmente pela IBM no fim dos anos 90 para integrar sensores no ramo petrolífero e de satélites, tornou-se aberto em 2014.

A grande vantagem do uso deste protocolo sob os demais é a sua característica de ser leve e econômico, conseguindo bom desempenho, mesmo em redes ruins.

O MQTT funciona com um modelo de Publicação e Assinatura, em que um servidor centraliza as mensagens. Esse servidor é chamado de Broker. Os vários clientes consomem as mensagens.

Em inglês, chamamos de Subcriber (subscritor) e Publisher (publicador) os clientes que se conectam ao broker. Eles desempenham as funções básicas de comunicação entre as diversas entidades de uma rede MQTT. Podemos considerar, para exemplo, os Publishers como sensores, que enviam informações ao Broker e os Subscribers como clientes diversos que irão consumir as informações, como um interruptor eletrônico.

As informações enviadas para o Broker são chamadas de Tópicos e são divididas de acordo com as necessidades da rede. Podemos usar como exemplo de Tópicos, os diversos recursos organizados em uma casa automatizada. Veja abaixo:

  • ·         home/sala/temperatura
  • ·         home/sala/interruptor
  • ·         home/quarto/temperatura
  • ·         home/quarto/interruptor

Veja que temos diversos interruptores e diversos sensores publicados no Broker. Cada item da lista representa ou um Publisher ou um Subscriber. Podemos separar como Publishers os seguintes itens:

  • ·         home/sala/temperatura
  • ·         home/quarto/temperatura

Note que a temperatura é enviada para o Broker através dos sensores, portanto ela é publicada. Já os Subscribers são:

  • ·         home/sala/interruptor
  • ·         home/quarto/interruptor

Estes itens consomem a informação do Broker e acionam eventos de acordo com a programação interna. Um interruptor pode se tornar um Publisher se ele enviar o estado do interruptor para o Broker. Neste caso ele atuaria como um Subscriber e como um Publisher.

Como sempre, a teoria é sempre mais complicada. Vamos ver na pratica os princípios básicos do MQTT e aplicar alguns testes. Iremos instalar um broker e testar alguns comandos para verificar o funcionamento da comunicação.

Instalando o MQTT

Para os testes, irei utilizar uma VM Linux com Debian 10. Iremos instalar o Mosquitto, um broker MQTT muito utilizado no mundo OpenSource e iremos testar como usar este protocolo para nossos projetos.

No Debian 10, é necessário entrar no terminal (seja via SSH com putty ou mesmo usando o terminal dentro da VM). Tenha certeza de estar como root. Para instalar, use o seguinte comando:

#apt-get install mosquitto

E depois este:

#apt-get install mosquitto-clients

Testando

Com o Sistema instalado no servidor, podemos realizar alguns testes simples para entender como funciona este protocolo. O nosso broker está pronto para ser usado e precisamos, inicialmente, criar um tópico para podermos brincar. O comando para podermos visualizar as mensagens (o conteúdo dos tópicos) é o mosquito_sub (ou Mosquitto Subscriber). Use a seguinte linha de comando:

#mosquitto_sub -t "test"

Veja como vai ficar seu terminal:
image001

Note que o cursor ficou preso na linha abaixo. O parâmetro -t especificou em qual tópico o mosquito_sub se subscreverá. No nosso caso, no tópico “test”. O comando ficará esperando alguma mensagem ser publicada.

Para publicar uma mensagem, devemos usar um novo terminal. Abra um novo enquanto o terminal anterior ainda estiver aberto e digite o seguinte comando:

#mosquitto_pub -m "Mensagem" -t "test"

Veja o resultado do comando:
image002

Note que neste terminal não aconteceu nada, mas veja no outro, onde o mosquito_sub foi executado:
image003

Veja que a palavra “Mensagem” foi exibida logo abaixo. Isso significa que o Broker recebeu a mensagem no tópico “test” e o Subscriber conseguiu consumir e exibir a mensagem que foi enviada.

O comando mosquito_pub (Mosquitto Publisher) publica mensagens nos tópicos especificados. O parâmetro -m especifica a mensagem (Mensagem) e o parâmetro -t especifica qual é o tópico (test).

Com estes dois comandos, conseguimos identificar que o broker está aceitando Publishers e Subscriber. Mas o teste está limitado ao servidor. Tudo está acontecendo localmente. Para fazermos um teste mais completo, vamos ver o Mosquitto funcionando na rede.

Para este teste, iremos usar um software mais completo e com interface gráfica: o MQTT Explorer (http://mqtt-explorer.com/). Com este software, podemos acessar um broker e ver os tópicos, as mensagens e toda a estrutura de um Servidor MQTT.

Faça o download do software e abra-o. Na tela inicial, teremos que preencher os campos com os dados de nosso servidor, como o IP e a porta. Siga o exemplo da imagem abaixo. Clique em Connect.
image004

 

Veja como é a tela inicial do MQTT Explorer: você poderá ver toda a estrutura de tópicos do MQTT deste broker:
image005

 

Execute no terminal o comando anterior:

#mosquitto_pub -m "Mensagem" -t "test"

 

Veja o resultado no MQTT Explorer:
image006

Note que apareceu um novo tópico: “test”.

Note que ele contém o valor que colocamos no comando, que é “Mensagem”.

Podemos monitorar, portanto, as mensagens que são enviadas ao broker, debugando possíveis erros nas configurações dos agentes. Podemos também publicar mensagens em tópicos dentro da nossa estrutura, simulando um Publisher. Para isso, clique no tópico que criamos (“test”). Veja como ficará no MQTT Explorer:
image007

Na parte direita da janela, há uma aba chamada Publish. Veja que ao clicar sobre o tópico test, ele já preencheu o valor do campo Topic. Digite um valor qualquer na caixa de texto abaixo e clique em PUBLISH. Veja o resultado:
image008

 

Note agora que o Tópico “test” tem a mensagem que foi escrita no MQTT Explorer. Se você for mais saudosista e preferir ver isso acontecendo na interface de texto, execute o comando abaixo e depois faça o mesmo processo anterior no MQTT Explorer:

#mosquitto_sub -t "test"

Veja o resultado:
image009

Note que o resultado é mesmo: você verá a mensagem publicada no tópico pelo MQTT Explorer assim como usando o mosquito_pub.

Exemplo de uso real

O uso em uma situação real do MQTT Explorer pode ajudar bastante a identificar falhas nos diversos componentes de uma infraestrutura de IoT. Em minha casa por exemplo, veja os diversos componentes da minha rede MQTT na imagem abaixo. Eu explodi um dos tópicos (kitchen) para mostrar como os softwares se comportam em uso. Na primeira imagem, o tópico Kitchen se subdivide em:

·         Status

·         GPIO

·         Relay 

Cada um destes subtópicos tem uma finalidade na estrutura, como o status que identifica se o Publisher deste tópico está conectado. O GPIO (General Purpose Input/Output) é o tópico gatilho que dirá ao interruptor qual pino ele deverá acionar para ligar ou desligar e o Relay é o tópico que demonstra o estado atual em que está o interruptor. Todos estes itens são necessários para ligar ou desligar uma lâmpada na Cozinha. Na segunda imagem você verá os tópicos com alteração de estado (os valores estão agora com 1).

Veja que sem o software, a visualização da estrutura é muito mais difícil.
image010

image011

Melhorando a segurança

Com os testes efetuados, é bastante recomendável pensarmos em segurança para usar mais a fundo os recursos do MQTT. Para isso, vamos definir uma senha de acesso ao Mosquitto. Use o seguinte comando no terminal, onde o parâmetro -c expecifica o local do aqrquivo e o mqtt é o nome do usuário que será criado:

#mosquitto_passwd -c /etc/mosquitto/passwd mqtt

Digite a senha duas vezes. Veja abaixo como deve ficar:
image012

Agora vamos configurar um pouco a segurança, desabilitando o acesso anônimo e setando o arquivo que geramos no passo anterior como senha. Use o seguinte comando para abrir um novo arquivo:

#nano /etc/mosquitto/conf.d/default.conf

Coloque o seguinte conteúdo:

allow_anonymous false
password_file /etc/mosquitto/passwd

Ficará assim:
image013

Grave o arquivo e salve (CTRL+x e depois Y ou S).

Reinicie o mosquito com o comando a seguir:

#systemctl restart mosquitto

Testando com senha

Para efetuar os testes anteriores, agora você deve usar os seguintes comandos:

#mosquitto_sub -t "test" -u mqtt -P teste1

Note que agora definimos o nome do usuário (-u) e a senha para este usuário (-P).

 

O publisher segue o mesmo caminho:

#mosquitto_pub -m "Mensagem" -t "test" -u mqtt -P teste1

No MQTT Explorer deve ser informado o login e a senha na tela inicial de conexão, assim:
image014

 

Com isso, seu broker MQTT está funcionando e pronto para aprimoramentos.