Menú
IoT8 min lectura

Comunicación MQTT entre Arduino y Raspberry Pi para IoT

WH

Wagner Herrera

Autor y Programador Freelance

En la arquitectura de sistemas embebidos, la comunicación es tan importante como el procesamiento de datos. Cuando diseñamos redes del Internet de las Cosas (IoT), utilizar peticiones HTTP tradicionales sobrecarga los microcontroladores debido al peso del encabezado de red. En mi experiencia liderando proyectos IoT en Ecuador, he comprobado que la comunicacion MQTT arduino raspberry pi IoT es el estándar indiscutible para garantizar transmisiones rápidas, ligeras y confiables en canales inestables. En esta guía completa, te enseñaré a configurar un broker local en Raspberry Pi y un emisor WiFi en Arduino.

Publicidad

¿Qué es MQTT y por qué es el protocolo estándar del IoT?

MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería asíncrono y extremadamente ligero de tipo publicador-suscriptor. Fue diseñado originalmente en 1999 para monitorear oleoductos a través de conexiones satelitales inestables y caras. Su arquitectura minimiza drásticamente el tráfico de red, lo que permite a microcontroladores pequeños transmitir datos de sensores usando paquetes de apenas unos pocos bytes.

La gran ventaja de MQTT sobre HTTP es su eficiencia. HTTP requiere establecer un canal TCP robusto por cada consulta de datos e intercambiar cabeceras redundantes. En cambio, en MQTT la sesión permanece abierta en segundo plano mediante el envío de pequeños pings periódicos (keepalive), lo que optimiza enormemente el consumo energético del hardware de control, factor clave cuando operamos sensores con baterías recargables.

Arquitectura: broker, publisher y subscriber

El núcleo de la comunicación MQTT reside en el intermediario conocido como Broker. Los dispositivos no se comunican directamente entre sí; en su lugar, todos se conectan a este servidor central. El broker es responsable de recibir todos los mensajes entrantes, filtrarlos y distribuirlos a los clientes que hayan expresado interés en ellos de forma selectiva.

Un dispositivo que envía información de sensores actúa como Publisher (Publicador). Envía datos asociados a una etiqueta jerárquica de texto denominada Topic (Tópico), por ejemplo oficina/sensor1/temperatura. Por otro lado, los dispositivos que desean procesar esa información actúan como Subscribers (Suscriptores) de ese tópico. El broker se encarga de retransmitir el mensaje de forma instantánea en cuanto un publicador emite nuevos datos.

Instalar y configurar Mosquitto en la Raspberry Pi

Para implementar nuestro propio servidor local IoT en casa, utilizaremos una Raspberry Pi como el broker MQTT de nuestra red. Mosquitto es el software de broker más eficiente de código abierto para sistemas basados en Linux. Para instalarlo, abre una consola de terminal en tu Raspberry Pi y ejecuta los comandos de actualización del sistema debian correspondientes.

Una vez instalado el paquete mosquitto y mosquitto-clients, debemos configurarlo para permitir conexiones inalámbricas desde microcontroladores externos (como placas ESP8266 o ESP32). Para ello, edita el archivo de configuración /etc/mosquitto/mosquitto.conf y añade la directiva de escucha en el puerto por defecto 1883 y autoriza el acceso anónimo (allow_anonymous true) para las pruebas en red interna antes de encriptar el tráfico con TLS.

Configurar Arduino como publisher con ESP8266

Para enviar la información desde la perspectiva del microcontrolador, utilizaremos una placa de desarrollo NodeMCU basada en el chip ESP8266, la cual cuenta con soporte WiFi y es compatible con el IDE de Arduino. Instalaremos la librería 'PubSubClient' de Nick O'Leary, que es la más óptima para gestionar conexiones TCP estables.

El código configurará la conexión del módulo al enrutador local mediante el protocolo WiFi. A continuación, el microcontrolador iniciará sesión en el broker de la Raspberry Pi usando su dirección IP local de red. Cada 10 segundos, leerá el valor de temperatura del sensor y lo publicará en el tópico jerárquico que elijamos.

