Este post tiene como objetivo la instalación del programa Eclipse Mosquitto. Para ello se supondrá un sistema GNU/Linux (en concreto Ubuntu 18.10). También se explorarán los conceptos fundamentales del protocolo MQTT, usado por Mosquitto.
¿Qué es MQTT?
MQTT son las siglas de _Message Queuing Telemetry Transport_, un protocolo ligero de mensajería entre dispositivos M2M, ideado por IBM y orientado principalmente a dispositivos de pocos recursos como pueden ser placas Arduino con sensores.
MQTT usa el protocolo de transporte TCP, y tiene varios puertos reservados:
- 1883: MQTT, no encriptado
- 8883: MQTT, encriptado
- 8884: MQTT, encriptado, necesario certificado por parte del cliente
- 8080: MQTT sobre WebSockets, no encriptado
- 8081: MQTT sobre WebSockets, encriptado
Toda la información sobre la reserva de dichos puertos se puede encontrar en la página de _Internet Assigned Numbers Authority_.
Estos puertos es útil tenerlos en mente ya que por defecto Mosquitto va a iniciarse en alguno de estos, dependiendo de como estemos ejecutándolo, el más común es el primero. Es posible usar otro puerto con la opción _-p_.
Hay principalmente dos clases de hosts en este protocolo, los clientes y el broker, que cada uno se caracteriza por:
- Los clientes son los dispositivos que recogen la información y la envían al broker para que la procese.
- El broker actúa basicamente de un servidor. Se encarga de recibir y procesar los datos que le envían los distintos tipos de clientes y distribuye dichos mensajes hasta los sensores que se hayan suscrito a cierto _topic_.
Como se puede ver en la imagen, lo común es tener solo un broker y varios clientes (en este caso 4). Las flechas representan los mensajes intercambiados, donde la flecha discontinua es un mensaje del cliente al broker (publicación) y la flecha continua un mensaje del broker al cliente (suscripción).
En el párrafo anterior se han visto dos términos que seguramente no hayan pasado desapercibidos (o no deberían). Estos son los de publicación y suscripción. Son los dos tipos de mensajes aceptados por MQTT. Un cliente puede *publicar* en cualquier momento que quiera un mensaje. Para ello debe de especificar el _topic_, “el tema de conversación” . Además, cada cliente puede *suscribirse* a los _topic_ que quiera, estos _topic_ serán los únicos que le lleguen.
El broker debe (o suele) tener una dirección IP estática conocida (la de la imagen es ficticia), dado que los clientes deben saber a quién enviar los mensajes y de quién recibirlos.
Servicio de calidad (QOS)
Dependiendo de la finalidad que queramos para nuestros mensajes, podemos especificar distintos niveles de calidad dependiendo del rendimiento o fiabilidad que querramos.
– QOS 0: no garantiza que el mensaje llegue a su destino. La más rápida y sencilla. *Por defecto*.
– QOS 1: garantiza que el mensaje llega a su destino pero puede haber duplicados del mismo mensaje.
– QOS 2: el mensaje llega a su destino y además no existen duplicados. Es el método más lento.
Instalación de Mosquitto
Eclipse Mosquitto está disponible tanto para GNU/Linux como para Windows o MacOS. En su página de descargas se encuentran los binarios y las instrucciones para su instalación. Aquí solo se van a explicar las instrucciones para Ubuntu.
Mosquitto no está disponible en los repositorios oficiales de Ubuntu, por lo que hay que añadir su PPA:
# apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
Después actualizamos el sistema e instalamos:
# apt update && apt upgrade -y && apt install mosquitto -y && apt install mosquitto-clients -y
Mensajes
Como se ha explicado en el apartado _¿Qué es MQTT?_, el protocolo MQTT usa mensajes para comunicarse entre los distintos dispositivos. Ahora veamos las órdenes a ejecutar para enviar mensajes y suscribirse a un tema en concreto.
Caracteres especiales
El _+_ y la _#_ son dos caracteres especiales que tienen un funcionamiento parecido al asterisco (*) en un sistema UNIX pero con alguna diferencia: ‘+’ : se sustituye por cualquier nivel. Por ejemplo, si queremos mandar un mensaje a todas las bombillas de una casa (donde las bombillas se llaman bombilla): `/casa/+/bombilla`. Todas las bombillas deberán estar suscritas a dicho _topic_. ‘#’ : solo se sustituye por niveles inferiores. Por ejemplo, si queremos mandar un mensaje a todos los dispositivos de la misma habitación (cocina, por ejemplo): `/casa/cocina/#`. Todas los dispositivos deberán estar suscritas a dicho _topic_.
Publicación
Para publicar (enviar) un mensaje hay que especificar varios valores obligatorios:
- _-h_: especifica la dirección del broker. Puede ser tanto un nombre de alias como una dirección IP. Ejemplo: `-h test.mosquitto.org`.
- _-t_: dice el _topic_ del mensaje. Debe de ir entrecomillado.
- _-m_: el propio mensaje en sí. También debe de ir entre comillas.
Existen algunas opciones más que pueden ser útiles como _-p_ para especificar el puerto o _-q_ para decidir la calidad (QOS). Se pueden ver todas las opciones ejecutando `man mosquitto_pub`.
Por lo tanto un ejemplo de mensaje de encendido desde cada una de las bombillas del salón, suponiendo que hay 3 bombillas y se encuentran en _/casa/salon/bombilla/i_, donde i={1,2,3} sería: `mosquitto_pub -h test.mosquitto.org -t “/casa/salon/bombilla/i” -m “Bombilla i: ON”`.
En la imagen se han mandado 3 mensajes distintos, los primeros para “encender” y el último para “apagar”.
Suscripción
Cada dispositivo recibe solo los mensajes a los cuales está suscrito. Igual que en el caso de la publicación, tiene varios valores obligatorios para que funcione correctamente:
- _-h_: broker del que esperamos recibir los mensajes.
- _-t_: _topic_ al que nos queramos suscribir.
Lógicamente, como en la publicación, existen muchas opciones más disponibles a través de `man mosquitto_sub`.
Siguiendo el ejemplo de las bombillas del salón, cada bombilla tendrá su identificación en el salón. Imaginemos que tenemos 3 bombillas, por lo tanto cada una de ellas se suscribirá a _/casa/salon/bombilla/i_ donde i={1,2,3}.
El código para la bombilla 1, será: `mosquitto_sub -h test.mosquitto.org -t “/casa/salon/bombilla/1″`.
En la imagen se pueden ver los mensajes de todas las bombillas del salón, dado el _topic_ al cual se ha suscrito.
Puertos
Para permitir el tráfico desde nuestros clientes, debemos de configurar el Firewall de [Clouding.io](https://clouding.io/) para permitir el tráfico de datos a ciertos puertos. Como se ha explicado en el apartado _¿Qué es MQTT?_, este protocolo usa ciertos puertos por defecto. Para el caso que nos ocupa, dado que no usamos WebSockets ni una conexión encriptada, El puerto que debemos abrir es el 1883, con el protocolo TCP, como muestra la siguiente imagen:
Aviso Importante
En varios de los ejemplos anteriores se ha usado la dirección http://test.mosquitto.org para el broker. Esta dirección es la que tiene Eclipse Mosquitto para hacer pruebas y cualquier persona puede leer lo que se mande, por lo que no es recomendable enviar información sensible. Además, solo es usable para fines de desarrollo ya que un uso intensivo de dicho servidor puede hacer caer el broker.
Documentación
Toda la documentación oficial de Eclipse Mosquitto se puede encontrar en su página web. Aparte de los comandos `man` que se han ido comentando a lo largo del artículo (disponibles también en dicha web).
Además hay documentación sobre el protocolo MQTT en http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html.