29/11/2024
En el vasto universo del Internet de las Cosas (IoT), la comunicación eficiente y de bajo consumo es clave. Para dispositivos con recursos limitados como las placas Arduino, el protocolo MQTT (Message Queuing Telemetry Transport) se ha consolidado como una solución ideal. Su diseño ligero, basado en un modelo de publicación/suscripción, permite que pequeños sensores y actuadores se comuniquen de manera efectiva con servidores en la nube o con otros dispositivos.

Elegir la librería MQTT adecuada para tu proyecto Arduino puede marcar una gran diferencia en la facilidad de desarrollo y el rendimiento. En este artículo, exploraremos dos de las opciones más populares y robustas: PubSubClient y lwmqtt, desglosando sus características, ventajas y casos de uso para ayudarte a tomar la mejor decisión.
El protocolo MQTT opera bajo un modelo centralizado donde un “broker” (servidor) actúa como intermediario. Los clientes se conectan al broker y pueden “publicar” mensajes sobre un “tópico” específico o “suscribirse” a tópicos para recibir mensajes. Esta arquitectura desacoplada reduce la complejidad y el consumo de recursos en los dispositivos finales, haciendo de MQTT la elección preferida para aplicaciones IoT que requieren eficiencia energética y bajo ancho de banda.
PubSubClient: El Veterano Confiable
La librería PubSubClient, creada por Nick O'Leary, es quizás la librería MQTT más utilizada en el ecosistema Arduino. Su popularidad se debe a su simplicidad, robustez y una amplia compatibilidad con una variedad de hardware de red. Ha sido la opción predeterminada para muchos desarrolladores que buscan integrar sus proyectos Arduino con servicios MQTT.
Características Clave de PubSubClient:
- Modelo de Mensajería: Permite realizar operaciones de publicación y suscripción de manera sencilla. Los mensajes se envían y reciben a través de tópicos específicos, lo que facilita la organización de la comunicación en proyectos complejos.
- Calidad de Servicio (QoS): Un aspecto crucial de MQTT es la Calidad de Servicio, que define la garantía de entrega de un mensaje. PubSubClient tiene algunas limitaciones en este aspecto:
- Puede publicar mensajes con QoS 0 (At Most Once): Los mensajes se envían una sola vez y no hay garantía de entrega. Es la opción más rápida y con menor sobrecarga.
- Puede suscribirse a tópicos con QoS 0 o QoS 1 (At Least Once): Con QoS 1, el mensaje se entrega al menos una vez, y si no se recibe una confirmación, el broker lo reenvía. Esto ofrece mayor fiabilidad a costa de un poco más de tráfico.
Esta limitación en la publicación de mensajes a QoS 0 es importante a considerar para aplicaciones donde la entrega garantizada es crítica.
- Versión de MQTT: Por defecto, PubSubClient utiliza la versión MQTT 3.1.1, que es el estándar actual y más robusto del protocolo. Sin embargo, ofrece la flexibilidad de configurarse para usar la versión anterior MQTT 3.1, lo cual puede ser útil para compatibilidad con brokers o sistemas más antiguos. Esta configuración se realiza modificando el valor de
MQTTVERSIONen el archivoPubSubClient.h. - Tamaño Máximo del Mensaje: Por defecto, el tamaño máximo de un mensaje (incluyendo la cabecera) está limitado a 256 bytes. Esta limitación puede ser un factor importante para proyectos que necesiten enviar cargas de datos más grandes. Afortunadamente, este valor es configurable. Puedes aumentarlo modificando
MQTTMAXPACKETSIZEenPubSubClient.ho llamando aPubSubClient::setBufferSize(size)en tu código. - Intervalo Keep-Alive: El protocolo MQTT utiliza un mecanismo de "keep-alive" para mantener la conexión activa y detectar si un cliente se desconecta inesperadamente. Por defecto, PubSubClient establece un intervalo de 15 segundos. Este valor también es configurable a través de
MQTTKEEPALIVEenPubSubClient.ho mediante la funciónPubSubClient::setKeepAlive(keepAlive). Un intervalo más largo reduce el tráfico de red pero aumenta el tiempo para detectar una desconexión.
Compatibilidad de Hardware de PubSubClient:
Una de las grandes fortalezas de PubSubClient es su amplia compatibilidad con una variedad de hardware que implementa la API de cliente Ethernet de Arduino. Esto significa que funciona sin problemas con:
- Arduino Ethernet
- Arduino Ethernet Shield
- Arduino YUN (utilizando
YunClienten lugar deEthernetClienty asegurándose de inicializarBridge.begin()primero) - Arduino WiFi Shield (para paquetes de más de 90 bytes, se recomienda habilitar
MQTTMAXTRANSFERSIZEenPubSubClient.h) - Sparkfun WiFly Shield
- TI CC3000 WiFi
- Intel Galileo/Edison
- ESP8266
- ESP32
Es importante destacar que PubSubClient no es compatible con hardware basado en el chip ENC28J60, como Nanode o Nuelectronics Ethernet Shield. Para estos casos, existen librerías alternativas disponibles.

