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:
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 |