Para trabajar con MQTT es interesante instalar primero en el ordenador un cliente como MQTT.fx para hacer debug: https://mqttfx.jensd.de/ o MQTT explorer http://mqtt-explorer.com/
Para conseguir una comunicación MQTT con ESP8266 o Arduino, emplearemos una librería. Existen muchas disponibles gracias a la comunidad que existe alrededor de Arduino. Concretamente, nosotros emplearemos una de las más conocidas y la más estable y flexible, lo que facilita su uso en proyectos que queramos realizar donde intervengan Arduino y MQTT.
Dicha librería es pubsubclient Arduino Client for MQTT y nos provee de un sencillo cliente que nos permite tanto subscribirnos como publicar contenido usando MQTT. Internamente, usa la API de Arduino Ethernet Client lo que lo hace compatible con un gran número de ‘shields’ y placas como:
- Arduino Ethernet
- Arduino YUN
- Arduino WiFi Shield
- Intel Galileo/Edison
- ESP8266
- ESP32
Web: https://pubsubclient.knolleary.net/
Instalar la librería mediante el gestor de librerías:
PubSubClient es una librería compatible con Arduino y ESP8266. Básicamente hace que nuestra placa se comporte como un cliente MQTT, es decir, que podamos publicar mensajes y suscribirnos a un topic o varios para recibir mensajes. Da lo mismo si utilizas un Arduino o un ESP8266, el código es prácticamente el mismo. La diferencia reside en cómo nos conectamos a la red WiFi o Ethernet, cada placa utiliza su propia librería.
Github PubSubClient: https://github.com/knolleary/pubsubclient
API Documentación: https://pubsubclient.knolleary.net/api.html
Enviando un mensaje a través del protocolo MQTT con Wemos D1 Mini
Vamos a partir de uno de los ejemplos que vienen dentro de la librería. Lo encontrarás en Archivo>Ejemplos>PubSubClient>mqtt_esp8266. Esta opción te abre el siguiente código: https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino
Configurar el SSID y el password de la red. En mqtt_server poner la IP de la Raspberry Pi donde se ha instalado el broker Mosquitto.
NOTA: tener en cuenta que si usamos usuario y contraseña debemos usar connect (clientID, username, password) en lugar de connect (clientID) https://pubsubclient.knolleary.net/api.html#connect3
Código: https://github.com/jecrespo/Curso-IoT-Open-Source/blob/master/mqtt_esp8266/mqtt_esp8266.ino
Este sketch publica un mensaje «hello world #x” consecutivo cada 2 segundos en el topic “outTopic” y se suscribe al topic “inTopic”. Además cuando se recibe un mensaje se dispara la función callback que si es un 1 enciendo el led integrado y en caso contrario se desactiva.
Firmware para Wemos D1 Mini + Shields
El firmware para los nodos remotos:
- BÁSICO: https://github.com/jecrespo/Curso-Node-RED/blob/master/Remote%20Nodes%20Firmware/basic-node/basic-node.ino
- BÁSICO SEGURO CON MQTT SOBRE TLS: https://github.com/jecrespo/Curso-Node-RED/blob/master/Remote%20Nodes%20Firmware/basic-node-secure/basic-node-secure.ino
- RELAY: https://github.com/jecrespo/Curso-Node-RED/blob/master/Remote%20Nodes%20Firmware/relay-node/relay-node.ino
- OLED: https://github.com/jecrespo/Curso-Node-RED/blob/master/Remote%20Nodes%20Firmware/oled-node/oled-node.ino
- DS18B20: https://github.com/jecrespo/Curso-Node-RED/blob/master/Remote%20Nodes%20Firmware/DS18B20-node/DS18B20-node.ino
- Matrix Led: https://github.com/jecrespo/Curso-Node-RED/blob/master/Remote%20Nodes%20Firmware/Matrix-node/matrix-node.ino
Probar cada firmware y hacer un programa sencillo para interactuar con ellos.
Firmware de otros nodos remotos: https://github.com/jecrespo/Curso-Node-RED/tree/master/Remote%20Nodes%20Firmware/Firmware%20M5Stack%20Varios
- M5Atom Matrix: https://m5stack.com/collections/m5-atom/products/atom-matrix-esp32-development-kit
- M5Stack Basic: https://m5stack.com/collections/m5-core/products/basic-core-iot-development-kit
- M5StickC: https://m5stack.com/collections/m5-core/products/stick-c
- M5StickC-Plus: https://m5stack.com/collections/m5-core/products/m5stickc-plus-esp32-pico-mini-iot-development-kit
- M5Stack código: https://github.com/jecrespo/M5stack
Topic Map
El topic map del firmware de los dispositivos es:
- curso/wemos/{nombre}/dato10s – publica mensaje numerado cada 10s
- curso/wemos/{nombre}/dato60s – publica mensaje numerado cada 60s
- curso/wemos/{nombre}/reset – publica mensaje cada reset o inicio
- curso/wemos/{nombre}/led – suscrito (1 led ON, otro valor led OFF)
- curso/wemos/{nombre}/text – suscrito (muestra el mensaje por pantalla)
- curso/wemos/{nombre}/rele – suscrito (1 relé ON, otro valor relé OFF). Firmware relé
- curso/wemos/{nombre}/oled – suscrito (muestra el mensaje por pantalla oled). Firmware oled
- curso/wemos/{nombre}/temperatura – publica dato temperatura cada 10 segundos. Firmware DS18B20
- curso/wemos/{nombre}/matrix – suscrito (0 efecto y apaga, de 1 a 8 ilumina de 1 a 8 líneas de matriz ). Firmware matrix.
- curso/raspberrypi/{nombre}/CPU – publica Node-RED el datos de CPU
- curso/raspberrypi/{nombre}/Temperatura – publica Node-RED el datos de temperatura procesador
- curso/raspberrypi/{nombre}/Memoria – publica Node-RED el datos de memoria libre
- curso/wibeee/# – datos eléctricos de Wibeee
- curso/m5atom/enrique/aviso – suscrito (“alarma” – leds rojos, “aviso” – leds amarillos, “ok” – leds verdes, otro mensaje apaga)
- curso/m5atom/enrique/boton – al pulsar publica “press” o “longpress”
- curso/m5stack/enrique/A – al pulsar botón A publica “press”
- curso/m5stack/enrique/B – al pulsar botón B publica “press”
- curso/m5stack/enrique/C – al pulsar botón C publica “press”
- curso/m5stack/enrique/led – suscrito (1 dibuja en pantalla círculo rojo, otro valor dibuja en pantalla círculo verde)
- curso/m5stack/enrique/text – suscrito, muestra por pantalla el texto
- curso/m5stick/enrique/temperatura – publica dato temperatura cada 1 segundo
- curso/m5stick/enrique/humedad – publica dato humedad cada 1 segundo
- curso/m5stick/enrique/presion – publica dato presión cada 1 segundo
- curso/m5stickplus/enrique/distancia – publica dato distancia cuando se activa
- curso/m5stickplus/enrique/button – al pulsar botón publica “press”
- curso/m5stickplus/enrique/led – suscrito (1 led ON, otro valor led OFF)
- curso/m5stickplus/enrique/label – suscrito (“red” – circulo rojo, “yellow” – circulo amarillo, “green” – circulo verde, “black” – circulo negro)