ESP8266 Cliente MQTT Mosquitto Node-RED
Desde hace un tiempo ha entrado en auge el IoT o Internet de las cosas, abriendo una posibilidad de interconectar dispositivo a internet, uno de los protocolos que implementados mas conocidos es el Protocolo MQTT, este protocolo TCP/IP de mensajeria ligera es excelente para envio bidirecional de datos (sensores, actuadores, etc).Se requiere un instalar Broker MQTT en caso de pruebas locales como en este caso, aunque existe una gran cantidad de Plataformas IoT que ya lo tienen Implementado.
Recomendamos para pruebas locales el broker Mosquitto y Node-RED, Para la siguiente prueba utilizaremos Mosquitto MQTT (Tutorial Recomendado Instalacion de Mosquitto Broker MQTT en lubuntu (Ubuntu) linux ), Aunque se puede instalar en Windows y MAC, hemos decidido utilizar Lubuntu o crear una MV en Virtualbox y sobre esta instalar Mosquitto y Node-RED.
Esta recopilación de Videos Tutoriales sobre Node-RED sera una buena introducción a esta plataforma: Node-RED IoT.
Prueba
Realizaremos una pequeña prueba de ESP8266 como cliente MQTT, de esta manera nuestro modulo(Cliente MQTT) atravez de Mosquitto(Broker) conectara con Node-RED (Cliente MQTT).
Hemos conectado un Diodo led(GPIO D15) y un pulsador (GPIO D0)al modulo ESP8266, desde Node-RED Dashboard activar y desactivar el diodo led y visualizar el estado del pulsador.
Se han creado 2 topicos MQTT:
- client_MQTT.subscribe(“output”); /// activate Led – activa led
- client_MQTT.publish(“input”,buf); //// Array char mensage MQTT /// state input – estado entrada.
El siguiente tutorial explicara los puntos principales de la aplicacion.
ESP8266 Cliente MQTT Node-RED Mosquitto
Nota:En este caso el ESP8266 esta constantemente enviando el valor del pulsador Input y leyendo estado de Output, se recomienda realizar solicitudes periodicas utilizando delay’s para evitar conflictos.
Codigo Arduino IDE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#include < ESP8266WiFi.h > #include < PubSubClient.h > /* * Modified by Trialcommand * More Tutorials: * Website http://trialcommand.com * */ const char* ssid = "************"; const char* password = "*************"; const char* mqtt_server = "**************"; /// example 192.168.0.19 int mqtt_port = 1883; WiFiClient espClient; PubSubClient client_MQTT (espClient); void setup() { pinMode(14, OUTPUT); pinMode(16, INPUT); Serial.begin(9600); setup_wifi(); client_MQTT.setServer(mqtt_server, mqtt_port); client_MQTT.setCallback(callback); } void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); Serial.println("."); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Connected "); Serial.print("MQTT Server "); Serial.print(mqtt_server); Serial.print(":"); Serial.println(String(mqtt_port)); Serial.print("ESP8266 IP "); Serial.print(WiFi.localIP()); } /* funtion callback * * Esta funcion realiza la recepcion de los topic suscritos * This function performs the reception of subscribed topics * */ void callback(char* topic, byte* payload, unsigned int length) { String string; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { // Serial.print((char)payload[i]); string+=((char)payload[i]); } Serial.println(string); if (topic ="output") { /// select topic "output" Serial.print(" "); int resultado = string.toInt(); digitalWrite(14, resultado); } } /* * * Funcion que realiza la reconexion de cliente MQTT * Function that performs MQTT client reconnection * * enable/habilita client_MQTT.subscribe("event"); */ void reconnect() { // Loop until we're reconnected while (!client_MQTT.connected()) { if (client_MQTT.connect("ESP8266Client")) { } else { Serial.print("failed, rc="); Serial.print(client_MQTT.state()); } } } void loop() { if (!client_MQTT.connected()) { reconnect(); /// reconection MQTT } client_MQTT.loop(); client_MQTT.subscribe("output"); /// activate Led - activa led char buf[5]; /// array char String valor =String(digitalRead(16)); //// input to string String (valor).toCharArray(buf, 5); /// String to array char client_MQTT.publish("input",buf); //// Array char mensage MQTT /// state input - estado entrada } |
Sucripciones
Para definir una suscripcion se requiere la funcion “client_MQTT.subscribe(“output”); “ y el mensaje retornara mensajes en la funcion callback realiza la recepción de todas las suscripciones, con un if se filtran los topicos requeridos y se asignan a variables locales.
1 |
client_MQTT.subscribe("output"); /// activate Led - activa led |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void callback(char* topic, byte* payload, unsigned int length) { String string; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { // Serial.print((char)payload[i]); string+=((char)payload[i]); } Serial.println(string); if (topic ="output") { /// select topic "output" Serial.print(" "); int resultado = string.toInt(); digitalWrite(14, resultado); } } |
Publicaciones
la funcion para publicar “client_MQTT.publish(“input”,buf);” utiliza los parametros “topico”, “mensaje” en este caso el valor de la entrada se convierte de int a String, la funcion no acepta Strings, utiliza array de char en este caso y hemos implementado esta funcion de conversion.
1 2 3 4 |
char buf[5]; /// array char String valor =String(digitalRead(16)); //// input to string String (valor).toCharArray(buf, 5); /// String to array char client_MQTT.publish("input",buf); //// Array char mensage MQTT /// state input - |
Conclusiones
El protocolo MQTT se ha convertido en uno de los protocolos estandard para aplicaciones para el Internet de las cosas IoT, Realizando una comparación con otros protocolos mencionaremos algunas ventajas:
- Permite el envio de Strings sin limitarse a Numeros.
- El envio de mensajes sin requerir nombres especificos de registros.
- Se puede realizar una agrupación y organización de registros sencillas.
- Consideramos que es muy rápido, aunque en nuestro ejemplo abusemos al tener un envio constante, se recomienda enviar datos en intervalos fijos.
Node-RED es una gran herramienta para aplicaciones de estas características y dispone de un Dashboard que permite gran cantidad de aplicaciones.
Referencias
- Tutoriales : Node-RED IoT.
- Instalar Lubuntu (Ubuntu) desde Cero
- Instalacion de Mosquitto Broker MQTT en lubuntu (Ubuntu) linux
- Instalacion de Plataforma Node-Red
Descargas
Libreria PubSubClient para ESP8266
Creada por knolleary
Thanks, great article.
Hola,
Hay un error en la linea 66
for (int i = 0; i < length; i++)
Saludos
Carlos,
Gracias por indicarme este error, un pequeño bug pluging html con el caracter “<", lo corregire inmediatamente nuevamente gracias.