Configurar Raspberry Pi como subscriber con Python

En el lado del receptor (la Raspberry Pi), programaremos un pequeño script en Python que corra en segundo plano para escuchar continuamente los datos enviados por la placa Arduino. Usaremos la librería cliente oficial de la fundación eclipse llamada paho-mqtt.

El script de Python se conectará al broker local en la dirección IP localhost y se suscribirá al tópico configurado por el Arduino. Mediante funciones callback de retorno, el script detectará la llegada de un nuevo mensaje, decodificará el buffer binario a string y mostrará la lectura en consola o la almacenará en una base de datos local para análisis posterior.

Código completo para Arduino y Python

Aquí tienes los dos archivos de código necesarios para poner en marcha el sistema:

Código Arduino (Publisher - ESP8266):


#include 
#include 

const char* ssid = "Tu_Nombre_WiFi";
const char* password = "Tu_Clave_WiFi";
const char* broker_ip = "192.168.100.50"; // IP de la Raspberry Pi

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("
WiFi Conectado!");
  client.setServer(broker_ip, 1883);
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Conectando a broker MQTT...");
    if (client.connect("ESP8266_Sensor")) {
      Serial.println("Conectado!");
    } else {
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // Publicar dato estatico de temperatura
  float temp = 24.5; // Aqui puedes leer un DHT11
  char payload[8];
  dtostrf(temp, 6, 2, payload);
  client.publish("casa/sala/temperatura", payload);
  
  delay(10000);
}
  

Código Python (Subscriber - Raspberry Pi):


# Instalar paho-mqtt usando: pip install paho-mqtt
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Conectado con codigo de resultado: " + str(rc))
    client.subscribe("casa/sala/temperatura")

def on_message(client, userdata, msg):
    print(f"Topico: {msg.topic} | Mensaje: {msg.payload.decode('utf-8')} °C")

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("localhost", 1883, 60)
client.loop_forever()
  

El código de Arduino maneja la reconexión de forma automática si la señal de red inalámbrica experimenta caídas, mientras que el bucle continuo en Python previene la terminación del proceso de escucha.

Errores comunes y cómo solucionarlos

Un fallo sumamente frecuente es que la placa de desarrollo de Arduino no logre conectarse al broker local y la consola de depuración imprima un código de error como -2 o -4 de forma indefinida. Esto se debe a que la configuración del firewall en la Raspberry Pi está bloqueando el tráfico entrante a través de la interfaz de red inalámbrica, o a que el archivo mosquitto.conf no tiene declarada de forma explícita la regla de red para permitir conexiones en el puerto 1883 de interfaces que no sean locales.

Otro error crítico es usar el mismo identificador de cliente (Client ID) para ambos dispositivos. En mi experiencia trabajando con redes IoT complejas en Ecuador, si le asignas el nombre "Cliente_Prueba" tanto a la Raspberry Pi como al NodeMCU, el broker desconectará cíclicamente a uno en cuanto intente ingresar el otro, causando desconexiones intermitentes muy difíciles de rastrear. Asegúrate de configurar IDs de conexión únicos y descriptivos.

Conclusión

Implementar una red local basada en MQTT es la base fundamental del IoT industrial moderno. La combinación de la potencia de procesamiento de la Raspberry Pi y la simplicidad de Arduino y el ESP8266 permite estructurar soluciones de telemetría de nivel profesional de forma sumamente económica.

¿Necesitas implementar esto en un proyecto real? Revisa mis servicios de desarrollo o contáctame directamente.

Wagner Herrera - Desarrollador de Software
Wagner Herrera

Desarrollador de software con experiencia en aplicaciones web y sistemas embebidos. Apasionado por convertir ideas en productos electrónicos y digitales funcionales.

GitHub · Sobre mí
Publicidad