Tus primeros pasos con MQTT en Mat|r

Autora: Ing. Ana Laura Diedrichs

 

Intro

 

Si ya creaste tu cuenta en Mat|r puedes empezar a probar algunas aplicaciones de ejemplo que te ayuden en los primeros pasos. Gracias a la plataforma Mat|r puedes crear aplicaciones para celulares de plataforma Android como iOS, programando en Mat|r script.

 

En este tutorial vamos a usar la aplicación Mensajería  la cual podés encontrar en el Mat|r Hub y crear una copia (fork), para que crees tu primer aplicación mobile en  Mat|r. La aplicación Mensajería es una aplicación prototipo de un chat simple con una sola pantalla. Consta de dos campos de texto donde en el primero se coloca el nombre de la persona/usuario y luego el texto del mensaje. Con el botón publish se envía ese mensaje al canal. Abajo de los cuatro botones (subscribe, unsubscribe, publish, disconect) lista los mensajes recibidos.

 matr-mqtt

 

Con esta aplicación introduciremos el uso de Mat|r Async, comunicación asíncrona con aplicaciones mediante MQTT, un protocolo muy utilizado para el Internet de las cosas.

 

 

¿Qué es MQTT?

 

Message Queuing Telemetry Transport (MQTT) es un protocolo de comunicación asíncrona para Internet de las Cosas (IoT por sus siglas en inglés). Este protocolo se basa en un esquema publicar-suscribir que requiere un servidor central o broker.

  1. Los clientes se suscriben a canales (topics), indicando los canales de los que desean recibir información.
  2. Servidor o broker recibe los mensajes de quienes publican y lo envía a quienes están suscriptos.
  3. Publicadores: quienes publican o envían información a ciertos canales (uno o varios).

Una aplicación, software o dispositivo puede tomar un rol (ser cliente o publicador) o ambos. En el diagrama de abajo vemos un ejemplo de una comunicación entre sensores con una app Mat|r. Los sensores pueden publicar en un canal sus datos y escuchar (suscribirse) a otro esperando comandos de la aplicación.

Configurando la app Mensajería

 

Buscar la app + fork

 

Para usar tu primer ejemplo de Mat|r Async no necesitas programar desde cero. La app Mensajería se encuentra disponible en MatrHub para poder realizar tu propia copia de la aplicación que podrás modificar a tu gusto (hacer un “fork” de la aplicación).

Fork de una aplicación

 

Configurar el canal

 

Mat|r nos permite crear canales de comunicación asíncrona (Async) que son tópicos de MQTT (topic).

Por cada canal ( channel )nuevo que creemos en nuestra aplicación, tendremos un nuevo topic.

 

Para esta aplicación es necesario crear un canal (Channel) llamado mensajería. Cuando se crea un canal ,Mat|r solicita con qué Model vincularía los datos que reciba de ese canal. En nuestra aplicación están declarados los siguientes modelos.


Model User{
String name
}

Model Message{
String msg
User user
}

Gif paso a paso de como crear el canal Mensajeria + model mapping


Habilitar dispositivos  

 

Luego de crear el canal mensajería procedemos a crear el dispositivo. Los dispositivos pueden ser físicos (hardware: Arduino, Raspberry Pi, etc) o lógicos (una aplicación). La creación de dispositivos genera los certificados de acceso para dicho dispositivo, que serán utilizados para autenticar y crear la conexión MQTT encriptada entre el dispositivo y el server. Así como se crean dispositivos pueden eliminarse luego, quitando los permisos de acceso del dispositivo a la aplicación.

 

 

Descargar los certificados y guardalos. ¡No los pierdas de vista! Más adelante los vamos a usar para simular una conexión a la aplicación. Los certificados son un conjunto de tres archivos que servirán para crear la conexión MQTT encriptada usando el puerto 8883.

 

¿Cómo sé a qué servidor, puerto, y canal se puede conectar mi dispositivo?

Al hacer click en info del canal, verá algún texto como el siguiente:


Ejemplo: “(..) Connect your device to the following server: a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com:8883

