Primero que nada vamos a iniciar los servicios de node-red y mosca. Una vez que se inicien, vamos a la ip local 127.0.0.1:1880 y ahí deberíamos configurar los siguientes módulos:
- Text imput: configurado para que aparezca en el default del dashboard y con un Delay (ms) en 0 para que espere a que se presione el enter para mandar.
- MQTT: configurado con la ip donde se aloja el mqtt broker y con el tópico mensajes.
Y debería quedar como muestra la siguiente imágen:
Y si nos vamos a la dirección 127.0.0.1:1880/ui deberíamos encontrarnos con el dashboard de esta forma.
En donde dice escribir acá podremos ingresar un mensaje que se va a mandar a través del mqtt broker, de esta forma si accedemos a la dirección ip de nuestra pc desde el celular (el navegador) podremos mandar mensajes sin necesidad de ninguna aplicación.
Ahora si vamos a arduino y cargamos el siguiente código (que es el mismo que la última vez) y lo cargamos en nuestra ESP8266 deberíamos poder recibir por el puerto serie el mensaje que mandemos desde la interfaz web:
#include <ESP8266WiFi.h> #include <PubSubClient.h> // Las siguientes tres constantes definen, ip del //mqtt broker, nombre de red wifi y su contraseña. const char* mqtt_server = "192.168.1.15"; const char* ssid = "id_red_wifi"; const char* password = "contraseña_red_wifi"; // A continuación declaramos el nombre del cliente // que se va a conectar. WiFiClient espClient; PubSubClient client(espClient); // En esta variable se almacena el mensaje recibido // notar que tiene un máximo de 50 (en realidad son // 49) caracteres. char msg[50]; // Iniciamos la comunicación serie, la conexión por // wifi y definimos en donde se aloja el servidor y // en qué puerto, y la función donde administramos // la llegada de mensajes. void setup() { Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } // En esta función se conecta con la red designada, // mientras esté tratando de conectarse va a mandar // un punto "." por el puerto serie y cuando lo // consiga nos avisará. void setup_wifi() { delay(10); Serial.println(); Serial.print("Conectando a: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.println("Direccion IP: "); Serial.println(WiFi.localIP()); } // En esta función se administra la llegada de // mensajes, nos avisa en qué tópico llegó y // cuál es el mensaje. void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } // Esta función se encarga de conectar con el // mqtt broker, si lo consigue se subscribe a // los tópicos que definamos (no es necesario // subscribirnos en esta función, pero si lo // recomiendo para organizar mejor el código. // Prueba reconectarse cada cinco segundos si // no lo consigue. void reconectar() { while (!client.connected()) { Serial.print("Intentando conectar con el mqtt broker..."); if (client.connect("ESP8266Client")) { Serial.println("conectado"); client.subscribe("mensajes"); } else { Serial.print("fallo, rc="); Serial.print(client.state()); Serial.println(" prueba nuevamente en 5 segundos"); delay(5000); } } } // En el loop principal no hacemos nada más // que verificar si perdimos la conexión con // el servicio mqtt y verificamos que lleguen // mensajes. El "client.loop();" se encarga // de revisar si llegaron mensajes, por lo // que habría que invocar esta función regu- // larmente. // Esta sección se podría mejorar si ponemos // que revise si perdió la conexión con la // red wifi. void loop() { if (!client.connected()) { reconectar(); } client.loop(); }
Si agregamos al código algo que "analice" el mensaje entrante podremos hacer algún programa que "reaccione" ante ciertos mensajes en específico.
No hay comentarios.:
Publicar un comentario