Este proyecto utiliza un microcontrolador ESP8266 configurado como punto de acceso (Access Point) para detectar dispositivos con WiFi activado que se conectan a una red abierta. Una vez conectados, se recolecta información como la dirección MAC, IP asignada y tiempo de conexión. Estos datos se envían por puerto serie y son almacenados por un script Python en un archivo .csv, que actúa como base de datos local.
Es ideal para estrategias de marketing, estudios de tráfico de personas en locales, o como base para sistemas de conteo anónimo.
- 📶 Placa ESP8266 (NodeMCU, Wemos D1 Mini, etc.)
- 🔌 Cable USB para programación
- Arduino IDE
- Python 3.x
- Spyder, VSCode o cualquier editor Python
- Abrí Arduino IDE
- Ir a
Archivo > Preferencias - En "Gestor de URLs adicionales de tarjetas", agregá:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
- Ir a
Herramientas > Placa > Gestor de placas, buscáesp8266y hacé clic en instalar
- Placa:
NodeMCU 1.0 (ESP-12E Module)o la que corresponda - Puerto: Verificado en
Administrador de dispositivos > Puertos (COM)
#include <ESP8266WiFi.h>
struct Dispositivo {
uint8_t mac[6];
IPAddress ip;
unsigned long tiempoInicio;
};
Dispositivo dispositivos[10];
int total = 0;
void setup() {
Serial.begin(115200);
WiFi.softAP("Red_Local_Publica"); // red sin contraseña
Serial.println("Red WiFi abierta iniciada...");
}
void loop() {
int cantidad = WiFi.softAPgetStationNum();
struct station_info *lista = wifi_softap_get_station_info();
struct station_info *estacion = lista;
Serial.println("---- NUEVA LECTURA ----");
Serial.print("Dispositivos conectados: ");
Serial.println(cantidad);
int index = 0;
while (estacion != NULL && index < 10) {
IPAddress ip = IPAddress((uint32_t)estacion->ip.addr);
uint8_t* mac = estacion->bssid;
// Mostrar en Serial
Serial.print("MAC: ");
for (int i = 0; i < 6; i++) {
if (i > 0) Serial.print(":");
Serial.print(mac[i], HEX);
}
Serial.print(" | IP: ");
Serial.print(ip);
Serial.print(" | Tiempo conectado (s): ");
if (dispositivos[index].tiempoInicio == 0) {
dispositivos[index].tiempoInicio = millis();
dispositivos[index].ip = ip;
memcpy(dispositivos[index].mac, mac, 6);
}
unsigned long tiempo = (millis() - dispositivos[index].tiempoInicio) / 1000;
Serial.println(tiempo);
// Enviar datos por serial para Python
Serial.print("DATA;");
for (int i = 0; i < 6; i++) {
if (i > 0) Serial.print("-");
Serial.print(mac[i], HEX);
}
Serial.print(";");
Serial.print(ip);
Serial.print(";");
Serial.println(tiempo);
estacion = STAILQ_NEXT(estacion, next);
index++;
}
wifi_softap_free_station_info();
delay(10000);
}// pip install pyserialimport serial
import csv
import time
from datetime import datetime
# Configura el puerto serial (ajustá el nombre de COM según tu sistema)
puerto = serial.Serial('COM6', 115200, timeout=1)
time.sleep(2) # Esperar al inicio
# Archivo CSV
archivo = open("registro_wifi.csv", mode="a", newline="")
writer = csv.writer(archivo)
writer.writerow(["Fecha", "Hora", "MAC", "IP", "Tiempo_conectado_seg"])
print("Escuchando datos desde ESP8266...")
try:
while True:
linea = puerto.readline().decode("utf-8").strip()
if linea.startswith("DATA;"):
partes = linea.split(";")
if len(partes) == 4:
now = datetime.now()
fecha = now.strftime("%Y-%m-%d")
hora = now.strftime("%H:%M:%S")
mac = partes[1]
ip = partes[2]
tiempo = partes[3]
writer.writerow([fecha, hora, mac, ip, tiempo])
print(f"{fecha} {hora} -> MAC: {mac} | IP: {ip} | {tiempo} seg")
except KeyboardInterrupt:
print("Interrumpido por el usuario.")
archivo.close()
puerto.close() # Código Python...- Conectá la placa ESP8266 a tu PC
- Verificá el puerto COM correcto
- Ejecutá el script Python desde tu entorno o consola:
python recolector_datos_wifi_esp8266.pyUn archivo llamado registro_wifi.csv que contiene registros como estos:
| Fecha | Hora | MAC | IP | Tiempo_conectado_seg |
|---|---|---|---|---|
| 2025-05-18 | 14:00:05 | 8A-F2-15-93-01-AC | 192.168.4.2 | 45 |
- ✅ Verificar siempre que el puerto serie esté disponible
- 📢 Informar a los clientes mediante carteles sobre la recolección pasiva de datos
- 🔐 Esta es una implementación educativa. Para uso en producción se requieren medidas de seguridad adicionales.
Kevin Alcalde
