Comunicar ESP8266 y Raspberry con MQTT

En este post veremos cómo usar el protocolo MQTT con la Raspberry Pi y la tarjeta ESP8266. Vamos a transferir simples mensajes, pero a partir de ello podremos, más tarde, enviar datos de sensores.

Lo que haremos será enviar y recibir mensajes en distintos tópicos.

Configuración e instalación de librerías

Necesitamos tener un servidor MQTT. Puedes ver mi tutorial para instalar mosquitto sobre la Raspberry Pi.

Por otro lado recomiendo usar VSCode y PlatformIO para programar la NodeMCU ESP8266. De igual modo es necesario la librería PubSubClient que puedes instalar yendo al apartado librerías, buscando “PubSubClient” e instalando la que aparece en la imagen:

Instalar PubSubClient para MQTT con ESP8266

Finalmente necesitas instalar la librería de WiFi, me parece que viene instalada por defecto al configurar el entorno.

Definir credenciales de acceso a red y a MQTT

Comenzamos definiendo las claves de acceso, nombre de red, ip del servidor, etcétera.

De igual modo creamos unas variables globales, entre ellas el mensaje que será enviado al servidor, el cliente WiFi y el cliente MQTT.

Finalmente definimos un tiempo de espera que será necesario para enviar el mensaje al servidor cada 3 segundos.

El callback de MQTT

Antes de continuar, debemos definir un callback para cuando se reciba un mensaje de MQTT. Un callback no es más que una función que será invocada al recibir un mensaje del tópico al que estamos suscritos.

La función recibe el tópico como cadena, los datos como un arreglo de bytes (de hecho recibimos un apuntador al inicio del mismo) y finalmente la longitud de datos:

Lo único que hacemos es imprimir el mensaje, pero podríamos hacer comparaciones. En tutoriales futuros veremos cómo apagar y encender un led dependiendo del mensaje, pero por el momento solo lo imprimimos.

Conectando al WiFi y a servidor MQTT

Antes de conectarnos al servidor MQTT necesitamos tener una conexión Wifi. Para ello vamos a usar el cliente WiFi, es decir, vamos a ser clientes en lugar de servidores. Aquí el código para conectarnos:

Cuando hemos obtenido la conexión WiFi y ya estamos en la red o en internet, nos intentamos conectar al servidor MQTT.

Una vez que nos conectamos al servidor MQTT nos suscribimos a un tópico y establecemos la función callback mostrada previamente.

Publicación de mensajes a MQTT

Para enviar un mensaje hacemos lo siguiente:

Esto lo haremos dentro del loop.

Recepción de mensajes MQTT

Para procesar lo recibido simplemente invocamos al método loop del cliente:

En caso de que haya un mensaje recibido se invocará al callback.

Código completo

Ahora veamos el código completo, y más abajo lo vamos a probar.

Es importante notar que vamos a publicar en el tópico jardin/temperatura, y que vamos a recibir mensajes del tópico casa/sala/iluminacion.

Enviando mensajes

Los mensajes serán enviados cada 3 segundos, con un simple contador. Si nos suscribimos veremos algo así:

Suscribir desde Raspberry a mensajes enviados por ESP8266

Y de igual modo, si enviamos un mensaje, la ESP8266 lo recibirá:

Enviando mensajes a ESP8266 con MQTT

Conclusión

Recuerda que en este caso he usado una Raspberry como servidor, y un ESP8266 como cliente. Sin embargo, podemos instalar mosquitto en distintos dispositivos.

De igual modo puedes usar como cliente un Arduino o un montón de tarjetas compatibles con MQTT. Y puede haber más de dos dispositivos.

En próximos tutoriales veremos cómo enviar datos de un sensor.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

2 comentarios en “Comunicar ESP8266 y Raspberry con MQTT”

Dejar un comentario