Skip to content

Integração MQTT

Integração ESP32 com protocolo MQTT

O protocolo consiste em comunicar o ESP32 com o cliente MQTT para realizar as interações entre hardware-software. O ESP32 deverá ser possível enviar mensagens com requisições para o client relacionado e assim dar prosseguimento com as decisões do firmware.

Setup do experimento

Para realizar o experimento os seguintes itens na tabela abaixo serão necessários.

Requisitos de Hardware Requisitos de Software Requisitos de Rede
ESP32 Arduino IDE com as bibliotecas WiFi.h e PubSubClient.h Conexão de rede WiFi
Cabo USB MQTT broker

O seguinte código será carregado na ESP32 para realizar o teste com o broker ativo. O seguinte trecho de código abaixo é responsável por incluir as bibliotecas necessárias, inicializar os dados da rede WiFi, configurar o cliente mqtt de teste nas variáveis que serão utilizadas posteriormente. Por fim o trecho de firmware inicializa os objetos WiFi e MQTT.

#include <WiFi.h>
#include <PubSubClient.h>

// Configuração do Wi-Fi
const char* ssid = "Britech";       // Nome da rede Wi-Fi
const char* password = "brito123tech"; // Senha do Wi-Fi

// Configuração do RabbitMQ
const char* mqtt_server = "test.mosquitto.org"; // IP do servidor RabbitMQ (ou domínio)
const int mqtt_port = 1883;                // Porta para conexões MQTT
// const char* mqtt_user = "rabbitmq";        // Usuário configurado no RabbitMQ
// const char* mqtt_pass = "rabbitmq";        // Senha configurada no RabbitMQ
const char* mqtt_topic_publish = "real_unique_topic"; // Tópico para publicar
const char* mqtt_topic_subscribe = "real_unique_topic1"; // Tópico para se inscrever

// Objetos WiFi e MQTT
WiFiClient espClient;
PubSubClient client(espClient);

A função setup_wifi() realiza a conexão com WiFi

// Função para conectar ao Wi-Fi
void setup_wifi() {
  delay(10);
  Serial.println("Conectando ao Wi-Fi...");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nWi-Fi conectado.");
}

Sempre que uma mensagem via MQTT é recebida a função callback(), descrita abaixo, é responsável por realizar o tratamento.

// Função chamada quando uma mensagem é recebida no tópico
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Mensagem recebida no tópico: ");
  Serial.println(topic);

  Serial.print("Mensagem: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

Caso for necessário realizar a reconexão a função reconnect() é utilizada.

// Função para reconectar ao servidor MQTT
void reconnect() {
  while (!client.connected()) {
    Serial.print("Conectando ao RabbitMQ...");
    if (client.connect("esp_client")) {
      client.subscribe(mqtt_topic_subscribe);
      Serial.println("Inscrito no tópico:");
      Serial.println(mqtt_topic_subscribe);
    } else {
      Serial.print("Falha na conexão. Código: ");
      Serial.println(client.state());
      delay(5000);
    }
  }
}

A função publish_message() realiza a publicação de uma mensagem para o servidor MQTT, algo necessário para complementar a comunicação de mão-dupla, requisito do projeto. A mensagem publicada será imprimida no monitor serial pela função Serial.println() da ESP32 para visualização de que a comunicação se concretizou.

// Publicar uma mensagem no tópico
void publish_message(const char* message) {
  if (!client.connected()) {
    reconnect();
  }
  client.publish(mqtt_topic_publish, message);
  Serial.println("Mensagem publicada:");
  Serial.println(message);
}

Abaixo contém as rotinas do firmware para o teste em questão, a função setup() realiza a preparação conectando o client ao mqtt. Já a função loop() está programada para publicar uma mensagem a cada 5 segundos com a função publish_message().

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  reconnect();

  // Publicar uma mensagem ao iniciar
  publish_message("{\"nome\":\"Mensagem inicial para device\"}");
}

void loop() {
  client.loop();
  delay(5000);

  // Publicar uma mensagem recorrente
  publish_message("{\"nome\":\"Mensagem recorrente para device\"}");
}

Resultados

Após inicializar os testes tanto na ESP32 quanto no terminal responsável por hospedar o broker é possível observar os seguintes resultados da comunicação entre broker e ESP32 nas imagens abaixo:

EAP

EAP

Versionamento

Versão Data Descrição Responsável
0.1 09/01/2025 Criação do documento João Pedro Cordeiro
0.2 12/01/2025 Revisão do documento e correções Guilherme Brito