En la primera parte de esta práctica configuramos la placa Arduino UNO Q con un teclado matricial 4x4 y habilitamos su conexión Wi-Fi para enviar mediante sockets TCP cada pulsación hacia un puerto específico dentro de nuestra red local.
En esta segunda entrega vamos a trabajar directamente sobre nuestra máquina virtual o física con Kali Linux. Crearemos un servidor socket TCP en Python denominado Listener_Kali.py que actuará como receptor pasivo en segundo plano. Cuando el Arduino transmita los paquetes de datos con cada pulsación, nuestro script los procesará en tiempo real y los mostrará en la terminal con formato detallado.
● Python 3 instalado (incluido por defecto en Kali Linux).
● Conocer la dirección IP local de la máquina Kali (usando
ip a o ifconfig).● Tener habilitado el tráfico en el puerto de escucha (por defecto 5000/TCP).
CREACIÓN DEL SCRIPT LISTENER_KALI.PY
Abre la terminal en Kali Linux, crea un nuevo archivo llamado Listener_Kali.py y añade el siguiente código fuente:
#!/usr/bin/env python3
import socket
from datetime import datetime
# 1. Configuración de Red del Listener
HOST = '0.0.0.0' # Escucha en todas las interfaces de red de Kali
PORT = 5000 # Debe coincidir con el kali_port configurado en Arduino
def iniciar_servidor():
# Crear el socket TCP (IPv4 + Stream)
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Reutilizar la dirección si el socket se cierra de forma abrupta
servidor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
servidor.bind((HOST, PORT))
servidor.listen(1)
print("=" * 55)
print("[+] LISTENER KALI LINUX INICIADO (IoT - Arduino UNO Q)")
print(f"[+] Escuchando en el puerto TCP: {PORT}")
print("[+] Esperando conexión de la placa Arduino...")
print("=" * 55)
while True:
cliente, direccion = servidor.accept()
hora_conexion = datetime.now().strftime("%H:%M:%S")
print(f"\n[!] [{hora_conexion}] ¡Conexión establecida desde {direccion[0]}:{direccion[1]}!")
try:
while True:
# Buffer de recepción (1 byte por carácter pulsado)
datos = cliente.recv(1024)
if not datos:
print("\n[-] Conexión cerrada por el dispositivo cliente.")
break
tecla = datos.decode('utf-8', errors='ignore')
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] [TECLA RECIBIDA] --> {tecla}")
except ConnectionResetError:
print("\n[-] El Arduino se ha desconectado repentinamente.")
finally:
cliente.close()
print("[+] Esperando reconexión del dispositivo...")
except KeyboardInterrupt:
print("\n\n[!] Deteniendo el Listener por el usuario (Ctrl + C)...")
finally:
servidor.close()
print("[+] Servidor TCP cerrado correctamente.")
if __name__ == '__main__':
iniciar_servidor()
Python (Kali Linux)
ANÁLISIS DEL CÓDIGO PYTHON
A continuación detallamos el funcionamiento de las partes esenciales del script en Python:
1. Creación del Socket TCP
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servidor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Instanciamos un objeto socket con la familia AF_INET (IPv4) y el protocolo de transporte orientado a conexión SOCK_STREAM (TCP). Utilizar SO_REUSEADDR permite liberar rápidamente el puerto 5000 al reiniciar el script sin tener que esperar el tiempo de expiración predeterminado del sistema operativo.
2. Vinculación y Escucha (Bind & Listen)
servidor.bind((HOST, PORT))
servidor.listen(1)
Asignamos la dirección IP 0.0.0.0 para escuchar peticiones de cualquier tarjeta de red de nuestra máquina (Ethernet, Wi-Fi, o interfaz virtual). La función listen(1) pone el socket en modo pasivo a la espera de la conexión entrante desde el Arduino UNO Q.
3. Recepción y Decodificación de Datos
datos = cliente.recv(1024)
tecla = datos.decode('utf-8', errors='ignore')
El método cliente.recv(1024) bloquea la ejecución hasta recibir paquetes de red. En cuanto el Arduino envía el carácter leído del teclado matricial, la cadena binaria se convierte a texto legibles codificado en UTF-8 y se acompaña de la fecha y hora exacta del registro (timestamp).
EJECUCIÓN Y PRUEBAS DEL PROYECTO COMPLETO
Para verificar el correcto funcionamiento de toda la arquitectura IoT, sigue estos pasos:
- Obtener IP de Kali Linux: En una terminal de Kali, ejecuta
ip ay copia la IP asignada a tu interfaz de red local (ejemplo:192.168.1.45). - Ajustar el Sketch de Arduino: En el código desplegado en la primera parte, sustituye
192.168.1.XXpor la IP exacta que obtuviste en el paso anterior. Carga el programa en el Arduino UNO Q. - Ejecutar el Listener en Kali:
python3 Listener_Kali.py - Pulsar el Teclado Matricial: Presiona cualquier botón en el teclado 4x4 conectado al Arduino. En la pantalla del Listener verás reflejado el carácter presionado instantáneamente.
Captura del servidor en Kali Linux registrando las pulsaciones remotas del teclado en tiempo real.