- ¿Qué es MQTT?
- Instalación de Mosquitto MQTT Broker en Raspberry Pi
- Probando el Broker Raspberry Pi Mosquitto
- Diagrama de circuito
- Código y explicación
MQTT es un protocolo utilizado para enviar y recibir mensajes a través de Internet. Anteriormente usamos este protocolo en el medidor de electricidad Iot y Raspberry Pi Alexa para publicar los datos en Internet. En este tutorial conoceremos más sobre el MQTT y los términos relacionados con él. Aquí usaremos la Raspberry Pi como broker MQTT local y controlaremos un LED conectado a NodeMCU ESP12E a través del tablero de la aplicación MQTT. Un sensor DHT11 también está conectado a NodeMCU, por lo que obtenemos la lectura de temperatura y humedad en el tablero de MQTT, utilizando nuevamente la Raspberry Pi como agente local de MQTT.
Entonces, comencemos por entender el MQTT y los términos relacionados con él.
¿Qué es MQTT?
MQTT son las siglas de Message Queue Telemetry Transport, diseñado por IBM. Este protocolo es simple y liviano, se utiliza para enviar y recibir mensajes a través de Internet y está diseñado para los dispositivos que tienen un uso bajo de ancho de banda. Hoy en día este protocolo se utiliza con frecuencia en los dispositivos IoT para enviar y recibir los datos de los sensores. Además, en los sistemas de automatización del hogar basados en IoT, este protocolo se puede utilizar fácilmente sin utilizar muchos datos de Internet.
Hay algunos términos que se utilizan con frecuencia en MQTT:
- Suscríbete y publica
- Mensaje
- Tema
- Corredor
1. Suscribirse y publicar: Suscribirse significa obtener los datos de otro dispositivo y publicar significa enviar los datos a otro dispositivo.
Cuando device1 envía los datos a device2, entonces se conoce como Publisher y otro es Subscriber y viceversa.
2. Mensaje: Los mensajes son la información que enviamos y recibimos. Puede ser un dato o cualquier tipo de comando. Por ejemplo, si publicamos los datos de temperatura en la nube, estos datos de temperatura se conocen como Mensaje.
3. Tema: esta es la forma en que registra el interés por los mensajes entrantes o cómo especifica dónde desea publicar el mensaje. Los temas se representan con cadenas separadas por una barra diagonal. Los datos se publican sobre los temas utilizando MQTT y luego el dispositivo MQTT se suscribe al tema para obtener los datos.
4. Broker MQTT: Esta cosa se encarga de recibir todos los mensajes de los editores, filtra los mensajes y luego publica los mensajes a los suscriptores que estén interesados en ellos.
Cuando este corredor está alojado en la nube, se denomina nube MQTT. Hay muchos servicios MQTT basados en la nube como Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure, etc. MQTT también se puede utilizar con la popular nube Amazon AWS, que hemos explicado en el tutorial Introducción a Amazon AWS.
Podemos crear nuestro propio corredor MQTT usando Raspberry Pi. Este será el corredor de MQTT local, es decir, puede enviar y recibir los datos en su red local, pero no desde cualquier lugar. Entonces, aquí instalaremos el broker Mosquitto MQTT en Raspberry Pi para convertirlo en un broker MQTT local y enviaremos los datos de temperatura desde la aplicación de panel NodeMCU a MQTT. Además, controlaremos un LED conectado a NodeMCU usando el broker.
Instalación de Mosquitto MQTT Broker en Raspberry Pi
Abra la terminal en su Raspberry pi y escriba los siguientes comandos para instalar el broker
sudo apt update sudo apt install -y mosquitto mosquitto-clients
Espere a que finalice la instalación. Ahora, para iniciar el corredor en el inicio de raspberry pi, escriba el siguiente comando
sudo systemctl enable mosquitto.service
Eso es todo, estamos listos para lanzar nuestro corredor MQTT. Para verificar que esté instalado correctamente, ingrese el siguiente comando
mosquitto -v
Este comando le dará la versión de su agente MQTT. Debería ser 1.4.xo superior.
Probando el Broker Raspberry Pi Mosquitto
1. Ejecute el broker Mosquitto en segundo plano con el siguiente comando
mosquitto -d
2. Ahora, suscribiremos un tema en exampleTopic usando el siguiente comando
mosquitto_sub -d -t exampleTopic
3. Ahora, publicaremos algún mensaje en exampleTopic
mosquitto_pub -d -t exampleTopic -m "¡Hola mundo!"
Recibirás el Hola mundo! Mensaje en el terminal de abonado.
Ahora es el momento de controlar y obtener los datos de otro dispositivo, en nuestro caso estamos usando la aplicación de panel NodeMCU y MQTT .
- Primero controlaremos un LED enviando un comando usando la aplicación para que en este caso NodeMCU se comporte como un suscriptor y la aplicación como un editor.
- Luego, ESP12E también tiene un sensor DHT11 conectado y envía esta lectura de temperatura a la aplicación Mobile MQTT, por lo que en este caso, el móvil será el suscriptor y NodeMCU será el editor. Y para reenviar estos mensajes sobre los respectivos Temas, se utiliza el broker Mosquitto MQTT.
Diagrama de circuito
Conecte el circuito como se muestra en el diagrama. Aquí, el DHT11 se usa para las lecturas de temperatura, pero también se puede usar un sensor de temperatura LM35. Ya usamos el sensor DHT11 en muchos de nuestros proyectos, incluso con NodeMCU para construir una estación meteorológica.
Comencemos a escribir el código para que NodeMCU se suscriba y publique los datos.
Código y explicación
Aquí usaremos la plantilla de biblioteca Adafruit MQTT y cambiaremos las cosas requeridas en el código. El mismo código se puede usar para publicar y suscribir los datos a la nube Adafruit IO simplemente cambiando algunas cosas.Para esto, descargue la biblioteca Adafruit MQTT desde Sketch -> Incluir biblioteca -> Administrar bibliotecas. Busque Adafruit MQTT e instálelo. Después de instalar la biblioteca. Vaya a ejemplos -> Biblioteca Adafruit mqtt -> mqtt_esp8266
Luego edite este código de acuerdo con nuestra dirección IP de Raspberry Pi y credenciales de Wi-Fi.
Incluya todas las bibliotecas para ESP8266WIFI y Adafruit MQTT .
#incluir
Luego defina el SSID y la Contraseña para su Wi-Fi, desde el cual desea conectar su ESP-12e. Asegúrese de que su RPi y NodeMCU se conecten con la misma red.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
Esta sección define el servidor Adafruit, en este caso la dirección IP de su Raspberry Pi y el puerto del servidor.
#define AIO_SERVER "dirección ip de su Pi" #define AIO_SERVERPORT 1883
Los siguientes campos permanecerán vacíos porque no estamos usando la nube Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
Luego, cree una clase ESP8266 WiFiClient para conectarse al servidor MQTT.
Cliente WiFiClient;
Configure la clase de cliente MQTT pasando el cliente WiFi y el servidor MQTT y los detalles de inicio de sesión.
Adafruit_MQTT_Client mqtt (& cliente, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Configure una fuente llamada 'Temperatura' para publicar la temperatura.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
Configure un feed llamado 'led1' para suscribirse a los cambios.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
En la función de configuración , declaramos el PIN de NodeMCU en el que desea obtener la salida. Luego, conecte NodeMCU al punto de acceso Wi-Fi.
configuración vacía () { Serial.begin (115200); retraso (10); pinMode (LED, SALIDA); Serial.println (F ("Demo de Adafruit MQTT")); // Conéctese al punto de acceso WiFi. Serial.println (); Serial.println (); Serial.print ("Conectando a"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) { …. …. … Configure la suscripción MQTT para alimentación LED. mqtt.subscribe (& led1); }
En la función de bucle , nos aseguraremos de que la conexión al servidor MQTT esté activa usando MQTT_connect (); función.
bucle vacío () { MQTT_connect ();
Ahora, suscríbase al feed 'led' y obtenga la cadena de MQTT broker y convierta esta cadena en un número usando atoi (); funciona y escribe este número en el pin LED usando digitalWrite (); función.
Suscripción Adafruit_MQTT_Subscribe *; while ((suscripción = mqtt.readSubscription (20000))) { if (suscripción == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); escritura digital (LED, led1_State); }
Ahora, obtenga la temperatura en una variable y publique este valor usando la función Temperature.publish (t) .
flotar t = dht.readTemperature (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Fallido")); } else { Serial.println (F ("¡OK!")); }
El código completo con un video de demostración se proporciona al final de este tutorial. Cargue el código en la placa NodeMCU y abra la aplicación de panel MQTT que ha descargado en el teléfono inteligente.
También puede controlar Raspberry Pi GPIO desde cualquier parte del mundo utilizando la nube MQTT como Adafruit IO, MQTT.IO, etc., que aprenderemos en el próximo tutorial.