Lake Nona

Start building with the Smart & Responsive City Fabric, Integ.ro

Resumen

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.

MQTT

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.

Glosario MQTT

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.

Broker MQTT para Lake Nona

Topics de emisión: Agent to Broker

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.

Connected:

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 }) 

				
			

Ejemplo:

				
					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)
				
			

agent/message/{nombre del agente}

Este topic se encarga de enviar al broker la información seleccionada en el agente de mensajería, service worker o sensor.
				
					payload = json.dumps({
            "agent": {
            	   "name": "weather"
            },
            "metrics": [{"type": 'weather', "value": data}]
            })

				
			

Ejemplo:

				
					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)

				
			

Disconnected:

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 }) 

				
			

Ejemplo:

				
					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)
				
			

Topics de publicación: From Broker

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.

agent/connected:

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
 }
}

				
			

agent/disconnected:

Este topic notifica a todos los suscriptores que se desconectó un agente, service worker o sensor y entrega la información del payload desconectado.
				
					payload:{
agent”: {
 “name”: string,  “connected”: Boolean
 }
}

				
			

agent/message/{nombre del agente}:

Este topic entrega el mensaje que entregó el agente, service worker o sensor al broker para su uso en dashboards real time, filtrando este mensaje por el nombre del agente, para saber a qué topic específico suscribirse.
				
					payload = json.dumps({
agent": {
name": "weather"
        },
metrics": [{"type": 'weather', "value": data}]
})	
				
			

Database

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.

Visualización

Nuevos Proveedores

A continuación se presenta un manual técnico detallado para que cualquier fabricante de dispositivos se conecte a nuestra red MQTT.

Dispositivo MQTT Ready

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}'
				
			

Dispositivo NoMQTT

Para reportar datos vía MQTT con un dispositivo que aún no cuenta con esta tecnología, disponemos de una API para recibir los datos y redireccionarlos al servidor MQTT.
				
					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
    }
}'
				
			

Descripción General

Este POST request proporciona la funcionalidad para publicar datos en el broker MQTT desde dispositivos que no cuentan con la tecnología MQTT incorporada. La solicitud POST se envía a una función Lambda que actúa como intermediario para enviar los datos al broker MQTT especificado.

URL

La URL para el POST request es la dirección de la función Lambda en la nube.
				
					    http://127.0.0.1:3001/nomqtt'

				
			

Body

El cuerpo de la solicitud debe estar en formato JSON y debe contener dos campos principales:

Método

El método utilizado para enviar la solicitud es POST.

Encabezados

Asegúrate de incluir el encabezado Content-Type y establecerlo como application/json para indicar que el cuerpo de la solicitud está en formato JSON.

Respuesta

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.

Uso de Variables de MQTT en Grafana

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.

Agregar Variables de MQTT al dashboard Lake Nona en Grafana

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.

Para agregar variables de MQTT en Grafana, sigue estos pasos:

Configuración de la Fuente de Datos MQTT: