Skip to content

cbiale/SensorWave

Repository files navigation

SensorWave

Consideraciones

En un sistema de Internet de las Cosas tradicional, los datos recopilados por los nodos sensores y actuadores son enviados a la nube para su almacenamiento y análisis. Los nodos reciben como respuesta comandos o instrucciones de control que producen cambios en sus actuadores. Este enfoque conduce a una alta latencia en la comunicación, un flujo de datos ascendente alto y mayores costos en los centros de datos en la nube. Adicionalmente, muchos sistemas de Internet de las Cosas experimentan problemas de conectividad que provocan la pérdida de datos si no existe un almacenamiento local.

Los nodos basados en procesadores de bajo consumo tienen limitaciones de procesador y memoria, pero al borde de la red tienen la capacidad de almacenar datos, reducir la latencia, aumentar la confiabilidad y permitir la toma de decisiones.

Objetivos

Se pretende desarrollar un sistema de almacenamiento distribuido, transparente al usuario final, donde los datos residan al borde de la red y en un servicio de almacenamiento en la nube. Las solicitudes al sistema pueden provenir de usuarios locales a un nodo al borde o de usuarios conectados a uno o varios servidores despachadores ubicados en la nube (o al borde).

Los nodos sensores y actuadores son responsables de la transmisión de datos a los nodos al borde y del cambio de estado de los actuadores a petición de los nodos al borde. Para la comunicación entre los nodos al borde y los nodos sensores y actuadores se pueden utlizar los protocolos CoAP, HTTP, MQTT o NATS.

Cada nodo al borde, equipado con una base de datos, un broker MQTT y un broker NATS se encarga de capturar y almacenar los datos enviados por los nodos sensores y actuadores como series y ofrece un motor de reglas que permite modificar el estado de los actuadores.

Los nodos al borde tienen recursos de almacenamiento limitados y sólo pueden almacenar datos durante un período de tiempo determinado. Por ello se utiliza un sistema de compresión que permite determinar por cada serie el algoritmo de compresión y se usa el concepto de "Tiempo de almacenamiento", que permite definir un período de tiempo durante el cual los datos deben residir localmente.

Cuando se cumple el tiempo de almacenamiento, los datos son automáticamente marcados para ser migrados a un servicio de almacenamiento en la nube.

En la nube, el servicio despachador es responsable de realizar solicitudes a los nodos al borde o al servicio de almacenamiento en la nube y enviar respuestas a los clientes. El servicio despachador es escalable horizontalmente.

Un cliente puede realizar consultas locales o globales, donde las consultas locales abarcan los datos almacenados al borde y las globales pueden involucrar a distintos nodos al borde y al servicio de almacenamiento en la nube. Las consultas globales solo se pueden realizar mediante el servicio despachador.

En el sistema propuesto, las aplicaciones desplegadas al borde de la red pueden continuar funcionando ante eventuales problemas de conectividad entre el borde y la nube debido a que los nodos al borde disponen de almacenamiento local y un motor de reglas. Las consultas locales no se ven afectadas ante problemas de conectividad, pero si se realiza una consulta global el sistema retorna como parte de la respuesta a qué nodos al borde no pudo acceder.

Estructura del Proyecto

proyecto_final/
├── compresor/                    # Algoritmos de compresión
│   ├── compresion_bits.go        # Compresión de bits
│   ├── compresion_bloques.go     # Compresión de bloques (LZ4, ZSTD, Snappy, Gzip)
│   ├── compresion_deltadelta.go  # Delta-of-delta
│   ├── compresion_diccionario.go # Diccionario
│   ├── compresion_gzip.go        # Gzip
│   ├── compresion_lz4.go         # LZ4
│   ├── compresion_ninguno.go     # Sin compresión
│   ├── compresion_rle.go         # Run-Length Encoding
│   ├── compresion_snappy.go      # Snappy
│   ├── compresion_tiempo.go      # Compresión temporal
│   ├── compresion_utils.go       # Utilidades
│   ├── compresion_xor.go         # XOR
│   └── compresion_zstd.go        # Zstandard
├── contenedores/                 # Scripts de infraestructura
│   ├── iniciar_mqtt.sh           # Broker MQTT local
│   ├── iniciar_nats.sh           # NATS local
├── despachador/                  # Nodo despachador (nube/borde)
│   └── despachador.go            # Servicio despachador
├── edge/                         # Nodo edge (borde)
│   ├── comunicacion_nube.go      # Registro en S3
│   ├── consultas.go              # Consultas de series
│   ├── edge.go                   # Manager principal
│   ├── migracion_datos.go        # Migración a S3
│   ├── reglas.go                 # Motor de reglas
│   ├── series.go                 # Gestión de series
│   └── utils.go                  # Utilidades
├── middleware/                   # Capa de comunicación
│   ├── cliente_coap/             # Cliente CoAP
│   ├── cliente_http/             # Cliente HTTP
│   ├── cliente_mqtt/             # Cliente MQTT
│   ├── cliente_nats/             # Cliente NATS
│   ├── servidor/                 # Servidores multi-protocolo
│   └── cliente_lib.go            # Librería cliente
├── test/                         # Tests automatizados
│   ├── despachador/              # Test del despachador
│   ├── edge/                     # Tests del edge
│   │   ├── path_tags/            # Tests de path + tags
│   │   ├── reglas/               # Tests del motor de reglas
│   │   └── series/               # Tests de series temporales
│   └── middleware/               # Tests del middleware
│       ├── latencia_case/        # Pruebas de latencia
│       └── prueba_escalabilidad/ # Pruebas de escalabilidad
├── tipos/                        # Tipos de datos compartidos
│   ├── compresion.go             # Tipos de compresión
│   ├── medicion.go               # Estructura de medición
│   ├── nodo.go                   # Estructura de nodo
│   ├── s3.go                     # Configuración S3 y opciones
│   └── tipo_datos.go             # Tipos de datos (Boolean, Integer, Real, Text)
├── .gitignore
├── go.mod
├── go.sum
├── Makefile                      # Comandos de build y test
└── README.md                     # Este archivo

Herramientas a utilizar

Lenguajes de programación:

  • Golang

Artefactos:

  • Middleware para obtener datos de sensores y actuadores al borde y para comunicar el borde con la nube.
  • Base de datos al borde de la red basada en Pebble
  • Almacenamiento en la nube basado en S3-compatible (Garage, AWS S3, Cloudflare R2, MinIO, etc.)
  • Servicio despachador de consultas en la nube sin estado
  • Registro de nodos unificado en S3 (usado por edge y despachador)

About

SensorWave: gestión distribuida de datos para aplicaciones de IoT

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages