Breve Introducción a MQTT y Mosquitto

Última actualización: 21/09/2020

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 de MQTT se encuentran los siguientes puntos:

  • Tiene una API muy simple, que permite desarrollar aplicaciones de forma ágil y rápida
  • Es un protocolo ligero, pensado para usarse en dispositivos con pocos recursos, malas latencias y conectividad
  • Está ampliamente extendido en proyectos IoT

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 del protocolo MQTT 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        = "MQTT Examples";
            String content      = "Message from MqttPublishSample";
            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 de MQTT 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

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.

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


¡Echa un ojo a mi lista de reproducción de Big Data en Youtube!

Si te ayuda el contenido del blog, por favor considera unirte a la lista de correo para reconocer el trabajo!

Deja una respuesta