Este documento servirá como introducción y guía de uso del producto mínimo viable desarrollado por Integ.ro para proporcionar la base estructural del proyecto Lake Nona Responsive City Fabric que proporcionarán conocimientos útiles y servirán como estudios de caso para futuras etapas de desarrollo.
En las siguientes secciones de este documento, se explicarán algunos conceptos y términos claves del protocolo de mensajería MQTT, fundamentales para comprender el funcionamiento del sistema propuesto. Se presentará la solución propuesta y finalmente un ejemplo concreto de un panel de control interactivo utilizando diferentes fuentes de información.
Un broker de mensajería MQTT opera a través de dos canales distintos. El primero se encarga de transmitir las emisiones que provienen del agente de mensajería o el servicio de trabajo hacia el broker. El segundo canal se encarga de difundir las emisiones que ingresan al broker a todos los agentes que estén suscritos a un tema específico. Estas emisiones se almacenan en la base de datos antes de ser utilizadas en tiempo real para la generación de gráficos o paneles de control.
Topic: En el contexto de MQTT (Message Queuing Telemetry Transport), un topic es una cadena de texto que se utiliza para identificar el contenido o la categoría de un mensaje. Los clientes MQTT pueden suscribirse a ciertos topics para recibir los mensajes relacionados con ese tema específico. Por ejemplo, un topic podría ser «sensores/temperatura» para los mensajes relacionados con la temperatura de los sensores.
Payload: El payload en MQTT se refiere a la parte útil de un mensaje, que contiene los datos o la información que se envía. Puede ser cualquier tipo de información estructurada, como un texto, un número, un objeto JSON, entre otros. Por ejemplo, si se envía un mensaje MQTT para monitorear la temperatura de un sensor, el payload podría contener el valor de la temperatura en formato numérico.
Subscribe: Suscribirse en MQTT implica que un cliente desea recibir mensajes publicados en ciertos topics. Cuando un cliente se suscribe a un topic específico, el cliente recibirá todos los mensajes que se publiquen en ese topic. Esto permite que los clientes se mantengan informados y actualizados sobre la información relevante para ellos. Por ejemplo, un cliente podría suscribirse al topic «sensores/temperatura» para recibir actualizaciones sobre las lecturas de temperatura.
Emit: En el contexto de MQTT, emitir se refiere al acto de publicar un mensaje en un topic específico. Un cliente MQTT puede emitir un mensaje para enviar datos o información a otros clientes que estén suscritos a ese topic. Por ejemplo, un cliente podría emitir un mensaje en el topic «sensores/temperatura» para informar a otros clientes sobre el cambio en la temperatura del ambiente.
Broker: Un broker en MQTT es un servidor que recibe los mensajes publicados por los clientes y los envía a los clientes suscritos a los topics correspondientes. Actúa como intermediario entre los clientes, asegurándose de que los mensajes se entreguen de manera eficiente y confiable. El broker es fundamental en la arquitectura MQTT, ya que coordina la comunicación entre los clientes.
Retained Message: Un retained message (mensaje retenido) en MQTT es un mensaje que se guarda en el broker y se entrega a los nuevos suscriptores tan pronto como se conecten. Permite que los clientes obtengan la última información disponible sobre un topic específico, incluso si se han perdido los mensajes anteriores. El mensaje retenido se identifica mediante una bandera en el momento de la publicación.
En esta sección encontraremos los topics de la vía 1, que se establece conexión desde el agente de mensajería, service worker o sensor al broker.
Este topic notifica que hay un agente que se quiere conectar al broker, el broker toma su payload y crea o actualiza la lista de brokers de mensajería payload:
payload = json.dumps({ "name": string })
MQTT_SERVICE_HOST = '134.000.000.000'
MQTT_SERVICE_PORT = 1883
payload = json.dumps({ "name": 'cisco-meraki' })
publish.single('connected',payload, hostname=MQTT_SERVICE_HOST, port=MQTT_SERVICE_PORT)
payload = json.dumps({
"agent": {
"name": "weather"
},
"metrics": [{"type": 'weather', "value": data}]
})
import paho.mqtt.publish as publish
MQTT_SERVICE_HOST = '134.000.000.000'
MQTT_SERVICE_PORT = 1883
MQTT_SERVICE_TOPIC = 'agent/message'
MQTT_CLIENT_ID = 'openweather-mqtt-service'
payload = json.dumps({
"agent": {
"name": "weather"
},
"metrics": [{"type": 'weather', "value": data}]
})
topic = MQTT_SERVICE_TOPIC + '/' + MQTT_CLIENT_ID
publish.single(topic, payload, hostname=MQTT_SERVICE_HOST,
port=MQTT_SERVICE_PORT,client_id=MQTT_CLIENT_ID)
Este topic notifica al broker que un agente se desconectó y el broker se encarga de actualizar su estado en la base de datos.
payload = json.dumps({ "name": string })
MQTT_SERVICE_HOST = '134.000.000.000'
MQTT_SERVICE_PORT = 1883
payload = json.dumps({ "name": 'cisco-meraki' })
publish.single('disconnected',payload, hostname=MQTT_SERVICE_HOST, port=MQTT_SERVICE_PORT)
En esta sección encontraremos los topics de la vía 2, estos son publicados por el broker de mensajería y son utilizados para dashboards, gráficas y monitoreo en tiempo real de la información que entra al broker.
Este topic notifica a todos los suscriptores que hay un agente service worker o sensor conectado y entrega la información de este.
payload:{
agent”: {
“name”: string, “connected”: Boolean
}
}
payload:{
agent”: {
“name”: string, “connected”: Boolean
}
}
payload = json.dumps({
agent": {
name": "weather"
},
metrics": [{"type": 'weather', "value": data}]
})
Todos los datos se almacenan en una base de datos NoSQL MongoDB disponibles para realizar consultas personalizadas. Por otro parte, se realiza un trabajo de preprocesamiento de los datos usando databricks el cual realiza queries a la base de datos y organiza la información en tablas SQL para facilitar la consulta desde herramientas de visualización tipo Grafana.
Otra metodología en desarrollo es mediante el servicio Lambda de AWS en el cual se puede usar una plantilla suministrada por Integ.ro para realizar el preprocesamiento de los datos.
A continuación se presenta un manual técnico detallado para que cualquier fabricante de dispositivos se conecte a nuestra red MQTT.
Para reportar datos vía MQTT con un dispositivo que ya cuenta con esta tecnología, solo es necesario configurar los parámetros de conexión en el cliente MQTT, que incluyen el identificador del fabricante, la dirección IP o nombre de host del broker MQTT y el puerto de conexión.
MQTT_SERVICE_HOST = '134.000.000.000'
MQTT_SERVICE_PORT = 1883
MQTT_SERVICE_TOPIC = '{your_mqqt_topic}'
MQTT_CLIENT_ID = '{your_mqtt__client_id}'
curl --location 'http://127.0.0.1:3001/nomqtt' \
--header 'Content-Type: application/json' \
--data '{
"mqtt_topic": "topic_prueba_nomqtt",
"mqtt_client_id": "client_device",
"data": {
"key1": "value1",
"key2": 10
}
}'
http://127.0.0.1:3001/nomqtt'
El método utilizado para enviar la solicitud es POST.
La función Lambda procesa la solicitud y publica los datos en el broker MQTT. La respuesta de la función Lambda indica si la publicación se realizó con éxito o si hubo algún problema durante el proceso.
Grafana es una plataforma de análisis y visualización de código abierto diseñada para ayudar a los usuarios a comprender mejor y supervisar sus datos. Con su capacidad para conectarse a una amplia gama de fuentes de datos, Grafana se ha convertido en una herramienta popular para visualizar y monitorear métricas en tiempo real, datos de series temporales y otros conjuntos de datos complejos.
Es importante tener en cuenta que, si bien Grafana ofrece una amplia gama de funciones para visualizar datos, existen otras herramientas similares en el mercado que también pueden ser utilizadas para el mismo propósito.
Grafana proporciona la capacidad de integrar datos de MQTT y visualizarlos de manera efectiva en forma de tableros interactivos y gráficos personalizados. Al agregar variables de MQTT en Grafana, los usuarios pueden seleccionar y filtrar datos específicos provenientes de los canales MQTT para una visualización detallada y contextualizada.