Broker MQTT com Raspberry PI Zero W 23

A Raspberry PI Zero W é uma placa e tanto! Já vimos aqui no blog uma série de projetos com ela, como robô que utiliza visão computacional, campainha IoT, streaming de vídeo e por aí vai. Mas esta placa pode ir além, podendo ser aplicada tranquilamente como servidores caseiros de pequeno porte. Isto leva a vantagens muito interessantes, como ter uma solução simples (de uma só placa), compacta (devido ao pequeno tamanho físico da placa) e móvel na sua casa (já que possui conectividade WI-FI à rede). É justamente nesse ponto que este artigo irá tocar: como transformar uma Raspberry PI Zero W em um pequeno servidor caseiro, no caso um broker MQTT (Mosquitto). Além disso, conectaremos nesse broker MQTT com Raspberry Pi o projeto da Planta IoT, outro projeto aqui do blog.

Material necessário

Para seguir este artigo, você precisará de:

IMPORTANTE: antes de partir para as instruções deste post, tenha certeza que a sua Raspberry PI Zero W está totalmente operacional (com cartão SD, com Raspbian instalado e conectividade à Internet operante). Se tem dúvidas de como fazer isso, sugiro fortemente a ler o nosso post sobre os primeiros passos com a Raspberruy PI e Linux.

Lembramos também que apesar deste projeto usar a Raspberry Pi Zero W, para montar o seu projeto de Broker MQTT com Raspberry Pi você pode usar qualquer uma das outras placas da linha Raspberry, ok?

Broker MQTT – o que é?

Conforme dito neste artigo do blog, o broker funciona como servidor em uma comunicação MQTT. Ou seja, ele é o responsável por enviar e receber mensagens dos clientes MQTT e gerenciar suas conexões. Em outras palavras, ele compõe a “central de comunicação” MQTT. Observe a figura 1.

Broker MQTT com Raspberry Pi Zero W
Figura 1 – diagrama de uma comunicação MQTT

Pelo fato do protocolo MQTT ter baixo uso de banda e um Broker não exigir muito processamento e memória do sistema que o roda, a Raspberry PI Zero W é uma ótima opção para isso.
Neste post, será utilizado um broker MQTT chamado Mosquitto, um broker MQTT open-source da comunidade open-source Eclipse.

Instalação do Broker MQTT Mosquitto na Raspberry PI Zero W

Antes de tudo, é uma boa ideia fazer update dos repositórios do seu gerenciador de pacotes e upgrade dos seus pacotes já instalados. Para isso, execute os comandos abaixo:

sudo apt-get update
sudo apt-get upgrade

Feito isso, o broker MQTT Mosquitto pode ser instalado na sua Raspberry PI Zero W com o comando abaixo:

sudo apt-get install mosquitto

Ao término da instalação, o broker MQTT Mosquitto já está instalado e rodando como um serviço Linux!

Configuração de um hostname para a Raspberry PI Zero W

Agora será feito algo muito útil para o uso e testes com o broker MQTT que roda na Raspberry: a configuração de um hostname para a Raspberry PI Zero W.
Grosso modo, o hostname serve para podermos nos conectar de forma mais intuitiva à Raspberry PI Zero W, utilizando na conexão o hostname ao invés do IP. Como o IP pode ser dinâmico (DHCP), configurar um hostname não é só cômodo como também é produtivo. Para isso, siga o passo-a-passo abaixo:

  1. No terminal Linux / console, acesse o programa de configuração da Raspberry PI Zero W com o seguinte comando:
    sudo raspi-config
  2. No programa de configuração, busque pela configuração hostname e acesse-a.
  3. Nela, configure um nome amigável como hostname. Não pode haver espaços nem caracteres especiais (ou seja, somente letras e números são permitidos).
    Como sugestão, coloque o nome rasppizerow.
  4. Vá até a opção “Ok” e depois em “Finish”.
  5. Será solicitado que a Raspberry PI Zero W seja reiniciada. Clique em Ok e aguarde que a Raspberry PI Zero W complete o processo de reboot.

Após o reboot da Raspberry PI Zero W, do seu computador (que deve estar na mesma rede que a Raspberry PI Zero W) faça um ping em NOME_QUE_VOCE_CONFIGUROU_NO_HOSTNAME.local (onde NOME_QUE_VOCE_CONFIGUROU_NO_HOSTNAME será , se você seguiu minha sugestão de nome, rasppizerow). Você notará que o ping terá resposta, significando que o hostname foi configurado com sucesso.

