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.
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.
- Los clientes se suscriben a canales (topics), indicando los canales de los que desean recibir información.
- Servidor o broker recibe los mensajes de quienes publican y lo envía a quienes están suscriptos.
- 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:
- A) Ejecuta mosquitto client para suscribirte al canal (lo explicamos más abajo)
- 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
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