# Python 3.7+
python3 --version
# Compilador C++
g++ --version
# pip
pip --versionpip install flask pybind11Crea la siguiente estructura:
parqueadero/
├── cpp/
│ ├── parqueadero.hpp
│ ├── parqueadero.cpp
│ └── bindings.cpp
├── templates/
│ └── index.html
├── app.py
├── Makefile
└── setup.py
Opción A: Usando Makefile (recomendado)
makeOpción B: Usando setup.py
python setup.py build_ext --inplaceOpción C: Compilación manual
g++ -O3 -Wall -shared -std=c++11 -fPIC \
$(python3 -m pybind11 --includes) \
-Icpp \
cpp/parqueadero.cpp cpp/bindings.cpp \
-o parqueadero_cpp$(python3-config --extension-suffix)# Con Makefile
make run
# O directamente
python app.pyAbre tu navegador en: http://localhost:5000
✅ Backend en C++:
- Gestión de espacios de parqueadero
- Cálculo de tarifas por hora
- Control de entrada/salida de vehículos
- Alto rendimiento
✅ Frontend en Python/Flask:
- Interfaz web responsive
- Actualización en tiempo real
- API RESTful
GET /api/estado- Estado del parqueaderoPOST /api/entrada- Registrar entradaPOST /api/salida- Registrar salidaGET /api/vehiculo/<placa>- Info del vehículoGET /api/tarifa/<placa>- Calcular tarifa
- Carros: $3,000/hora
- Motos: $2,000/hora
- Carros: 20 espacios
- Motos: 30 espacios
Para cambiar capacidad o tarifas, edita en app.py:
parqueadero = parqueadero_cpp.Parqueadero(
cap_carros=20, # Espacios para carros
cap_motos=30, # Espacios para motos
tarifa_carro=3000, # Tarifa por hora
tarifa_moto=2000 # Tarifa por hora
)Si quieres guardar el historial en base de datos, agrega:
import sqlite3
# En app.py, después de crear el parqueadero
conn = sqlite3.connect('parqueadero.db', check_same_thread=False)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS historial (
id INTEGER PRIMARY KEY,
placa TEXT,
tipo TEXT,
hora_entrada TEXT,
hora_salida TEXT,
tarifa REAL
)
''')
conn.commit()Error: "No module named 'parqueadero_cpp'"
- Verifica que la compilación fue exitosa
- Ejecuta
make test
Error al compilar:
- Verifica que tienes g++ instalado
- Instala build-essential:
sudo apt install build-essential
Puerto 5000 ocupado:
- Cambia el puerto en app.py:
app.run(debug=True, port=8000)
Extensión del sistema de parqueadero que simula dispositivos IoT (cámaras de reconocimiento de placas) comunicándose con el servidor mediante TCP/IP.
┌──────────────────────┐
│ Dispositivo IoT │ Simula cámara que captura placas
│ (Cliente C++) │ Envía: ENTRADA|ABC123|carro|CAMARA-01
└──────────┬───────────┘
│ TCP/IP
│ Puerto 8080
▼
┌──────────────────────┐
│ Servidor C++ │ Recibe eventos y procesa con
│ + Parqueadero Core │ lógica del parqueadero
└──────────┬───────────┘
│ pybind11
▼
┌──────────────────────┐
│ Python/Flask │ Interfaz web + Base de datos
│ + Base de Datos │ Persistencia y reportes
└──────────────────────┘
# Compilar todo (módulo Python + cliente)
make
# O por separado
make module # Solo módulo Python
make cliente # Solo cliente dispositivo# Con MinGW/MSYS2
make
# O compilación manual del cliente
g++ -O3 -Wall -std=c++11 cliente_dispositivo.cpp cpp/socket_utils.cpp -o cliente_dispositivo.exe -Icpp -lws2_32Abstracción multiplataforma para sockets:
- Windows: Winsock2
- Linux/Mac: POSIX sockets
Servidor TCP/IP que:
- Escucha conexiones en puerto 8080
- Recibe mensajes de dispositivos
- Procesa eventos (ENTRADA/SALIDA)
- Notifica a Python mediante callbacks
Simulador de dispositivo IoT que:
- Genera placas aleatorias
- Simula detección de entradas/salidas
- Se conecta al servidor vía TCP/IP
- Modo interactivo y automático
Script Python que:
- Crea el servidor C++ desde Python
- Maneja callbacks de eventos
- Guarda en base de datos
- Interfaz de monitoreo
makeTerminal 1:
python servidor_iot.pyVerás:
╔════════════════════════════════════════╗
║ Sistema de Parqueadero IoT ║
║ Servidor de Dispositivos Remotos ║
╚════════════════════════════════════════╝
🚀 INICIANDO SERVIDOR IoT
============================================================
✅ Servidor iniciado en puerto 8080
✅ Servidor escuchando en puerto 8080
📡 Esperando dispositivos IoT...
🅿️ Capacidad: 20 carros, 30 motos
============================================================
Terminal 2:
Modo Interactivo:
# Linux/Mac
./cliente_dispositivo
# Windows
cliente_dispositivo.exeMenú:
┌─────────────────────────────┐
│ 1. Simular ENTRADA │
│ 2. Simular SALIDA │
│ 3. Tráfico automático │
│ 4. Salir │
└─────────────────────────────┘
Modo Automático:
# Linux/Mac
./cliente_dispositivo CAMARA-01 127.0.0.1 8080 auto 20
# Windows
cliente_dispositivo.exe CAMARA-01 127.0.0.1 8080 auto 20
# O con Make
make run-cliente-autoCliente envía:
ENTRADA|ABC123|carro|CAMARA-01
Servidor procesa y responde:
OK: Vehículo ABC123 registrado en espacio 5
Python recibe evento y guarda en DB:
🔔 EVENTO #1
============================================================
Tipo: ENTRADA
Placa: ABC123
Vehículo: carro
Estado: ✅ ÉXITO
Hora: 2024-01-15 14:30:25
============================================================
TIPO|PLACA|TIPO_VEHICULO|DISPOSITIVO
Campos:
TIPO: "ENTRADA" o "SALIDA"PLACA: Placa del vehículo (ej: "ABC123")TIPO_VEHICULO: "carro" o "moto" (solo para ENTRADA)DISPOSITIVO: ID del dispositivo (ej: "CAMARA-01")
Ejemplos:
ENTRADA|ABC123|carro|CAMARA-01
SALIDA|DEF456||CAMARA-02
ENTRADA|GHI789|moto|CAMARA-NORTE
Éxito:
OK: Vehículo ABC123 registrado en espacio 5
OK: Vehículo DEF456 retirado. Tarifa: $6,000
Error:
ERROR: No hay espacios disponibles para carro
ERROR: El vehículo con placa XYZ999 no está en el parqueadero
Mientras el servidor está ejecutando, puedes interactuar:
┌─────────────────────────────────┐
│ SERVIDOR IoT - MENÚ │
├─────────────────────────────────┤
│ 1. Mostrar estado │ → Estado actual del parqueadero
│ 2. Listar vehículos │ → Lista de placas dentro
│ 3. Info de vehículo │ → Detalles de un vehículo
│ 4. Estadísticas │ → Stats de la BD
│ 5. Salir │ → Detener servidor
└─────────────────────────────────┘
El servidor IoT es independiente de Flask, pero puede usarse junto a él:
Terminal 1 - Servidor IoT:
python servidor_iot.pyTerminal 2 - Cliente Dispositivo:
./cliente_dispositivoTerminal 3 - Flask (opcional):
python app.pyEsto te permite:
- Dispositivos IoT envían eventos → Servidor C++
- Usuarios web registran manualmente → Flask
- Ambos usan el mismo parqueadero
- Todo se guarda en la misma BD
Para producción necesitas:
- ✅ Autenticación de dispositivos
- ✅ Encriptación TLS/SSL
- ✅ Validación de mensajes
- ✅ Rate limiting
- ✅ Logs de auditoría
- ✅ Manejo de reconexiones
make test# Modo auto con 5 eventos
./cliente_dispositivo CAMARA-TEST 127.0.0.1 8080 auto 5# Terminal 1
python servidor_iot.py
# Terminal 2 (esperar 2 segundos)
make run-cliente-autoCausa: Puerto 8080 ocupado
Solución:
# Linux/Mac
lsof -ti:8080 | xargs kill -9
# Windows
netstat -ano | findstr :8080
taskkill /PID <PID> /FCausa: Servidor no está ejecutando
Solución: Inicia el servidor primero
Causa: Falta librería ws2_32
Solución: Asegúrate de compilar con -lws2_32
- Cámaras OCR en entradas/salidas
- Reconocimiento automático de placas
- Procesamiento centralizado
- Simular múltiples dispositivos
- Probar carga del sistema
- Validar lógica de negocio
- Mostrar sistema funcionando
- Presentaciones
- Pruebas de concepto
- README.md - Documentación principal
- Wiki - CPP Library - Detalles de la librería C++
- Wiki - Simulator - Simulador Python original
- Múltiples clientes simultáneos (threading)
- Autenticación de dispositivos
- Encriptación de mensajes
- Reconexión automática
- Dashboard web en tiempo real
- Soporte para imágenes de placas
- Configuración por archivo
- Logs estructurados