To subscribe or publish in this channel, use the following MQTT topic: 86a1641a ”

 

Donde, según este ejemplo, a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com es el server, 8883 es el puerto y 86a1641a es el topic. Muy importante copiar, recordar o transcribir el server, puerto y topic porque luego lo usaremos para hacer una prueba.

Probá la aplicación Mensajería desde tu compu con Mosquitto.

 

Para probar la aplicación Mensajería, dado que es un chat, necesitamos conversar con alguien más además de nosotros mismos :-). Puedes probar la aplicación desde Matr Viewer en varios celulares e ir enviando mensajes. Sino:

Eclipse Mosquitto es una herramienta open source que nos permitirá probar el funcionamiento de implementaciones MQTT. Como vimos la arquitectura de un sistema MQTT involucra muchas partes (broker, clientes, suscriptores). Dada la complejidad puede suceder que no sepamos qué está fallando. Por ejemplo con un cliente mosquitto podemos comprobar el funcionamiento de un MQTT broker (servidor MQTT) sin necesidad de equipamiento o programación extra.

 

Usaremos Mosquitto client para simular un cliente MQTT que publica en el canal mensajería y también escuchar de ese canal (estar suscripto o ser suscriptor).

 

Primero descarga e instala Mosquitto de acuerdo a tu plataforma desde este enlace

A continuación probaremos el funcionamiento de la aplicación en dos escenarios:

 

  • Un cliente mosquitto que publica mensajes
  • Otro cliente mosquitto que los escucha (está suscripto)

 

Escenario:  mosquitto se suscribe al canal y escucha los chats

 

Vamos a realizar los siguientes pasos:

  1. A) Ejecuta mosquitto client para suscribirte al canal (lo explicamos más abajo)
  2. B) Abre la aplicación Mensajeria desde tu celular usando Matr Viewer y empieza a crear mensajes, escribiendo en los dos primeros campos de texto y luego click en publish

Vista desde Mat|r Viewer del funcionamiento de la aplicación

 

A chusmear canales con mosquitto_sub

 

Para suscribirnos al canal vamos a usar el comando mosquitto_sub. Este es el comando completo del ejemplo, que explicaremos en detalle:

 

mosquitto_sub -h a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com -p 8883 -t 86a1641a –cert arduino.certificate.pem –key arduino.private-key.txt –cafile rootCA.pem -d

 

En el comando de arriba, se ejecuta el programa mosquitto_sub pasando las opciones:

 

-h host Es la dirección del servidor MQTT a conectarse
-p port Número de Puerto TCP.
-t Topic Tópico MQTT
–cert Archivo certificado extensión .pem
–key Archivo certificado extensión -key.txt
–cafile Archivo nombre rootCA.pem
-d Opción debug de mosquitto

 

Los valores que usas para las opciones -h, -p y -t los obtienes cuando creas el canal Mat|r Async como explicamos en la sección de configurar el canal

Las opciones –cert, –key, –cafile son los archivos de certificados que descargaste al momento que creaste un dispositivo (ver sección habilitar dispositivos)

Para saber sobre otras opciones a agregar a mosquitto_sub ver esta página

Abrir una consola o terminal el tu sistema operativo. Los siguientes ejemplos mostrados son en línea de comandos linux-based (Debian/ubuntu).

Abajo vemos un ejemplo del comando para suscribirse al canal y la salida del comando muestra la información que ha sido enviada. Cuando un cliente se suscribe al canal está escuchando la información de ese canal.

 

Imagen consola de mosquitto client suscribiéndose al canal

 

(lo siguiente es lo mismo que se ve en la imagen de arriba)

mosquitto_sub -h a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com -p 8883 -t 86a1641a –cert arduino.certificate.pem –key arduino.private-key.txt –cafile rootCA.pem -d

Client mosqsub|1391-ana-Inspir sending CONNECT

Client mosqsub|1391-ana-Inspir received CONNACK

Client mosqsub|1391-ana-Inspir sending SUBSCRIBE (Mid: 1, Topic: 86a1641a, QoS: 0)

Client mosqsub|1391-ana-Inspir received SUBACK

