Introducción a MQTT y Mosquitto

  • Tiempo de lectura:12 minutos de lectura
  • Autor de la entrada:
  • Última modificación de la entrada:14/07/2024

En este post realizo una breve introducción al popular protocolo de mensajería MQTT, sus características más importantes y su implementación en Mosquitto.

Qué es MQTT y Mosquitto

¿Qué es MQTT?

MQTT es un protocolo de tipo suscriptor-publicador muy ligero. Generalmente, este protocolo se usa para intercambiar mensajes entre dispositivos con unos recursos limitados como memoria o ancho de banda. Estos dispositivos pueden ser sensores IoT o incluso una Raspberry Pi.

La implementación está realizada sobre el protocolo TCP/IP teniendo en cuenta estos recursos limitados y posibles problemas en la conectividad y en la red. En la actualidad, se ha convertido en la solución estándar de la industria para dispositivos IoT.

Hay muchos proyectos de software que implementan este protocolo. Entre los más usados se encuentra Mosquitto o RabbitMQ.

Ventajas

Entre las ventajas del protocolo MQTT se encuentran los siguientes puntos:

Inconvenientes

También debemos considerar los inconvenientes de esta tecnología antes de adoptarla como solución en nuestros sistemas:

  • Los brokers no escalan tan bien como otros sistemas y no se incluye buffering
  • No incorpora capacidades de procesamiento de datos
  • El reprocesamiento de eventos no está contemplado

Clientes MQTT

Existen numerosas implementaciones este protocolo para los lenguajes de programación Java o Python. A continuación, se explica un ejemplo sencillo a modo de tutorial.

En Java, puedes empezar a implementar tus proyectos con el cliente Paho, que proporciona interfaces síncronas y asíncronas. Lo puedes encontrar como dependencia de Maven para importar al proyecto fácilmente:

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.5</version>
</dependency>

Aquí un ejemplo básico extraído de la documentación oficial. En este ejemplo, nos conectamos al servidor y publicamos un mensaje usando la API síncrona.

        import org.eclipse.paho.client.mqttv3.MqttClient;
        import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
        import org.eclipse.paho.client.mqttv3.MqttException;
        import org.eclipse.paho.client.mqttv3.MqttMessage;
        import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

        public class MqttPublishSample {

        public static void main(String[] args) {

            String topic        = "Examples";
            String content      = "Contenido del mensaje";
            int qos             = 2;
            String broker       = "tcp://mqtt.eclipse.org:1883";
            String clientId     = "JavaSample";
            MemoryPersistence persistence = new MemoryPersistence();

            try {
                MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
                MqttConnectOptions connOpts = new MqttConnectOptions();
                connOpts.setCleanSession(true);
                System.out.println("Connecting to broker: "+broker);
                sampleClient.connect(connOpts);
                System.out.println("Connected");
                System.out.println("Publishing message: "+content);
                MqttMessage message = new MqttMessage(content.getBytes());
                message.setQos(qos);
                sampleClient.publish(topic, message);
                System.out.println("Message published");
                sampleClient.disconnect();
                System.out.println("Disconnected");
                System.exit(0);
            } catch(MqttException me) {
                System.out.println("reason "+me.getReasonCode());
                System.out.println("msg "+me.getMessage());
                System.out.println("loc "+me.getLocalizedMessage());
                System.out.println("cause "+me.getCause());
                System.out.println("excep "+me);
                me.printStackTrace();
            }
        }
    }

Mosquitto Broker

Si quieres probar Mosquitto fácilmente, puedes ejecutar la imagen oficial de Docker con el siguiente comando, que ejecutará un broker de Mosquitto en el puerto 1883 de la máquina.

docker run -it -p 1883:1883 -p 9001:9001 eclipse-mosquitto:latest

Una vez ejecutando, podemos escribir mensajes simplemente especificando el tema al que queremos suscribirnos:

mosquitto_sub -t mqtt/test
mosquitto_pub -t mqtt/test -m "Hello MQTT"

MQTT y Kafka

Apache Kafka es un sistema mucho más robusto y escalable, que combina el almacenamiento con el procesamiento de eventos en tiempo real (Kafka Streams). Además, incorpora alta disponibilidad y muy baja latencia.

Sin embargo, ambas soluciones tienen casos de uso específicos. No debemos reducir la comparativa a MQTT vs Kafka. Apache Kafka necesita una infraestructura y red sólida para funcionar correctamente pero MQTT solventa el caso de uso de IoT, soportando muchas más conexiones simultáneas y siendo más ligero.

MQTT Kafka Integración
Escenarios de integración de MQTT y Kafka

En el caso de necesitar ambas soluciones, existen opciones para interconectar sistemas que implementan el protocolo MQTT con Kafka. Confluent dispone de un conector para Kafka Connect para enviar y recibir datos de un broker MQTT.

Si no se requiere un broker para implementar la solución, podemos usar un proxy que traduzca la comunicación del dispositivo a Kafka, como muestro en la imagen anterior.

Conclusión y Formación Recomendada

En este post, hemos introducido MQTT: un protocolo ligero y potente para implementar soluciones con un broker de mensajería para aplicaciones IoT. Es compatible con varios brokers como Mosquitto y RabbitMQ. Además, se puede usar junto a Kafka usando alguno de los conectores disponibles.

Además, te recomiendo hacer los siguientes cursos:

Curso fundamentos IoT con Raspberry Pi

Fundamentos IoT con Raspberry Pi y MQTT

Curso en español que te guiará en el aprendizaje de IoT con proyectos en Raspberry Pi y con este protocolo. Presenta varios modelos y ejemplos prácticos en más de 6 horas de vídeo.

curso Mastering MQTT

Mastering MQTT

Con este curso aprenderás MQTT desde cero montando un proyecto práctico con una Raspberry Pi. No necesitarás conocimientos previos teóricos para seguir las explicaciones.

Si aún quieres aprender más, echa un ojo a estos libros:

Preguntas Frecuentes MQTT – FAQ

¿Para qué se usa MQTT?

MQTT es un protocolo de mensajería ideal para aplicaciones IoT como sensores, debido a sus limitaciones de conectividad, ancho de banda, consumo o memoria. También está presente en muchas aplicaciones de mensajería instantánea.

¿Cómo funciona MQTT?

MQTT implementa un protocolo de tipo editor suscriptor asíncrono, en el que puede existir un broker intermedio con topics sobre el que los editores publican los mensajes y los consumidores los leen.

¿Qué brokers existen para MQTT?

MQTT define el protocolo de mensajería. Este protocolo se puede implementar con distintas tecnologías sobre los brokers y los clientes. Algunas de estas tecnologías son Mosquitto, RabbitMQ o EMQ.


A continuación, un breve vídeo-resumen. ¡No te lo pierdas!


Esta entrada tiene 2 comentarios

  1. Pedro Lorca Gomariz

    Oscar. Cuantos clientes podría soportar mosquitto?

    1. Oscar Fernandez

      Hola Pedro, depende mucho de la configuración y del hardware. Generalmente, puede soportar miles de clientes sin problema. También puedes ajustar el número máximo de conexiones en la configuración (max_connections).

Deja una respuesta