Teste do broker MQTT com Raspberry Pi

Uma vez configurado um hostname para a Raspberry PI Zero W, podemos prosseguir para o teste do broker MQTT com Raspberry PI Zero W. Para testa-lo, utilize um computador ou smartphone que esteja na mesma rede que sua Raspberry PI e instale um client MQTT (para computadores, sugiro o MQTTLens e, para smartphones Android, sugiro o aplicativo MyMQTT).

No cliente MQTT de sua escolha, coloque como endereço do broker rasppizerow.local e como porta o valor 1883. Feito isso, você notará que o client MQTT se conectou ao broker que está rodando na sua Raspberry PI Zero W, comprovando portanto seu funcionamento. Como teste adicional, ainda usando o cliente MQTT, publique e faça subscribe em um mesmo tópico e verifique que o publish e subscribe ocorrem sem problemas. Observe a figura 2.

Figura 2 - broker local na Raspberry PI Zero W em operação
Figura 2 – broker local na Raspberry PI Zero W em operação

Com isso, seu broker MQTT local está pronto para uso!

Utilizando o projeto da Planta IoT neste broker

Visando mostrar uma das várias possibilidades de uso deste broker MQTT local, o projeto da Planta IoT será aqui integrado. Tal projeto é dividido em quatro partes / posts, sendo o terceiro post o qual se faz uso de MQTT (para acessar este post, clique aqui). As mensagens MQTT neste projeto sevem para transmitir, de forma periódica (com tempo definido no código-fonte), a umidade do solo medida.

Portanto, ao invés da informação da umidade de solo ser publicada a nível global (utilizando um broker MQTT publico na nuvem, como é feito no projeto original), tal informação será publicada no seu broker MQTT local. Desse modo, somente quem estiver na mesma rede do broker MQTT e se subescrever ao tópico correto conseguirá tal informação. Embora possa parecer retrógrado utilizar um broker MQTT local, esta é uma estratégia muito interessante que pode ser aplicada em sensoriamento em uma empresa, garantindo assim maior proteção de dados importantes / medições importantes e também aumento na velocidade de comunicação, já que tudo estará em rede local nesta arquitetura proposta.

Para fazer com que o projeto da Planta IoT envie/publique a informação de umidade do solo medida no seu broker MQTT local, basta trocar seguinte linha do código (linha 41):

const char* BROKER_MQTT = "iot.eclipse.org"; //URL do broker MQTT que se deseja utilizar

Pela linha mostrada abaixo:

const char* BROKER_MQTT = "rasppizerow.local"; //URL do broker MQTT que se deseja utilizar

Agora, se seu computador e/ou smartphone estiver na mesma rede que seu broker MQTT local, você poderá utilizar um cliente MQTT qualquer para ver as informações de umidade de solo publicadas localmente. Na figura 3 é mostrado o resultado utilizando o cliente MQTT MyMQTT (em um smartphone Android).

Figura 3 - cliente MQTT MyMQTT mostrando as informações enviadas pelo projeto da Planta IoT
Figura 3 – cliente MQTT MyMQTT mostrando as informações enviadas pelo projeto da Planta IoT

 Usos adicionais de um broker MQTT local

Conforme comentado neste post, o uso de um broker MQTT com Raspberry Pi na sua rede local pode trazer vantagens interessantes, sobretudo a uma empresa, já que assim garante-se assim maior proteção de dados importantes e  aumento na velocidade de comunicação. Logo, o uso deste tipo de broker pode ser justificado, principalmente, por aumento na segurança. Sendo assim, segue abaixo algumas sugestões de uso de um broker MQTT local:

  • Central de comunicação em um sistema de automação residencial
  • Central de comunicação de sensoriamento em uma empresa
  • Central de comunicação em sistemas de automação comercial

Além disso, você não contará com limitações de mensagens publicadas por segundo que podem estar presentes em brokers MQTT públicos / na nuvem. Isso pode ser uma grande vantagem se seu projeto exigir grande quantidade de mensagens trocadas em pouco tempo (como sensoriamento de eventos muito rápidos, por exemplo).

