VerneMQ: Internet de las Cosas (IoT) y Mensajería (IM)

Hace unos días una persona me preguntó, ¿cuál es el mejor sistema y protocolo para crear un chat para aplicaciones móviles? Le hablé de XMPP por supuesto, pero también de MQTT. Hace un par de años hice una comparativa entre estos protocolos y determiné que había mucho por hacer en MQTT como para tenerlo en cuenta. Sin embargo, útlimamente los contras sobre XMPP me hacen replantearlo.

IoT (Internet of Things, Internet de las Cosas)

Uno de los factores para determinar esto es la aparición de nuevos actores en escena. Anteriormente ya existía emqtt, una buena solución como broker de MQTT pero tiene algunas contras. Ahora aparece en escena vernemq, con una publicidad bastante llamativa: The most scalable and robust MQTT Message Broker for IoT, M2M, Mobile, and Web Applications (El broker de mensajería MQTT más escalable y robusto para IoT, M2M, Móvil y Aplicaciones Web).

Si nos centramos en qué es Internet de las Cosas y su definición: Se refiere a la interconexión digital de objetos cotidianos con Internet. Alternativamente, Internet de las cosas es el punto en el tiempo en el que se conectarían a Internet más “cosas u objetos” que personas.

VerneMQ agrega su solución para la interconexión de estas “cosas” asegurando una distribución robusta y escalable de la información. Teniendo presente la gran distribución de la información entre los dispositivos que la emplean y los servidores donde se procesa y almacena, un broker MQTT parece el sistema más seguro que garantice la expansión y distribución de esta información sin demoras y sin sobrecargas en los servidores.

Primeros pasos con VerneMQ

Vamos a probarlo. En principio necesitamos instalar la última versión. En la página de descarga nos dan varias opciones para poder instalarlo directamente en sistemas Debian, Ubuntu y CentOS usando paquetes desarrollados por el equipo de VerneMQ o instalarlo desde código fuente.

He optado por utilizar una versión descargada del código fuente y levantar mediante vagrant una máquina virtual con Jessie:

curl https://github.com/erlio/vernemq/archive/0.12.5p4.tar.gz | tar xzf -
cd vernemq-0.12.5p4
vagrant up jessie

Toma bastante tiempo ya que tiene que acondicionar la distribución base de Jessie e instalar (desde código fuente) Erlang/OTP.

Una vez la máquina está lista podemos entrar en ella:

vagrant ssh jessie

Dentro de la consola podremos levantar el sistema de la siguiente forma:

cd vernemq/_build/default/rel/vernemq
bin/vernemq start

Funciona correctamente y podemos ver (con netstat -tlnp) al programa beam.smp ocupando en modo escucha (LISTEN) el puerto 1883. El único problema es que escucha solo en la interfaz local y de todas formas la máquina no tiene exportado el puerto 1883 hacia fuera.

Configuración

La configuración está muy bien documentada tanto en la web como en el propio fichero de configuración. Existen dos ficheros, uno para ACL y otro con los parámetros de configuración generales:

vernemq.conf
vmq.acl

Hay muchos parámetros de configuración, aconsejo leer en detalle la documentación para saber qué se puede hacer con VerneMQ y para qué se emplea cada parámetro. Esto puede evitarnos problemas de rendimiento entre otros dolores de cabeza.

Para las pruebas de funcionamiento voy a configurar:

allow_anonymous = on

Así nos permitirá conectarnos sin necesidad de autenticar el usuario.

Clientes

Según HiveMQ los mejores clientes MQTT son los siguientes (he filtrado los que son de pago o limitados a plataformas móviles):

Recomiendo el último por basarse en línea de comandos y poder emplearlo desde cualquier sitio. Para la prueba de funcionamiento es el que instalaré:

sudo apt-get install mosquitto-clients

Como ejemplo, vamos a publicar datos de un supuesto sensor de temperatura. Primero hay que colocar en otra consola/terminal el agente que irá recibiendo la información:

mosquitto_sub -t sensors/temperature

Se queda en espera de la llegada de información. Volvemos a la consola inicial y publicamos un dato:

mosquitto_pub -t sensors/temperature -m 32 -q 1

Vemos en la consola con el subscriptor (sub) que recibimos el dato “32”. Podemos enviar más datos e incluso subscribir más clientes para observar que el mismo dato es recibido en todos ellos.

Estos mensajes son recibidos únciamente cuando el subscriptor está en línea, si nos desconectamos y enviamos un mensaje, al volver a conectarnos veremos que el mensaje no aparece. Para obtener esta característica habría que registrar al subscriptor como usuario y entonces tendríamos la capacidad de obtener esos mensajes offline.

Conclusiones

Es una aproximación muy por encima a VerneMQ y habría que profundizar un poco más en sus características como la seguridad, la forma de operar para mensajería uno a uno y con grupos, etc. Pero estas líneas básicas nos dan una aproximación de la potencia que tiene VerneMQ. ¿Has pensado en emplear MQTT en tus desarrollos?, ¿te gustaría integrar VerneMQ en tu red? Si necesitas soporte o tienes algún comentario, ¡no te cortes!, ¡comenta!