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.
Contenidos
¿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:
- 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 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.
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:
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.
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!
Oscar. Cuantos clientes podría soportar mosquitto?
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).