Primeros Pasos con MQTT

Ricardo Vega / 07 abril 2016
⏰ 5 minutos
Ya en varias ocasiones he mostrado mi predisposición a incluir dentro del blog artículos donde llevemos a cabo implementaciones reales de aplicaciones del Internet de las Cosas.
Sin duda, si queremos llevar a cabo tareas de este estilo, debemos conocer el que a día de hoy se perfila como el principal protocolo disponible para el IoT; debemos conocer perfectamente MQTT.
El conocimiento completo de un protocolo no es una tarea sencilla y requiere de bastante dedicación. En este artículo vamos a ver los primeros pasos que nos servirán para empezar a trabajar sobre él.
¿Qué es MQTT?
MQTT son las siglas de Message Queue Telemetry Transport y tras ellas se encuentra un protocolo ideado por IBM y liberado para que cualquiera podamos usarlo enfocado a la conectividad Machine-to-Machine (M2M) de la cual ya hemos hablado en este blog.
Está enfocado al envío de datos en aplicaciones donde se requiere muy poco ancho de banda. Además, sus características le permiten presumir de tener un consumo realmente bajo así como precisar de muy pocos recursos para su funcionamiento.
Estas características han hecho que rápidamente se convierta en un protocolo muy empleado en la comunicación de sensores y, consecuentemente, dentro del Internet de las Cosas.
Arquitectura MQTT
En cuanto a su arquitectura, sigue una topología en estrella, donde existe un nodo central o broker con capacidad para trabajar con un gran número de clientes.
Es precisamente el broker el elemento encargado de gestionar la red y transmitir los mensajes.
Una caracterísitica interesante es la capacidad de MQTT para establecer comunicaciones cifradas lo que aporta a nuestra red una capa extra de seguridad.
Dentro de la arquitectura de MQTT, es muy importante el concepto "topic" o "tema" en español ya que a través de estos "topics" se articula la comunicación puesto que emisores y receptores deben estar subscritos a un "topic" común para poder entablar la comunicación. Este concepto es prácticamente el mismo que se emplea en colas, donde existen un publicadores (que publican o emiten información) y unos subscritores (que reciben dicha información) siempre que ambas partes estén subscritas a la misma cola.
Este tipo de arquitecturas, lleva asociada otra interesante característica: la comunicación puede ser de uno a uno o de uno a muchos.
Además, los "topics" tienen una estructura jerárquica gracias a la cual podemos establecer relaciones padre-hijo y, al subscribirnos a un topic padre, recibir también la información de sus hijos.
Como un ejemplo vale más que mil palabras, si tenemos una arquitectura como la del siguiente diagrama:
Si estamos subscritos a Salón, recibiremos toda la información que recolecten Arduino1 y Arduino2.
Uso 0 de MQTT
En lo que resta de post, voy a realizar una pequeña prueba de concepto (PoC) sobre MQTT. Para ello, vamos a hacer de uno de los brokers más conocidos que existen para MQTT: Mosquitto.
Mosquitto es un broker OpenSource ampliamente utilizado debido a su ligereza lo que nos permite, fácilmente, emplearlo en gran número de ambientes, incluso si éstos son de pocos recursos.
A través de esta página puedes descargar y seguir los pasos de instalación según cual sea tu sistema operativo.
Una vez que tenemos instalado Mosquito, podemos proceder a crear nuestro primer emisor y subscriptor siguiendo para ello una jerarquía que podría asemejarse a la empleada en una aplicación real (en este caso, una vivienda).
Antes de nada, voy precisamente a definir esta estructura:
Dentro de esta estructura, nuestros únicos "emisores" son los sensores de luz y presencia que hemos colocadao en la Hab1, Hab2 y Cocina. Cada uno de ellos, lo vamos a asignar a un topic propio quedando el listado de topics de la siguiente forma:
- Hab1
- Luz: casa/habitaciones/hab1/luz
- Presencia: casa/habitaciones/hab1/presencia
- Hab2
- Luz: casa/habitaciones/hab2/luz
- Presencia: casa/habitaciones/hab2/presencia
- Cocina
- Luz: casa/cocina/luz
- Presencia: casa/cocina/presencia
Para ver como funciona el protocolo, vamos a subscribirnos a tres topics:
- casa/habitaciones/hab1/luz
- casa/habitaciones/#
- casa/#
El '#' del final es semejante al asterisco y hace las veces de comodín por lo que todos sus hijos deberían ser escuchados bajo esa cola.
Cada uno de los comandos que escriba ahora, debería ir en una terminal / consola diferente. Por otra parte, dependiendo de tu sistema operativo puede que tengas que arrancar el servidor de Mosquitto de forma manual, en mi caso (OSX) esta operación la realicé mediante el siguiente comando:
/usr/local/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
Empezamos por los subscriptores:
mosquitto_sub -t "casa/habitaciones/hab1/luz" -v
mosquitto_sub -t "casa/habitaciones/#" -v
mosquitto_sub -t "casa/#" -v
Y ahora empezamos a publicar mensajes desde alguno de los nodos que definimos antes. Concretamente, voy a lanzar comandos que simulen los siguientes casos:
- encendido luz Hab1
- encendido luz Hab2
- encendido presencia cocina
mosquitto_pub -t "casa/habitaciones/hab1/luz" -m "ON"
mosquitto_pub -t "casa/habitaciones/hab2/luz" -m "ON"
mosquitto_pub -t "casa/cocina/presencia" -m "ON"
Como observarás, el "encendido luz Hab1" es detectado por todos nuestros subscriptores, el "encendido luz Hab2" es detectado por el subscritor general y el subscritor a las habitaciones y, por último, el "encendido presencia cocina" sólo es detectado por el subscriptor general ya que el sensor no forma parte del árbol gerárquico de habitaciones (ni lógicamente hab1).
Si lo deseas, puedes realizar más pruebas con Mosquitto, ensayando diferentes llamadas y configuraciones para ver como se comporta el protocolo.
Con esto, acabamos el post de hoy. Poco a poco vamos completando este pequeño castillo que estamos montando para implementar nuestras propias soluciones IoT.
En los siguientes posts seguiremos juntando todas estas piezas.
Si te ha gustado este post, no te olvides de compartirlo con tus seguidores.
Nos vemos la próxima semana.
¡Saludos!
Subscríbete a mi newsletter
Actualmente estoy llevando a cabo algunos cambios en mi Newsletter y no es posible apuntarse 😞