- Información del Equipo y Sistemas
- Introducción
- Arquitectura del Sistema
- Instalación y Configuración
- Uso del Sistema
- Protocolo de Comunicación
- Estructura del Código
- Pruebas y Validación
- Resolución de Problemas
- Mariana García Zapata
- Isabella Márquez Cifuentes
- Anna Sofía Giraldo Carvajal
- Windows 11Pro 24H2
- Para C:
Pacman v6.1.0 -lipbalpm v14.0.0GNU Make 4.4.1Gcc 15.2.0
- Para Java
Java 25Javac 25- Swing (Manejo de Interfaz de Usuario)
Incluido al instalar el JDK
- Para Python
Python 3.12.11Pip 25.2- Thinker (Manejo de Interfaz de Usuario)
Tlc/Tk 8.6.16
Este proyecto implementa un sistema de telemetría para vehículos autónomos que permite la comunicación bidireccional entre un vehículo (servidor (programado en C)) y múltiples clientes (usuarios programados en Java y Python)). El sistema soporta dos tipos de usuarios: administradores que pueden enviar comandos de control, y observadores que solo reciben datos de telemetría.
- Comunicación TCP/IP confiable
- Autenticación basada en tokens
- Telemetría en tiempo real cada 10 segundos
- Soporte para múltiples clientes simultáneos
- Control de comandos para administradores
- Logging completo de actividades
- Interfaces gráficas intuitivas
La arquitectura está dada por un sistema cliente-servidor basado en comunicación TCP/IP. Donde se encuentra un servidor, implementado en lenguaje C y etiquetado como “Vehículo”. Este servidor es responsable de gestionar múltiples aspectos críticos del sistema: expone un puerto TCP para recibir conexiones entrantes, maneja hilos concurrentes para atender simultáneamente a varios clientes, registra eventos mediante un módulo de logging y valida la identidad de los usuarios a través de un sistema de autenticación.
Conectados a este servidor, hay múltiples clientes que pueden ser de distintas tecnologías y roles. Entre ellos se encuentran un cliente desarrollado en Python con rol de “Observer” (observador) , un cliente en Java con rol de “Admin” (administrador), y además otros clientes adicionales que pueden asumir cualquiera de estos dos perfiles (El cliente de Python puede ser también Admin). Todos estos clientes se comunican con el servidor utilizando el protocolo TCP/IP, lo que asegura una conexión confiable y orientada a sesión.
Esta configuración permite que el sistema sea flexible y escalable, ya que puede soportar diferentes tipos de usuarios con distintos niveles de acceso —los observadores tienen permisos de lectura, mientras que los administradores tienen la capacidad de "Orientar" el vehículo—, y además admite la integración de clientes escritos en distintos lenguajes de programación, lo que facilita la interoperabilidad y el desarrollo multiplataforma.
La arquitectura refleja un modelo centralizado donde un único servidor actúa como punto de control y coordinación, mientras que los clientes, diversos en tecnología y función, interactúan con él de forma segura y estructurada, gracias a los mecanismos de autenticación, concurrencia y registro de actividad que el servidor proporciona.
- Lenguaje: C con Berkeley Sockets API
- Funcionalidad:
- Acepta múltiples conexiones simultáneas
- Autentica usuarios y genera tokens
- Envía telemetría cada 10 segundos
- Procesa comandos de administradores
- Mantiene logs detallados
- Framework: Tkinter para GUI
- Funcionalidad:
- Conexión al servidor
- Autenticación de usuario
- Visualización de telemetría en tiempo real
- Envío de comandos (si es admin)
- Framework: Swing para GUI
- Funcionalidad:
- Interfaz más robusta
- Mismas capacidades que cliente Python
- Look & Feel nativo del sistema
# Requiere Instalación previa de MSYS2 (Desde Windows)# Python 3.x con tkinter
sudo apt-get install python3 python3-tk
# O usando pip
pip install tkinter # Java JDK 8 o superior
sudo apt-get install openjdk-11-jdk
# Verificar instalación
java -version
javac -versiongit clone https://github.com/AnnaSG27/VehiculoAutonomo_Telematica#
cd VehículoAutonomoImportante, ejecutar en este mismo orden
# Desde MSYS2, navegar en la carpeta del proyecto
# Ejemplo:
cd "C:\Users\Escritorio\U\TELEMÁTICA\VehículoAutonomo"
# Es importante el uso de Comillas para evitar errores por exceso de caracteres
cd Server
make
mkdir -p logs
gcc -Wall -g server.c -o server -pthread -lws2_32 -lmingw32
./server 8080 logs/vehicle.log
# Desde esta última ejecución del comando server nos empezarán a aparecer los datos de Telemetría del vehículo con Velocidad, Batería y temperatura.
# Allí también aparecerán las conexiones de los clientes y las instrucciones que envíen al servidor.cd ClientJava
javac VehicleClientJava.java #Prepara el Compilador
java VehicleClienteJava.java #Ejecuta el Swing para manejo de usuariocd ClientPy
python3 Client.pyVehiculoAutonomo/
Server/
Server.c # Código principal del servidor
Makefile # Archivo de compilación
logs/ # Directorio para logs
server # Ejecutable compilado
ClientPy/
Client.py # Cliente Python con GUI
ClientJava/
VehicleClientJava.java # Cliente Java con Swing
VehicleClientJava.class # Clase compilada
VehicleClientJava$1.class #Clase compilada
docs/
Especificaciones.md # Especificación del protocolo
tests/
test_scripts/ # Scripts de prueba
cd Server/
./server <puerto> <archivo_log>
# Ejemplo:
./server 8080 logs/vehicle.logSalida esperada:
Servidor iniciado en puerto 8080
Logs guardándose en: logs/vehicle.log
Telemetría enviada: Speed=0.0, Battery=100.0%, Temp=22.5°C
cd ClientPy/
python3 Client.pyPasos de uso:
- Ingresar servidor y puerto (localhost:8080)
- Hacer clic en "Conectar"
- Ingresar credenciales:
- Admin:
admin/admin123 - Observer:
observer/observer123
- Hacer clic en "Autenticar"
- Visualizar telemetría automática
cd ClientJava/
javac VehicleClientJava.java
java VehicleClientJava.java- Usuario:
admin - Contraseña:
admin123 - Permisos:
- Recibir telemetría
- Enviar comandos de control
- Listar usuarios conectados
- Usuario:
observer - Contraseña:
observer123 - Permisos:
- Solo recibir telemetría
[TIPO_MENSAJE]|[TIMESTAMP]|[TOKEN]|[DATOS]|[CHECKSUM]
Cliente → Servidor: Conexión TCP
Cliente ← Servidor: Conexión aceptada
Cliente → Servidor: AUTH_REQUEST|1634567890|NULL|admin:admin123|CHECKSUM
Cliente ← Servidor: AUTH_RESPONSE|1634567890|9F8E7D6C5B4A3918|ADMIN:200|CHECKSUM
Cliente ← Servidor: TELEMETRY|1634567900|NULL|45.5:78.2:25.1:NORTH:6.2442:-75.5812|CHECKSUM
Cliente ← Servidor: TELEMETRY|1634567910|NULL|47.1:77.8:25.3:NORTHEAST:6.2444:-75.5810|CHECKSUM
Cliente → Servidor: COMMAND_REQUEST|1634567920|9F8E7D6C5B4A3918|SPEED_UP:10|CHECKSUM
Cliente ← Servidor: COMMAND_RESPONSE|1634567920|NULL|200:Speed increased to 55.5 km/h|CHECKSUM
SPEED_UP:valor- Incrementar velocidadSLOW_DOWN:valor- Decrementar velocidadTURN_LEFT:grados- Girar a la izquierdaTURN_RIGHT:grados- Girar a la derechaSTOP- Detener vehículo
200: Éxito400: Solicitud incorrecta401: No autorizado403: Prohibido500: Error interno del servidor
int main(int argc, char *argv[]) // Función principal
void *client_handler(void *arg) // Manejo de clientes individuales
void *telemetry_broadcaster(void *arg) // Broadcast de telemetría
void process_command(int client_idx, ...) // Procesamiento de comandos
int authenticate_user(const char *username, const char *password) // Autenticación
void log_message(const char *client_info, const char *type, const char *message) // Loggingtypedef struct {
int socket; // Socket del cliente
struct sockaddr_in address; // Dirección del cliente
char token[TOKEN_SIZE + 1]; // Token de autenticación
char username[MAX_USERNAME + 1]; // Nombre de usuario
int user_type; // 1: ADMIN, 0: OBSERVER
int active; // Estado activo
time_t last_activity; // Última actividad
} client_t;
typedef struct {
float speed; // Velocidad actual
float battery; // Nivel de batería
float temperature; // Temperatura interna
char direction[20]; // Dirección de movimiento
float latitude; // Latitud GPS
float longitude; // Longitud GPS
int running; // Estado del vehículo
} vehicle_data_t;class VehicleClient:
def __init__(self) # Inicialización
def setup_gui(self) # Configuración GUI
def connect(self) # Conexión al servidor
def authenticate(self) # Autenticació
def send_command(self, command, params) # Envío de comandos
def receive_messages(self) # Recepción de mensajes
def process_telemetry(self, data) # Procesamiento de telemetría
def update_telemetry_display(self) # Actualización de interfazprivate void initializeGUI() // Inicialización de interfaz
private void connect() // Conexión al servidor
private void authenticate() // Autenticación
private void sendCommand(String command, String params) // Envío de comandos
private void receiveMessages() // Recepción de mensajes
private void handleTelemetry(String data) // Manejo de telemetría
private void updateTelemetryDisplay(...) // Actualización de interfaz# Probar compilación
make clean && make
# Probar inicio del servidor
./server 8080 logs/test.log
# Probar conexión básica
telnet localhost 8080# Terminal 1: Servidor
./server 8080 logs/test.log
# Terminal 2: Cliente Python
python3 Client.py
# Terminal 3: Cliente Java
java VehicleClientJava.java
# Terminal 4: Monitoreo de logs
tail -f logs/test.log- Conectar cliente
- Usar credenciales correctas (admin/admin123)
- Verificar recepción de token
- Confirmar habilitación de botones de comando
- Conectar cliente
- Usar credenciales incorrectas
- Verificar mensaje de error
- Confirmar botones deshabilitados
- Conectar cliente Python como admin
- Conectar cliente Java como observer
- Verificar que ambos reciben telemetría
- Verificar que solo admin puede enviar comandos
- Autenticarse como admin
- Enviar comando SPEED_UP:10
- Verificar cambio en telemetría
- Verificar log en servidor
- Conectar cliente
- Cerrar cliente bruscamente
- Verificar limpieza en servidor
- Verificar log de desconexión
- Clientes simultáneos: Hasta 50 (configurable en MAX_CLIENTS)
- Frecuencia de telemetría: Cada 10 segundos
- Latencia de comandos: < 100ms típica
- Memoria del servidor: ~2MB + 50KB por cliente
- CPU del servidor: < 5% en condiciones normales
- Ancho de banda: ~1KB/cliente cada 10s para telemetría
Síntoma: El servidor no puede iniciar en el puerto especificado Solución:
# Encontrar proceso usando el puerto
lsof -i :8080
netstat -tulpn | grep 8080
# Terminar proceso
kill -9 <PID>
# O usar puerto diferente
./server 8081 logs/vehicle.logSíntomas: "Connection refused" o timeout Soluciones:
- Verificar que el servidor esté ejecutándose
- Verificar firewall:
sudo ufw allow 8080 - Verificar IP/puerto correctos
- Probar con telnet:
telnet localhost 8080
Síntomas: Credenciales correctas pero autenticación falla Soluciones:
- Verificar formato del mensaje (no hay caracteres especiales)
- Revisar logs del servidor para ver mensaje recibido
- Verificar que el cliente envía el formato correcto
Síntomas: Cliente conectado y autenticado pero no hay datos Soluciones:
- Verificar que el hilo de telemetría esté corriendo
- Revisar logs del servidor
- Verificar que el cliente esté procesando mensajes TELEMETRY
Síntomas: Botones habilitados pero comandos no se ejecutan Soluciones:
- Verificar autenticación como ADMIN
- Verificar token válido
- Revisar formato del comando en logs
- Verificar que el servidor procese COMMAND_REQUEST
Síntomas: Interfaz gráfica se congela Soluciones:
- Python: Verificar que operaciones de red estén en hilos separados
- Java: Usar SwingUtilities.invokeLater() para actualizar GUI
- Verificar que no hay bucles infinitos en receive_messages()
Síntomas: Archivo de log vacío o no se crea Soluciones:
# Verificar permisos
ls -la logs/
chmod 755 logs/
chmod 644 logs/vehicle.log
# Crear directorio si no existe
mkdir -p logs
# Verificar espacio en disco
df -h# Ver procesos activos
ps aux | grep server
# Ver conexiones de red
netstat -an | grep 8080
# Monitorear logs en tiempo real
tail -f logs/vehicle.log
# Ver uso de memoria
top -p $(pgrep server)# Probar conexión TCP básica
nc -zv localhost 8080
# Enviar mensaje manual
echo "AUTH_REQUEST|$(date +%s)|NULL|admin:admin123|CHECKSUM" | nc localhost 8080
# Verificar puerto abierto
lsof -i :8080# Compilar con símbolos de depuración
gcc -g -pthread -o server server.c
# Ejecutar con gdb
gdb ./server
(gdb) run 8080 logs/debug.log
(gdb) bt # Si hay crash[TIMESTAMP] [CLIENT_IP:PORT] [REQUEST/RESPONSE] [MESSAGE]
Ejemplos:
[2025-09-26 14:30:15] [192.168.1.100:54321] [CONNECT] Nueva conexión establecida
[2025-09-26 14:30:20] [192.168.1.100:54321] [REQUEST] AUTH_REQUEST|1727361020|NULL|admin:admin123|CHECKSUM
[2025-09-26 14:30:20] [192.168.1.100:54321] [RESPONSE] AUTH_RESPONSE|1727361020|9F8E7D6C5B4A3918|ADMIN:200|CHECKSUM
[2025-09-26 14:30:30] [192.168.1.100:54321] [REQUEST] COMMAND_REQUEST|1727361030|9F8E7D6C5B4A3918|SPEED_UP:10|CHECKSUM
# Contar conexiones por día
grep "CONNECT" logs/vehicle.log | grep "2025-09-26" | wc -l
# Ver errores de autenticación
grep "401\|403" logs/vehicle.log
# Monitorear comandos más usados
grep "COMMAND_REQUEST" logs/vehicle.log | cut -d'|' -f4 | sort | uniq -c
# Ver clientes más activos
grep "REQUEST" logs/vehicle.log | cut -d' ' -f2 | sort | uniq -c- Cifrado SSL/TLS: Implementar conexiones seguras
- Autenticación mejorada: Base de datos de usuarios, hashing de contraseñas
- Rate limiting: Limitar número de comandos por minuto
- Logs de seguridad: Detectar intentos de acceso no autorizado
- Persistencia de datos: Guardar telemetría en base de datos
- API REST: Interfaz web adicional
- Notificaciones: Alertas por batería baja, errores, etc.
- Configuración dinámica: Cambiar parámetros sin reiniciar
- Pool de hilos: Limitar recursos del servidor
- Compresión: Reducir ancho de banda para telemetría
- Cache: Optimizar respuestas frecuentes
- Balanceador de carga: Múltiples instancias de servidor
- Dashboard web: Interfaz moderna con JavaScript
- Gráficos en tiempo real: Visualización de tendencias
- Mapas GPS: Mostrar ubicación en mapa interactivo
- Aplicación móvil: Cliente para Android/iOS
-
Servidor compilado y funcionando
-
Cliente Python con GUI funcional
-
Cliente Java con GUI funcional
-
Makefile funcional
-
Documentación completa
-
Video demostrativo (12 min)
-
Repositorio GitHub configurado
-
Código comentado y limpio
-
Pruebas realizadas
VehiculoAutonomo/
Server/
Server.c # Código principal del servidor
Makefile # Archivo de compilación
logs/ # Directorio para logs
server # Ejecutable compilado
ClientPy/
Client.py # Cliente Python con GUI
ClientJava/
VehicleClientJava.java # Cliente Java con Swing
VehicleClientJava.class # Clase compilada
VehicleClientJava$1.class #Clase compilada
docs/
Especificaciones.md # Especificación del protocolo
tests/
test_scripts/ # Scripts de prueba
README.md # Instrucciones básicas
demo/
screenshots/ # Capturas de pantalla
Video # Enlace al video
Archivos PNG # Evidencias de Compilacion
-
Introducción (1 min): Explicación del proyecto y objetivos
-
Arquitectura (2 min): Diagrama y explicación componentes
-
Servidor (3 min): Compilación, ejecución y logs
-
Cliente Python (2 min): Demostración de conexión, autenticación, telemetría
-
Cliente Java (2 min): Misma demostración con diferente interfaz
-
Comandos de control (1 min): Mostrar funcionalidad admin
-
Conclusiones (1 min): Conclusiones
Este proyecto proporciona una implementación completa de un sistema de telemetría para vehículos autónomos, demostrando conceptos fundamentales de programación de red, protocolos de aplicación, y desarrollo de interfaces gráficas. La solución cumple con todos los requerimientos especificados y proporciona una base sólida para futuras correcciones. El sistema ha sido diseñado con énfasis en la escalabilidad y facilidad de uso.