Documentos de Académico
Documentos de Profesional
Documentos de Cultura
aplicaciones
Aproveche el máximo potencial de sus dispositivos IoT con el protocolo
MQTT.
GUÍA DE CONCEPTO
Este proyecto le introducirá a los elementos esenciales de MQTT, uno de los
protocolos más populares para aplicaciones IoT.
Un poco de historia
El protocolo MQTT fue inventado en 1999 por Andy Stanford-Clark (IBM) y
Arlen Nipper (Arcom, ahora Cirrus Link). Necesitaban un protocolo que
permitiera una pérdida mínima de batería y un ancho de banda mínimo para
conectar con oleoductos vía satélite. Los dos inventores especificaron varios
requisitos para el futuro protocolo:
● Implementación sencilla
● Entrega de datos con calidad de servicio (QoS)
● Ligereza y eficiencia del ancho de banda
● Agnóstico de datos*
● Conocimiento continuo de la sesión
Estos objetivos siguen siendo el núcleo de MQTT. Sin embargo, el enfoque
principal del protocolo ha cambiado de los sistemas integrados propietarios a
los casos de uso abiertos del Internet de las cosas (IoT). Este cambio de
enfoque ha creado mucha confusión sobre el significado de las siglas MQTT.
La respuesta corta es que MQTT ya no se considera un acrónimo. MQTT es
simplemente el nombre del protocolo. "MQ" se refiere a MQ Series, un
producto que IBM desarrolló para soportar el transporte de telemetría MQ.
Cuando Andy y Arlen crearon su protocolo en 1999, le pusieron el nombre del
producto de IBM.
Modelo Publicador/suscriptor
El modelo MQTT publish/subscribe (también conocido como pub/sub) ofrece
una alternativa a la arquitectura tradicional cliente-servidor. En el modelo
cliente-servidor, un cliente se comunica directamente con un endpoint.El
modelo pub/sub desacopla el cliente que envía un mensaje (el publicador)
del cliente o clientes que reciben los mensajes (los suscriptores). Los
publicadores y los suscriptores nunca se ponen en contacto directamente. De
hecho, ni siquiera saben que el otro existe. La conexión entre ellos es
gestionada por un tercer componente (el broker). El trabajo del broker es
filtrar todos los mensajes entrantes y distribuirlos correctamente a los
suscriptores. Así que vamos a profundizar un poco más en algunos de los
aspectos generales de pub/sub (hablaremos de los detalles de MQTT en un
minuto).
El aspecto más importante de pub/sub es la disociación entre el publicador
del mensaje y el receptor (suscriptor). Este desacoplamiento tiene varias
dimensiones:
Otra cosa que hay que mencionar es que MQTT es especialmente fácil de
usar en el lado del cliente. La mayoría de los sistemas pub/sub tienen la
lógica en el lado del broker, pero MQTT es realmente la esencia de pub/sub
cuando se utiliza una librería cliente y eso lo convierte en un protocolo ligero
para dispositivos pequeños y limitados.
Filtrado de mensajes
Está claro que el broker MQTT juega un papel fundamental en el proceso
pub/sub. Pero, ¿cómo consigue el broker filtrar todos los mensajes para que
cada suscriptor reciba sólo los mensajes que le interesan? Como verás, el
broker tiene varias opciones de filtrado:
● Las colas tienen nombre y deben ser creadas explícitamente: Una cola
es mucho más rígida que un tópico. Antes de poder utilizar una cola,
ésta debe ser creada explícitamente con un comando separado. Sólo
después de nombrar y crear la cola es posible publicar o consumir
mensajes. En cambio, los tópicos MQTT son extremadamente flexibles
y pueden crearse sobre la marcha.
Escalabilidad
MQTT Pub/Sub escala mejor que el enfoque tradicional cliente-servidor.
Esto se debe a que las operaciones en el broker pueden ser altamente
paralelas y los mensajes pueden ser procesados de una manera dirigida por
eventos. El almacenamiento en caché de los mensajes y el enrutamiento
inteligente de los mismos suelen ser factores decisivos para mejorar la
escalabilidad. Sin embargo, escalar a millones de conexiones es un reto. Un
nivel tan alto de conexiones puede lograrse con nodos broker agrupados para
distribuir la carga entre más servidores individuales utilizando equilibradores
de carga.
Cliente
Cuando hablamos de un cliente, casi siempre nos referimos a un cliente
MQTT. Tanto los publicadores como los suscriptores son clientes MQTT. Las
etiquetas de publicador y suscriptor se refieren a si el cliente está
actualmente publicando mensajes o suscrito para recibirlos (la funcionalidad
de publicar y suscribir también puede ser implementada en el mismo cliente
MQTT). Un cliente MQTT es cualquier dispositivo (desde un microcontrolador
hasta un servidor completo) que ejecuta una biblioteca MQTT y se conecta a
un broker MQTT a través de una red. Por ejemplo, el cliente MQTT puede ser
un dispositivo muy pequeño, con recursos limitados, que se conecta a través
de una red inalámbrica y tiene una biblioteca mínima. El cliente MQTT
también puede ser un ordenador típico que ejecute un cliente MQTT gráfico
con fines de prueba. Básicamente, cualquier dispositivo que hable MQTT
sobre una pila TCP/IP puede ser llamado cliente MQTT. La implementación
del cliente del protocolo MQTT es muy sencilla y simplificada. La facilidad de
implementación es una de las razones por las que MQTT es ideal para
dispositivos pequeños. Las bibliotecas de clientes MQTT están disponibles
para una gran variedad de lenguajes de programación. Por ejemplo, Android,
Arduino, C, C++, C#, Go, iOS, Java, JavaScript y .NET. Puedes ver una lista
completa en la wiki de MQTT.
Broker
La contrapartida del cliente MQTT es el broker MQTT. El broker es el corazón
de cualquier protocolo de publicación/suscripción. Dependiendo de la
implementación, un broker puede manejar hasta millones de clientes MQTT
conectados simultáneamente.
Conexión MQTT
El protocolo MQTT se basa en TCP/IP. Tanto el cliente como el broker
necesitan tener una pila TCP/IP.
0 Conexión aceptada
2 Conexión rechazada,
identificador rechazado
3 Conexión rechazada, servidor
no disponible
Publicación y Suscripción
Publicación
Suscripción
Suback
Para confirmar cada suscripción, el broker envía un mensaje de acuse de
recibo SUBACK al cliente. Este mensaje contiene el identificador de paquete
del mensaje original Subscribe (para identificar claramente el mensaje) y una
lista de códigos de retorno.
● Identificador del paquete: El identificador del paquete es un
identificador único que se utiliza para identificar un mensaje. Es el
mismo que en el mensaje SUBSCRIBE.
● Código de retorno: El broker envía un código de retorno por cada par
de tópicos/QoS que recibe en el mensaje SUBSCRIBE. Por ejemplo, si
el mensaje SUBSCRIBE tiene cinco suscripciones, el mensaje SUBACK
contiene cinco códigos de retorno. El código de retorno reconoce cada
tópico y muestra el nivel de QoS que es otorgado por el broker. Si el
broker rechaza una suscripción, el mensaje SUBACK contiene un
código de retorno de fallo para ese tópico específico. Por ejemplo, si el
cliente no tiene permiso suficiente para suscribirse al tópico o el tópico
está malformado.
128 Fallo
Anulación de la suscripción
Tras recibir el UNSUBACK del broker, el cliente puede asumir que las
suscripciones del mensaje UNSUBSCRIBE se han eliminado.
Tópicos MQTT
En MQTT, la palabra tópicos se refiere a una cadena UTF-8 que el broker
utiliza para filtrar los mensajes de cada cliente conectado. El tópico consiste
en uno o más niveles de tópicos. Cada nivel de tópicos está separado por una
barra diagonal (separador de niveles de tópicos).
En comparación con una cola de mensajes, los tópicos MQTT son muy
ligeros. El cliente no necesita crear el tópico deseado antes de publicarlo o
suscribirse a él. El broker acepta cada tópico válido sin ninguna inicialización
previa.
Tenga en cuenta que cada tópico debe contener al menos 1 carácter y que la
cadena de tópicos permite espacios vacíos. Los tópicos distinguen entre
mayúsculas y minúsculas. Por ejemplo, micasa/temperatura y
Micasa/temperatura son dos tópicos diferentes. Además, la barra diagonal
sola es un tópico válido.
Comodines MQTT
Cuando un cliente se suscribe a un tópico, puede suscribirse al tópico exacto
de un mensaje publicado o puede utilizar comodines para suscribirse a varios
tópicos simultáneamente. Un comodín sólo puede utilizarse para suscribirse
a tópicos, no para publicar un mensaje. Hay dos tipos diferentes de
comodines: de un solo nivel y de varios niveles.
De un solo nivel: +
Como su nombre indica, un comodín de un nivel sustituye a un nivel de
tópicos. El símbolo + representa un comodín de un nivel en un tópico.
$SYS/broker/clientes/conectados
$SYS/broker/clientes/desconectados
$SYS/broker/clientes/total
$SYS/broker/mensajes/enviados
$SYS/broker/uptime
Broker
Como broker utilizaremos uno gratuito de acceso público llamado HiveMQ
(http://www.hivemq.com/demos/websocket-client/). En este link
encontraremos las configuraciones indicadas en la sección Conexión MQTT-
cliente MQTT - Connect, tales como Username, KeepAlive, CleanSession, etc.
En el link https://www.hivemq.com/public-mqtt-broker/ se encuentran las
características del broker que luego usaremos para establecer la conexión
entre el broker público hiveMQ y el cliente MQTT en Thingworx:
Cliente MQTT
Si recordamos, el cliente MQTT no permite publicar y suscribirse a tópicos
para enviar y recibir mensajes MQTT. Para ello necesitamos instalar una
extensión en la plataforma Thingworx.
Importar extensión
Para poder tener acceso a MQTT desde Thingworx, es necesario importar la
extensión de MQTT, esta extensión permite configurar clientes MQTT que pueden
suscribirse y publicar en los tópicos del broker.
Importar extensión
1.- En la pantalla de inicio de Composer, busca en la barra lateral izquierda el ícono
de Import/export (2 flechas).
5.- Dale click a Validate para verificar que todo está en orden. en la misma ventana
recibirás un mensaje que indica si está correcto o hay algún error. Si está correcto,
dale click Import.
6.- Para verificar que la extensión está instalada y ver su información puedes
dirigirte al ícono de Manage en la barra lateral izquierda. Al final de las opciones
encontrarás Installed Extensions.
1.- El primer paso es crear un thing y escoger MQTT como base Thing Template.
5.- Luego, nos dirigimos a la pestaña Properties and Alerts de la Thing y creamos
las propiedades nombradas anteriormente en la configuración. Se debe utilizar el
mismo nombre asignado a los tópicos.
Pruebas de conectividad
Teniendo ya configurado el cliente MQTT en Thingworx, el siguiente paso es realizar
pruebas de conectividad entre Thingworx y el broker MQTT. Para ello, utilizaremos
un cliente MQTT integrado al broker de HiveMQ que nos permitirá realizar pruebas
de conectividad de forma muy sencilla y eficiente.
1.- El primer paso será conectarnos al broker, no es necesario agregar ningún dato
en la configuración sino simplemente dar click a Connect.
5.- También podemos usar el cliente MQTT como publicador. Nos dirigimos a la
interfaz de cliente MQTT HiveMQ y nos suscribimos al tópico
twx/status/publish_XX. Luego, volvemos a nuestra Thing en Thingworx y editamos
la propiedad publish_test dando click en Set_value (por ejemplo ‘Hello world’). Si
revisamos el cliente MQTT de HiveMQ, veremos que se ha recibido el valor editado
en Thingworx.
Resumen
Enhorabuena. Ha completado con éxito la guía Protocolo MQTT: concepto y
aplicaciones.