lwmqtt: El Envoltorio Robusto y Versátil
La librería lwmqtt se presenta como una opción moderna y altamente compatible para integrar MQTT en tus proyectos Arduino. A diferencia de PubSubClient, lwmqtt no es una implementación de cliente MQTT desde cero, sino que "envuelve" un cliente lwmqtt existente, añadiendo una capa delgada para proporcionar una API similar a la de Arduino. Esto aprovecha la robustez y las características del cliente lwmqtt subyacente.
Características Clave de lwmqtt:
- API Arduino-like: La principal ventaja de lwmqtt es que ofrece una interfaz de programación muy familiar para los desarrolladores de Arduino, lo que facilita su adopción y uso en proyectos existentes.
- Compatibilidad Universal: Una de las diferencias más notables con PubSubClient es que lwmqtt se declara compatible con todas las arquitecturas. Esto significa que deberías poder usarla en prácticamente cualquier placa Arduino o compatible, sin las restricciones específicas de hardware que a veces se encuentran en otras librerías. Esta universalidad la convierte en una opción muy atractiva para proyectos que necesitan ser portables entre diferentes plataformas de microcontroladores.
- Robustez Subyacente: Al ser un "wrapper" o envoltorio de un cliente lwmqtt, hereda la robustez y las características completas del cliente original, que suelen incluir un soporte más completo para los diferentes niveles de QoS (0, 1 y 2) y otras funcionalidades avanzadas del protocolo MQTT. Aunque la información proporcionada no detalla explícitamente el soporte de QoS para la versión Arduino, el cliente lwmqtt en sí mismo es conocido por su implementación completa.
La información proporcionada sobre lwmqtt es más concisa, pero su promesa de compatibilidad universal y su naturaleza de "wrapper" sugieren una solución moderna y eficiente.
Comparativa: PubSubClient vs. lwmqtt
Para ayudarte a visualizar las diferencias y similitudes entre estas dos potentes librerías, hemos preparado una tabla comparativa:
| Característica | PubSubClient | lwmqtt |
|---|---|---|
| Estilo API | Arduino-like, muy familiar | Arduino-like (mediante un 'wrapper') |
| Compatibilidad Arquitectura | Amplia, pero con excepciones (ej. ENC28J60) y lista específica de hardware. | Compatible con todas las arquitecturas Arduino y compatibles. |
| Versión MQTT | 3.1.1 por defecto, configurable a 3.1 | (No especificado, pero el cliente lwmqtt soporta versiones modernas) |
| Soporte QoS | Publica QoS 0, Suscribe QoS 0 o 1 | (No especificado para el wrapper, pero el cliente lwmqtt suele soportar QoS 0, 1 y 2) |
| Tamaño Máx. Mensaje | 256 bytes por defecto (configurable) | (No especificado para el wrapper) |
| Keep-Alive | 15 segundos por defecto (configurable) | (No especificado para el wrapper) |
| Maturidad / Uso | Extremadamente madura y ampliamente utilizada. | Más reciente, prometedora por su versatilidad. |
| Documentación | Extensa y bien establecida. | Probablemente buena, heredada del cliente lwmqtt. |
Eligiendo la Librería Adecuada
La elección entre PubSubClient y lwmqtt dependerá en gran medida de los requisitos específicos de tu proyecto y de tu hardware:
- Si tu proyecto utiliza hardware ampliamente soportado por PubSubClient (como ESP32, ESP8266, Arduino Ethernet, etc.) y tus necesidades de QoS se limitan a 0 o 1, PubSubClient sigue siendo una opción excelente y muy confiable. Su vasta comunidad y la cantidad de ejemplos disponibles facilitan el desarrollo. Es ideal para la mayoría de los proyectos IoT estándar donde la simplicidad y la fiabilidad probada son prioritarias.
- Si la compatibilidad universal con diferentes arquitecturas es una prioridad absoluta, o si sospechas que podrías necesitar características más avanzadas de MQTT (como QoS 2, si el cliente lwmqtt las expone a través de su wrapper), entonces lwmqtt podría ser la mejor opción. Su enfoque como "wrapper" sugiere una base más moderna y posiblemente más flexible para futuras expansiones del protocolo.
- Para proyectos donde el tamaño del mensaje o el intervalo de keep-alive son críticos y necesitan ser ajustados con precisión, PubSubClient ofrece métodos claros y bien documentados para configurarlos. Si lwmqtt no expone estas configuraciones directamente en su API de Arduino, podría requerir una inmersión más profunda en el cliente subyacente.
En última instancia, ambas librerías son herramientas valiosas para conectar tus proyectos Arduino al mundo MQTT. La mejor manera de decidir es probar ambas con tu hardware específico y tus requisitos de aplicación para ver cuál se adapta mejor a tus necesidades.
Preguntas Frecuentes (FAQ)
A continuación, respondemos algunas de las preguntas más comunes relacionadas con el uso de MQTT y estas librerías en Arduino:
¿Qué es el protocolo MQTT y por qué es bueno para Arduino?
MQTT es un protocolo de mensajería ligero, diseñado para dispositivos con recursos limitados y redes de baja latencia o inestables. Es ideal para Arduino porque consume poca energía y ancho de banda, permitiendo que tus proyectos envíen y reciban datos de manera eficiente sin sobrecargar el microcontrolador ni la conexión de red. Su modelo de publicación/suscripción también simplifica la lógica de comunicación.

