import socket
import time
import random
import datetime

# --- Configuración del cliente ---
# Cambia estos valores para que coincidan con tu servidor
SERVER_IP = '127.0.0.1'
SERVER_PORT = 9099

# --- Parámetros de envío ---
INTERVAL = 0.1  # Segundos entre cada envío

def generate_report():  
    """Genera la trama con datos dinámicos."""
    # Variable 1: Hexadecimal aleatorio de 4 dígitos
    random_int = random.randint(0, 65535)
    random_hex = f'{random_int:04x}'

    # Variable 2: Fecha y hora en formato AAAAMMDDHHMMSS
    now = datetime.datetime.now()
    timestamp = now.strftime('%Y%m%d%H%M%S')
    
    # Crea la cadena de mensaje usando las variables
    # No olvides la 'f' al inicio para que sea una f-string
    message_str = f'+RESP:GTFRI,271102,999999999999999,gv300w,14490,11,1,1,14.5,273,4.1,-58.668692,-34.476290,{timestamp},0722,0310,432B,1713D9B,00,27441.5,,,,88,220900,,,,20250818175517,{random_hex}$'
    
    # Convierte la cadena a bytes antes de enviarla
    return message_str.encode('utf-8')

def main():
    """Simula un cliente TCP con conexión persistente."""
    print(f"Intentando conectar a {SERVER_IP}:{SERVER_PORT}...")
    
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect((SERVER_IP, SERVER_PORT))
            print("Conexión establecida. Iniciando envío de paquetes.")
            count = 1
            while True:
                
                # Genera el reporte con los datos dinámicos
                message_bytes = generate_report()
                
                try:
                    count = count + 1
                    s.sendall(message_bytes)
                    print(f"numero de envio: {count} [{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Paquete enviado. {message_bytes} Esperando {INTERVAL} segundos...")
                    
                    time.sleep(INTERVAL)
                except (BrokenPipeError, ConnectionResetError) as e:
                    print(f"[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] ERROR: La conexión se cortó. {e}")
                    break
                except Exception as e:
                    print(f"[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Ocurrió un error inesperado: {e}")
                    break
            
            print("Tiempo de prueba finalizado. Cerrando conexión.")
            
    except ConnectionRefusedError:
        print(f"ERROR: Conexión rechazada. Asegúrate de que el servidor esté activo y escuchando en {SERVER_IP}:{SERVER_PORT}")
    except Exception as e:
        print(f"ERROR: No se pudo establecer la conexión: {e}")

if __name__ == "__main__":
    main()