// From https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide
#include <WiFi.h> //Biblioteca para conectar no wifi
#include "PubSubClient.h" // Biblioteca para mqtt.
const char* ssid = "Wokwi-GUEST"; //Usuário do wifi - Usar esse usuário no simulador
const char* password = ""; //senha do wifi - Usar essa senha no simulador
const char* mqttServer = "broker.emqx.io"; //Endereço do broker mqtt
int port = 1883; //porta de conexão com o broker mqtt
char clientId[50]; // nome do cliente que vai se conectar - será sorteado um nome
WiFiClient espClient; //cria um cliente wifi
//Cliente wifi é vinculado ao objeto que tratára a conexão com broker mqtt
PubSubClient client(espClient);
//define as portas dos leds no microcontrolador.
#define LED_VERMELHO 2
#define LED_AZUL 12
//executa uma vez antes de entrar no loop
void setup() {
//Define a velocidade de comunicação com a porta serial do microcontrolador
Serial.begin(115200);
randomSeed(analogRead(0));
//configura as portas dos leds como portas de saidas de dados
pinMode(LED_VERMELHO, OUTPUT);
pinMode(LED_AZUL, OUTPUT);
//chama função responsavel por conectar ao wifi
ConectarWifi();
//após a conectado ao wifi é feita conexão com o broker mqtt em uma porta
client.setServer(mqttServer, port);
// configura a função: ouvidorCanais para ouvir os canais em que foram feitas inscrições
client.setCallback(ouvidorCanais);
}
void ConectarWifi() {
Serial.println();
Serial.print("Conectando em: ");
Serial.println(ssid);
//define modo de funcionamando do wifi
WiFi.mode(WIFI_STA);
//tenta efetuar conexão com o wifi do simulador
WiFi.begin(ssid, password);
//enquanto não for conectado ao wifi fica tentando conectar.
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//sai da repetição ao conectar
// mostra dados das conexão
Serial.println("WiFi Conectado");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.print("MAC: ");
Serial.println(WiFi.macAddress());
}
//recebe um nome de canal para inscrever.
void inscreverCanal(String canal){
//inscreve em um canal
client.subscribe(&canal[0]);
Serial.println("Inscrito no canal: " + canal);
}
//efetua conexão com broker mqtt.
void concetarServidorMQTT() {
//fica em loop enquanto não conseguir conectar.
while (!client.connected()) {
Serial.println("Tentatica de Conectar no servidor mqtt");
//gera um nome aleatório para conectar ao servidor mqtt.
//cada dispositivo deve ser um dispositivo com nome unico.
long r = random(1000);
String nomeClienteUnico ="cliente_" + (String) r;
if (client.connect(&nomeClienteUnico[0])) {
Serial.print(nomeClienteUnico);
Serial.println(" Conectado");
inscreverCanal("topicName/ledVermelho");
inscreverCanal("topicName/ledAzul");
} else {
Serial.print("Falha ao conectar, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
//função que recebe o dado que é publicado em um canal inscrito
void ouvidorCanais(char* topic, byte* message, unsigned int length) {
String stMessage;
//monta a mensagem recebida na variavel Serial
for (int i = 0; i < length; i++) {
//Serial.print((char)message[i]);
stMessage += (char)message[i];
}
// caso tenha sido publicada mensagem no canal topicName/ledVermelho
if (String(topic) == "topicName/ledVermelho") {
Serial.print("Mensagem Recebida no topico: topicName/ledVermelho : ");
//verifica se a mensagem que chegou é "on" ou off
//desliga ou liga o led conforme a mensagem recebida
if(stMessage == "on"){
Serial.println("on");
digitalWrite(LED_VERMELHO, HIGH);
}else if(stMessage == "off"){
Serial.println("off");
digitalWrite(LED_VERMELHO, LOW);
}
}
// caso tenha sido publicada mensagem no canal topicName/ledAzul
if (String(topic) == "topicName/ledAzul") {
Serial.print("Mensagem Recebida no topico: topicName/ledAzul : ");
//verifica se a mensagem que chegou é "on" ou off
//desliga ou liga o led conforme a mensagem recebida
if(stMessage == "on"){
Serial.println("on");
digitalWrite(LED_AZUL, HIGH);
}else if(stMessage == "off"){
Serial.println("off");
digitalWrite(LED_AZUL, LOW);
}
}
}
// roda em loop infinito no microcontrolador.
void loop() {
delay(10);
//se não estiver conectado no broker faz conexão
if (client.connected()==false) {
concetarServidorMQTT();
}
//publica nos canais
client.publish("topicName/ledVermelho", "on");
client.publish("topicName/ledAzul", "off");
delay(2000);
//publica nos canais
client.publish("topicName/ledVermelho", "off");
client.publish("topicName/ledAzul", "on");
delay(2000);
client.loop();
}