ParkVision Docs
Arquitectura

Arquitectura General

Visión general de la arquitectura del ecosistema ParkVision. Componentes, comunicación y flujo de datos.

Arquitectura General

ParkVision es un sistema distribuido compuesto por múltiples servicios que trabajan juntos para proporcionar gestión inteligente de estacionamientos.

Componentes principales

1. Parking.API (.NET 8)

El backend principal del sistema. Implementa Clean Architecture con los siguientes proyectos:

  • Parking.Domain: Entidades del dominio
  • Parking.Application: Lógica de negocio con CQRS (MediatR)
  • Parking.Infrastructure: Persistencia (EF Core), SignalR, RabbitMQ consumers
  • Parking.Identity: Autenticación y autorización (OpenIddict)
  • Parking.API: Controllers REST y configuración
  • Parking.Migrator: Sistema de migración multi-tenant
  • Parking.BillingRunner: Facturación automática en background

2. Parking.FrontEnd (Angular)

Aplicación web de gestión que se conecta al API. Incluye:

  • Dashboard con monitoreo en tiempo real
  • Gestión de abonados y estacionamiento rotativo
  • Facturación y caja
  • Administración de roles y permisos
  • Conexión SignalR para eventos en tiempo real

3. ALPRParkingEngine (Python / NVIDIA Jetson)

Motor de reconocimiento automático de patentes que corre en hardware edge:

  • Ejecuta en NVIDIA Jetson Orin Nano (15W)
  • Procesa video en tiempo real con Computer Vision
  • Envía detecciones via RabbitMQ al backend
  • Envía heartbeats para monitoreo de conectividad

4. Parking.Web (Next.js 15)

Sitio comercial del producto y documentación centralizada (esta documentación).

Flujo de datos

Cámara → Jetson (ALPR) → RabbitMQ → Parking.API → SignalR → Angular (Browser)

Detección de patentes

  1. La cámara captura video continuamente
  2. El Jetson procesa los frames con el modelo ALPR
  3. Cuando detecta una patente, envía un mensaje a RabbitMQ
  4. El RabbitMqConsumerService del API consume el mensaje
  5. Se guarda la detección en PostgreSQL
  6. Se envía la detección via SignalR al grupo del tenant correspondiente
  7. El browser del operador recibe la detección en tiempo real

Monitoreo de dispositivos

  1. El Jetson envía heartbeats periódicos via RabbitMQ
  2. El DeviceMonitorService verifica el último heartbeat de cada dispositivo
  3. Si un dispositivo no envió heartbeat en X segundos, se marca como offline
  4. Los cambios de estado se envían via SignalR a los browsers del tenant
  5. Se crea una notificación para el operador

Multi-tenancy

El sistema soporta múltiples estacionamientos (tenants) en una sola instancia:

  • Cada tenant tiene su propia base de datos PostgreSQL
  • El TenantMiddleware extrae el tenant_id del JWT token
  • SignalR usa grupos por tenant para aislar las notificaciones
  • El Parking.Migrator gestiona migraciones independientes por tenant

Infraestructura

ComponenteTecnología
Backend APIDocker container en Ubuntu Server
Base de datosPostgreSQL (una por tenant)
Message QueueRabbitMQ
Reverse ProxyNginx con SSL (Let's Encrypt)
Edge ComputingNVIDIA Jetson Orin Nano
FrontendServido como static build via Nginx

Comunicación en tiempo real

ParkVision usa SignalR con WebSocket para comunicación push:

  • Eventos: DeviceStatusChanged, NewDetection, NewNotification
  • Grupos: Cada tenant tiene su grupo SignalR (tenant-{id})
  • Transporte: WebSocket directo (skip negotiation) a través de Nginx
  • Reconexión: Automática con backoff exponencial