¿Qué diferencia hay entre QoS 0 y QoS 1 en MQTT?
QoS 0 (At Most Once): Significa que el mensaje se envía una sola vez y no hay confirmación de entrega. Es el más rápido y ligero, pero puede perder mensajes si la red es inestable. Es adecuado para datos no críticos, como lecturas de temperatura frecuentes.
QoS 1 (At Least Once): El mensaje se entrega al menos una vez. El receptor envía una confirmación (ACK). Si el remitente no recibe el ACK, reenvía el mensaje. Esto asegura que el mensaje llegue, aunque podría duplicarse. Es útil para datos importantes que no pueden perderse, como comandos de encendido/apagado.
¿Puedo usar PubSubClient con una placa ESP32 o ESP8266?
¡Sí, absolutamente! PubSubClient es compatible de forma nativa con las placas ESP32 y ESP8266, ya que estas utilizan una implementación de cliente WiFi que se integra perfectamente con la API de red de Arduino que PubSubClient espera. De hecho, son plataformas muy populares para proyectos IoT con PubSubClient.
¿Qué hago si mi mensaje MQTT es más grande que 256 bytes con PubSubClient?
Si necesitas enviar mensajes más grandes que el límite predeterminado de 256 bytes de PubSubClient, puedes configurar el tamaño máximo del paquete de dos maneras:
- Editando el archivo
PubSubClient.hy cambiando el valor deMQTTMAXPACKET_SIZEa un número mayor. - Llamando a la función
PubSubClient::setBufferSize(size)en tu código antes de conectar al broker. Asegúrate de que el tamaño que elijas sea compatible con la memoria disponible en tu placa Arduino.
¿Es lwmqtt una alternativa superior a PubSubClient?
No necesariamente "superior", sino una alternativa con diferentes fortalezas. lwmqtt destaca por su compatibilidad con todas las arquitecturas de Arduino y por ser un envoltorio de un cliente MQTT robusto, lo que puede implicar un soporte más completo de características avanzadas del protocolo. PubSubClient, por otro lado, es extremadamente maduro, tiene una comunidad enorme y es una opción probada para la mayoría de los casos de uso estándar con hardware específico. La elección dependerá de las prioridades de tu proyecto.
Si quieres conocer otros artículos parecidos a MQTT para Arduino: PubSubClient y lwmqtt puedes visitar la categoría Librerías.
