What is lwmqtt library?

MQTT para Arduino: PubSubClient y lwmqtt

29/11/2024

Valoración: 4.48 (7201 votos)

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.

What version of MQTT does PubSub client use?
The client uses MQTT 3.1.1 by default. It can be changed to use MQTT 3.1 by changing value of MQTT_VERSION in PubSubClient.h. The library uses the Arduino Ethernet Client api for interacting with the underlying network hardware. This means it Just Works with a growing number of boards and shields, including:

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.

Índice de Contenido

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 MQTTVERSION en el archivo PubSubClient.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 MQTTMAXPACKETSIZE en PubSubClient.h o llamando a PubSubClient::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 MQTTKEEPALIVE en PubSubClient.h o mediante la función PubSubClient::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 YunClient en lugar de EthernetClient y asegurándose de inicializar Bridge.begin() primero)
  • Arduino WiFi Shield (para paquetes de más de 90 bytes, se recomienda habilitar MQTTMAXTRANSFERSIZE en PubSubClient.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.

What is lwmqtt library?
This library bundles the lwmqtt client and adds a thin wrapper to get an Arduino like API. This library is compatible with all architectures so you should be able to use it on all the Arduino boards. Was this article helpful?

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ísticaPubSubClientlwmqtt
Estilo APIArduino-like, muy familiarArduino-like (mediante un 'wrapper')
Compatibilidad ArquitecturaAmplia, pero con excepciones (ej. ENC28J60) y lista específica de hardware.Compatible con todas las arquitecturas Arduino y compatibles.
Versión MQTT3.1.1 por defecto, configurable a 3.1(No especificado, pero el cliente lwmqtt soporta versiones modernas)
Soporte QoSPublica 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. Mensaje256 bytes por defecto (configurable)(No especificado para el wrapper)
Keep-Alive15 segundos por defecto (configurable)(No especificado para el wrapper)
Maturidad / UsoExtremadamente madura y ampliamente utilizada.Más reciente, prometedora por su versatilidad.
DocumentaciónExtensa 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.

What MQTT protocol is supported by a ti cc3000?
It supports the latest MQTT 3.1.1 protocol and can be configured to use the older MQTT 3.1 if needed. It supports all Arduino Ethernet Client compatible hardware, including the Intel Galileo/Edison, ESP8266 and TI CC3000. A client library for MQTT messaging.

¿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.h y cambiando el valor de MQTTMAXPACKET_SIZE a 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.

Subir