Gostou deste post sobre Broker MQTT com Raspberry Pi Zero W? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

23 Comentários

  1. Olá Pedro, bom dia.
    Seguir todos os passos, conforme o artigo, porém na raspberry pi, NÃO CONECTA. Sabe o que pode ser? OU alguém pode me ajudar?

  2. Olá Pedro, com esse servidor local eu também posso fazer a comunicação de qualquer lugar, ou seja, de um rede externa wi-fi, ou pelo celular (4G).

  3. Até gostaria de fazer esse projeto… O que adquiri na MakerHero apenas faz pisca a tela do monitor… já instalei 3x o sistema operacional no cartão. Quando instala fica beleza, mas se configurar alguma coisa tipo wifi…. esquece.

    1. Olá Sandro,

      Qual a especificação da fonte de alimentação que você está utilizando?

      A wi-fi tem um consumo mais alto de energia, pode ser que a fonte não esteja dando conta de alimentar o Pi Zero W.

      Abraço!
      Vinícius – Equipe MakerHero

  4. Boa noite, existe alguma interface web (painel ) onde posso configurar usuários dispositivos algo assim ?

    Edson Junior Della Valentina Gervazio
  5. Caro Pedro, tenho um projeto que é uma variação do apresentado aqui.
    Preciso gerar gráficos com os dados coletados pelos mqtt broker mas não quero usar serviços na nuvem.
    Preciso guardar os dados enviados ao MQTT broker para analise histórica em um banco de dados mysql ou sql lite.
    Conheço melhor o ESP32.

    Poderia esclarecer as seguintes dúvidas por favor?
    1- É possível configurar o Mosquitto para guardar todas as publicações em um mysql lite local ou um mysql na nuvem?
    2- Para não sobrecarregar o Pi e não desviar sua atenção da tarefa de capturar as leituras nele publicadas pensei na possibilidade de transferir estas publicações via serial para um esp32 que ai enviaria estes dados para um mysql na nuvem. Isso pode funcionar?
    Obrigado
    Paulo Borges

    1. Paulo, boa tarde.

      Respondendo suas perguntas:
      1) o Mosquitto é um serviço do Linux que serve como broker MQTT somente. Quaisquer outras funcionalidades devem ser feitas fora dele. Logo, para o que você deseja, sugiro criar um cliente MQTT conectado nesse broker que subescreva ao topico que tem as informações a serem guardadas, de modo que esse cliente obtenha tais informações e consiga armazena-las em um banco de dados.

      2) Análogo a resposta acima, você pode ter um cliente MQTT que faz isso, sem precisar de um ESP32.

      Atenciosamente,
      Pedro Bertoleti

    2. Configure PI como mqtt bridge

  6. Muito bom artigo. Parabéns, Pedro!

    1. Vagner, muito obrigado!

      1. Bom dia Pedro, preciso de uma ajuda.
        to tentando configurar o mymqtt mas não recebo as informações do relê: humidade e temperatura…embora esteja rodando tudo ok no python. vc consegue me ajudar, por favor….abaixo segue o código.

        import paho.mqtt.client as mqtt
        import sys

        # definicoes:
        Broker = “iot.eclipse.org”
        PortaBroker = 1883
        KeepAliveBroker = 60
        TopicoSubscribe = “/alex/pi” # dica: troque o nome do topico por algo “unico”,

        # Dessa maneira, ninguem ira saber seu topico de
        # subscribe e interferir em seus testes

        # Callback – conexao ao broker realizada
        def on_connect(client, userdata, flags, rc):
        print(“[STATUS] Conectado ao Broker. Resultado de conexao: ” + str(rc))

        # faz subscribe automatico no topico
        client.subscribe(TopicoSubscribe)

        # Callback – mensagem recebida do broker
        def on_message(client, userdata, msg):
        MensagemRecebida = str(msg.payload)

        print(“[MSG RECEBIDA] Topico: ” + msg.topic + ” / Mensagem: ” + MensagemRecebida)

        # programa principal:
        try:
        print(“[STATUS] Inicializando MQTT…”)
        # inicializa MQTT:
        client = mqtt.Client()
        client.on_connect = on_connect
        client.on_message = on_message

        client.connect(Broker, PortaBroker, KeepAliveBroker)
        client.loop_forever()
        except KeyboardInterrupt:
        print(“\nCtrl+C pressionado, encerrando aplicacao e saindo…”)
        sys.exit(0)

  7. Boa Noite, quero rodar este broken em um raspberry pi 3 creio q a instalação e os procedimentos são os mesmos?? e gostaria de alem do broken q o raspiberry roda-se tbm um cliente q faria o subscribe e publish no brokem rodando no prorio raspberry, minha intenção eh controlar alguns reles q poderiam ou não estar direto no raspberry, a partir de informações como temperatura e umidade que seriam publicadas por outros clientes rodando em arduinos ou esp32, vc teria algum exemplo dos broken e o cliente rodando juntos no raspberry?? e peço informações detalhadas pois sou novo com raspberry e queria q este broken e clliente iniciassem automaticamente ao ligar o raspberry, desde já agradeço.

    1. Emanuel, boa tarde.

      Respondendo às suas perguntas:

      – Sim, para rodar o broker MQTT em um Raspberry PI 3 o procedimento é exatamente o mesmo.
      – Não possuo exemplo pronto de broker e client rodando juntos em um Raspberry PI, mas não vejo problema algum nisso. No client, basta apontar para o endereço do broker, seja ele rodando no mesmo device/placa ou não. O que consigo te fornecer de pronto é o exemplo de um client MQTT em Python, em um artigo de minha autoria: https://www.embarcados.com.br/raspberry-pi-3-na-iot-mqtt-e-python/
      – Sobre inicializar automaticamente, o broker irá por default já iniciar automaticamente com a Raspberry PI (ou seja, ao reproduzir os passos deste artigo vocÊ já conseguirá isso). Já o client você precisará fazer algumas coisas extras para inicializa-lo automaticamente. Para ter instruções detalhadas disso, recomendo que leia o item “Criação e inicialização automática do alarme.py
      ” deste artigo: https://www.makerhero.com/blog/agendamento-de-tarefas-no-linux-raspberry-pi-zero-w/

      Atenciosamente,
      Pedro Bertoleti

  8. Muito Bom.
    Aproveito para agradecer a generosidade do compartilhamento.

    1. Olá Ari!

      Ficamos muito felizes em saber que nosso trabalho realmente ajuda as pessoas. O Pedro realmente tem posts muito legais!

      Abraços!

      André – Equipe MakerHero

  9. Olá, eu recebi minha Raspberry Pi Zero W e já consegui rodar o broker mqtt. Estou refletindo se seria muito complicado fazer a mesma coisa, mas utilizando o Bluetooth. Não tenho experiência com a Raspberry, já consegui usar o Bluetooth dela, mas não tenho certeza se seria possível fazer um Broker MQTT utilizando Bluetooth. Acredito que sim, mas não achei nada na internet ainda nesse sentido. Alguém tem alguma ideia? Seria muito útil para um projeto da faculdade.

    Obrigada!!!

    1. Alessandra, boa noite.

      No seu caso, recomendo que se informe sobre o MQTT-SN, uma variante do protocolo MQTT para redes sensoriais que funciona sob diversas camadas de transporte, incluindo Bluetooth. Recomendo a leitura deste artigo sobre o assunto: https://www.embarcados.com.br/mqtt-sn-mqtt-para-rede-de-sensores/

      Atenciosamente,
      Pedro Bertoleti

      1. Pedro, aproveitando o gancho, seria possível criar uma rede mesh conectando uma rede de sensores ?

        1. Andre, infelizmente não sei responder sua pergunta.
          Por favor, faça essa pergunta no forum MakerHero, lá deve haver pessoas que saibam te responder essa pergunta.

          Atenciosamente,
          Pedro Bertoleti

  10. Estou com problemas para instalar o mosquitto… ele meu rasp não consegue localizar 🙁 oque posso fazer?

    1. Allan, bom dia.

      Você poderia colar o erro aqui por favor? A partir da(s) mensagem /mensagens de erro(s) posso te ajudar melhor.

      Atenciosamente,
      Pedro Bertoleti

      1. Desculpe a demora não tive tempo para mexer no meu rasp depois, estava comum erro de leitura no cartão e o mesmo não conseguia atualizar o pi0w
        ERRO ISO 3166, mas agora com um pouco de calma consegui fazer funcionar e logo mais testarei o MQTT nele. e passo o feedback

    2. Como conectar o mqtt de uma rede externa?