Subscribed (mid: 1): 0

Client mosqsub|1391-ana-Inspir received PUBLISH (d0, q0, r0, m0, ’86a1641a’, … (44 bytes))

{“msg”:”Hola mundo”,”user”:{“name”:”anita”}}

Client mosqsub|1391-ana-Inspir sending PINGREQ

Client mosqsub|1391-ana-Inspir received PINGRESP

Client mosqsub|1391-ana-Inspir received PUBLISH (d0, q0, r0, m0, ’86a1641a’, … (42 bytes))

{“msg”:”que tal “,”user”:{“name”:”anita”}}

Client mosqsub|1391-ana-Inspir received PUBLISH (d0, q0, r0, m0, ’86a1641a’, … (42 bytes))

{“msg”:”muy bien !”,”user”:{“name”:”dan”}}

 

Notar que en este ejemplo:

 

 

Los certificados están en el mismo directorio (o carpeta) desde el cual estoy ejecutando el comando. En este caso ~/phd-repos/matr-message-mqtt. Debes indicar la ruta, relativa o completa, a tus certificados para que mosquito_sub y mosquitto_pub puedan encontrarlos.

Ejemplo: si tus certificados se encuentran en tu carpeta Descargas o Downloads:

mosquitto_sub -h a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com -p 8883 -t 86a1641a –cert ~/Downloads/arduino.certificate.pem –key ~/Downloads/arduino.private-key.txt –cafile ~/Downloads/rootCA.pem -d

 

Reemplazar en el comando anterior la palabra Downloads por Escritorio o Desktop si tus certificados los descargaste al escritorio de tu PC. Si tus certificados los bajaste en alguna otra carpeta, puedes indicar la ruta o camino (path) completo, ejemplo:

 

mosquitto_sub -h a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com -p 8883 -t 86a1641a –cert /home/user/project/matr-mensajeria/arduino.certificate.pem –key /home/user/project/matr-mensajeria/arduino.private-key.txt –cafile /home/user/project/matr-mensajeria/rootCA.pem -d

 

Publicamos mensajes con mosquito_pub

 

Ahora probamos publicar con mosquitto, es decir, enviar información hacia la aplicación Mensajeria. A diferencia del comando mosquitto_sub, cuando usamos mosquito_pub debemos pasar un mensaje o contenido de lo que vamos a publicar usando la opción -m.

Como mensaje, Mat|r admite sólo formato JSON. El canal aceptará los mensajes que mapean directamente con el Model que le fue asignado al canal al momento de su creación. Dado que el canal mensajería mapea los datos recibidos al Model Message, el JSON tendrá la siguiente estructura: (ejemplo)

Formato: {“msg”:”texto cualquiera”,”user”:{“name”:”texto cualquiera”}}

Ejemplo: {“msg”:”hey aqui estoy!”,”user”:{“name”:”alice”}}

 

Abrimos otra terminal y ejecutamos el comando para publicar un mensaje

Ejecución de comando y visualización de su salida

 

mosquitto_pub -h a2sq3y7mdrjtom.iot.us-east-1.amazonaws.com -p 8883 -t 86a1641a –cert arduino.certificate.pem –key arduino.private-key.txt –cafile rootCA.pem -m ‘{“msg”:”hey aqui estoy!”,”user”:{“name”:”alice”}}’ -d

Client mosqpub|14981-ana-Inspi sending CONNECT

Client mosqpub|14981-ana-Inspi received CONNACK

Client mosqpub|14981-ana-Inspi sending PUBLISH (d0, q0, r0, m1, ’86a1641a’, … (49 bytes))

Client mosqpub|14981-ana-Inspi sending DISCONNECT

 

matr-mqtt

Vista de la app Mensajeria recibiendo información de un cliente que publica en el canal.

 

Fin / Cierre

 

¡Felicidades! Has probado tu primera aplicación de chat usando MQTT en Mat|r. Observa que la aplicación tiene otras funcionalidades como subscribe, unsubscribe, disconnect. Puedes leer más sobre Async y sus funcionalidades en la documentación de Mat|r