Este artigo é a continuação do artigo Implementação do MQTT utilizando .NET para comunicação com ESP32 , onde descrevo como criar um servidor com broker MQTT utilizando .NET Core. Neste artigo apresentarei como é possível testar o broker e por fim, a integração com o ESP32.
Teste do Broker
Para testar a conexão com nosso broker, utilizarei o aplicativo para Android “IoTMQTTPanel”, você pode encontrá-lo aqui.
Com o aplicativo devidamente instalado, crie uma conexão clicando no ícone “+” como mostrado na figura abaixo.
Após pressionar o botão de criação, uma tela de configuração semelhante à figura abaixo aparecerá.
Agora é o momento de configurar a conexão. No campo Connection Name insira o nome que desejar para a conexão, no campo Broker Web/IP Address insira o endereço IP da máquina onde o servidor está sendo executado. Em Port Number digite o valor 1883. No campo Network Protocol Selecione TCP. A figura abaixo exemplifica a configuração.
Para finalizar a configuração, crie uma dashboard clicando no botão “Create”. Com a dashboard criada, você deve conseguir ver a tela de conexões semelhante à figura abaixo.
Selecione a conexão criada, adicione um painel “Text Input” na dashboard. O painel deve ser configurado como mostrado na figura abaixo.
Na figura acima, configuramos o Panel para enviar as mensagens ao tópico “teste/topic1”. Neste momento, vamos enviar uma mensagem de teste para verificarmos o funcionamento do broker.
Verificando na saída do servidor MQTT temos.
Com isso podemos verificar que o servidor .NET está funcionando, pois, havíamos inserido o comando para exibir os dados recebidos no teste/topic1. Para facilitar a observação das mensagens enviadas ao tópico, adicionaremos o Panel Text Log na dashboard. Clique no ícone “+” e adicione o Panel e o configure da seguinte forma.
Integração do ESP32
Para validar a conexão com o ESP32, desenvolveu-se um código simples o qual pode ser encontrado aqui, sendo também exposto abaixo.
#include <Arduino.h>
/*
* Projeto: Conexão MQTT com broker feito em .NET Core
* Autor: Yago Caetano
*
*/
#include <WiFi.h>
#include <PubSubClient.h>
/* Defines do MQTT */
#define TOPICO_SUBSCRIBE "teste/topic2"
#define TOPICO_PUBLISH "teste/topic1"
#define ID_MQTT "M-ESP32" //deve ser unico no broker
/* Variaveis, constantes globais */
const char* SSID = "jkk"; // SSID Wi-Fi a se conectar
const char* PASSWORD = "akivcnentra"; // Senha Wi-Fi a se conectar
const char* BROKER_MQTT = "192.168.15.103"; //URL do broker MQTT
int BROKER_PORT = 1883; // Porta do Broker MQTT
//Variáveis e objetos globais
WiFiClient espClient; // Cria o objeto espClient
PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient
/* Prototypes */
void initializeWiFi(void);
void initializeMQTT(void);
void mqtt_callback(char* topic, byte* payload, unsigned int length);
void reconnectMQTT(void);
void reconnectWiFi(void);
void checkWiFIEMQTT(void);
/* Função: inicializa e conecta-se na rede WI-FI desejada
* Parâmetros: nenhum
* Retorno: nenhum
*/
void initializeWiFi(void)
{
delay(10);
Serial.println("------Conexao WI-FI------");
Serial.print("Conectando-se á: ");
Serial.println(SSID);
Serial.println("Aguarde");
reconnectWiFi();
}
/* Função: Inicia a conexão MQTT
* Parâmetros: nenhum
* Retorno: nenhum
*/
void initializeMQTT(void)
{
MQTT.setServer(BROKER_MQTT, BROKER_PORT); //define os parametros de conexão
MQTT.setCallback(mqtt_callback); //define o callback
}
/* Função: Callback de conexão MQTT
* Parâmetros: nenhum
* Retorno: nenhum
*/
void mqtt_callback(char* topic, byte* payload, unsigned int length)
{
String msg;
/* obtem a string do payload recebido */
for(int i = 0; i < length; i++)
{
char c = (char)payload[i];
msg += c;
}
Serial.print("Mensagem receibda: ");
Serial.println(msg);
}
/* Função: reconecta-se ao broker MQTT.
* Parâmetros: nenhum
* Retorno: nenhum
*/
void reconnectMQTT(void)
{
while (!MQTT.connected())
{
Serial.print("* Tentando se conectar ao Broker: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT))
{
Serial.println("Conectado com sucesso!");
MQTT.subscribe(TOPICO_SUBSCRIBE);
}
else
{
Serial.println("Falha ao reconectar");
Serial.println("Tentando novamente em 2s");
delay(2000);
}
}
}
/* Função: verifica as conexões Wi-Fi e MQTT
* Parâmetros: nenhum
* Retorno: nenhum
*/
void VerificaConexoesWiFIEMQTT(void)
{
if (!MQTT.connected())
reconnectMQTT(); //se broker não está conectado, tenta conectar
reconnectWiFi(); //reconecta a rede Wi-Fi
}
/* Função: reconecta-se ao WiFi
* Parâmetros: nenhum
* Retorno: nenhum
*/
void reconnectWiFi(void)
{
//se já está conectado a rede WI-FI, nada é feito.
//Caso contrário, são efetuadas tentativas de conexão
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso na rede ");
Serial.print(SSID);
Serial.println("IP obtido: ");
Serial.println(WiFi.localIP());
}
/* Função de setup */
void setup()
{
Serial.begin(115200);
/* Inicializa a conexao wi-fi */
initializeWiFi();
/* Inicializa a conexao ao broker MQTT */
initializeMQTT();
}
/* Loop principal */
void loop()
{
/* garante funcionamento das conexões WiFi e ao broker MQTT */
VerificaConexoesWiFIEMQTT();
MQTT.loop();
if(MQTT.connected())
{
MQTT.publish(TOPICO_PUBLISH,"Aqui eh o ESP32");
}
/* Refaz o ciclo após 2 segundos */
delay(2000);
}
Para a correta execução do programa, defina as constantes SSID e PASSWORD com as informações da rede Wi-Fi a qual o ESP32 deverá conectar. Defina também a constante BROKER_MQTT com o endereço IP do broker MQTT.
O funcionamento do firmware de teste é bem simples, basicamente configuramos a conexão Wi-Fi do módulo e em seguida, estabelecemos a conexão com nosso broker MQTT. Na função de loop, verificamos a cada 2 segundos o status das conexões e publicamos a mensagem “Aqui eh o ESP32” no tópico teste/topic1.
A figura abaixo exibe as mensagens recebidas no broker.
A próxima imagem exibe as mensagens recebidas no aplicativo de testes.
Conclusão
O MQTT tornou-se uma tecnologia popular no mercado IOT, possuindo suporte para diversas linguagens de programação. Este artigo apresentou como implementar a comunicação MQTT no .NET Core utilizando a biblioteca MQTTnet, mostrando o quão simples é criar um broker e estabelecer conexão com este.
Com os resultados obtidos, tornou-se evidente que o uso da biblioteca MQTTnet é uma solução interessante aos desenvolvedores .NET que desejam implementar o MQTT em suas aplicações.





Fiz os testes com o broker do MQTTnet e funciona muito bem na maquina local, com localhost o rede wifi, mas quando eu publiquei em um provedor de web o resultado não foi o mesmo, simplesmente não conecta. Você já teve algum problema deste?
Agradeço o comentário Gentini!
Eu já passei sim por problemas ao publicar em servidores, no meu caso eu fiz a hospedagem em instancias EC2 da AWS. Tenta verificar os seguintes itens:
Connection: upgradeestá sendo transmitido no redirecionamento.Caso persista o problema, me manda uma mensagem que tento ajudar.
Abraço,
Yago Caetano