Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
esp_wifi_repeater — Un router NAT WiFi totalmente funcional (y ahora también un repetidor WiFi) | Kitploit
Herramientas/GitHubGitHub/martin-ger/esp_wifi_repeater
Seguridad de Sistemas EmbebidosSniffing y Análisis de PaquetesAuditoría Wi-FiSeguridad IoTSeguridad de RedesSeguridad InalámbricaSeguridad de Hardware e IoTAnálisis de DNS
GitHubmartin-ger/esp_wifi_repeater

esp_wifi_repeater

Un router NAT WiFi totalmente funcional (y ahora también un repetidor WiFi)

Ver Repositorio
5.2k981hace 2 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

esp_wifi_repeater

Un router NAT WiFi totalmente funcional (y ahora también un repetidor WiFi, también conocido como puente L2)

NUEVO 2026: 10 años después de la primera versión, por fin se ha convertido en lo que siempre pretendió ser: un verdadero repetidor WiFi. Para no romper ninguna documentación ni enlace existente, la edición estándar sigue siendo la conocida versión de router NAT con todas las funciones avanzadas. Pero si te interesa un puente L2 real y reducido, mira más abajo en la sección Repetidor WiFi ESP8266 - puente L2.

Esta es una implementación de un router NAT WiFi para esp8266 y esp8285. También incluye soporte para un cortafuegos de filtrado de paquetes con ACLs, mapeo de puertos, modelado de tráfico, hooks para monitorización remota (o captura de paquetes), una interfaz de gestión MQTT, interacción GPIO sencilla y gestión de energía. Para una configuración con múltiples routers en una malla que cubra un área más grande, se ha incluido un nuevo modo "Automesh".

Si buscas una forma de integrar la funcionalidad NAT en tu proyecto Arduino - consulta aquí .

Router NAT ESP32 es el proyecto avanzado para el ESP32.

Los escenarios de uso típicos incluyen:

  • Extensor de alcance simple para una red WiFi existente
  • Redes (en malla) exteriores alimentadas por batería
  • Configurar una red WiFi adicional con diferente SSID/contraseña para invitados
  • Configurar una red segura y restringida para dispositivos IoT
  • Traducir redes WPA2 Enterprise a WPA-PSK
  • Sonda de monitorización para análisis de tráfico WiFi
  • Experimentos de red con rutas, ACLs y modelado de tráfico
  • Dispositivo IoT en malla con capacidades básicas de E/S y control MQTT

Por defecto, el ESP actúa como STA y como soft-AP y reenvía transparentemente cualquier tráfico IP a través de él. Como usa NAT, no se requieren entradas de enrutamiento ni en el lado de la red ni en las estaciones conectadas. Las estaciones se configuran por defecto mediante DHCP en la red 192.168.4.0/24 y reciben la dirección de su servidor DNS de la red WiFi existente.

Las mediciones muestran que puede alcanzar unos 5 Mbps en ambas direcciones, por lo que incluso el streaming es posible.

Algunos detalles se explican en este vídeo.

Instalador Web

Para flashear directamente el dispositivo, usa el Instalador Web.

Primer Arranque

El esp_wifi_repeater inicia con la siguiente configuración por defecto:

  • ap_ssid: MyAP, ap_password: none, ap_on: 1, ap_open: 1
  • network: 192.168.4.0/24

Después del primer arranque (o del restablecimiento de fábrica) ofrecerá una red WiFi con un AP abierto y el ssid "MyAP". Aún no intenta reconectarse automáticamente a un AP de enlace ascendente (ya que no conoce un ssid o contraseña válidos).

Conéctate a esta red WiFi y realiza la configuración básica, ya sea mediante una interfaz web sencilla o mediante la configuración completa con todas las opciones a través de la consola.

Interfaz Web de Configuración Básica

La interfaz web permite configurar todos los parámetros necesarios para la funcionalidad básica de reenvío. Gracias a rubfi por el trabajo principal en esto: https://github.com/rubfi/esp_wifi_repeater/ . Apunta tu navegador a "http://192.168.4.1". Debería aparecer esta página:

Primero introduce los valores apropiados para la red WiFi de enlace ascendente, los "Ajustes STA". Usa la contraseña "none" para redes abiertas. Marca la casilla "Automesh" solo si realmente quieres usar el modo automesh. Haz clic en "Connect". El ESP se reinicia y se conectará a tu router WiFi. El LED de estado debería parpadear después de unos segundos.

Si has seleccionado automesh, has terminado con la configuración. Configurar los "Ajustes del Soft AP" no es necesario, ya que en el modo automesh estos ajustes son idénticos a los "Ajustes STA". El mismo ssid será ofrecido por todos los repetidores ESP conectados.

Si no estás usando automesh, ahora puedes recargar la página y cambiar los "Ajustes del Soft AP". Haz clic en "Set" y de nuevo el ESP se reinicia. Ahora está listo para reenviar tráfico a través del Soft AP recién configurado. Ten en cuenta que estos cambios también afectan a la interfaz de configuración, es decir, para hacer más configuraciones, conéctate al ESP a través de una de las redes WiFi recién configuradas. Para el acceso a través del Soft AP, recuerda la dirección de la red del Soft AP si la has cambiado (el ESP siempre tiene la dirección x.x.x.1 en esta red).

Si quieres, puedes marcar la casilla "lock" y hacer clic en "Lock". Ahora la configuración no se puede cambiar sin desbloquearla primero con la contraseña de la red WiFi de enlace ascendente (define una aunque la red sea abierta).

Si quieres introducir caracteres no ASCII o especiales en la interfaz web, tienes que usar codificación hexadecimal estilo HTTP como "My%20AccessPoint". Esto dará como resultado la cadena "My AccessPoint". Con esta codificación hexadecimal puedes introducir cualquier valor de byte que quieras, excepto 0 (por razones internas de C).

Si has cometido un error y has perdido todo contacto con el ESP, aún puedes usar la consola serie para recuperarlo ("reset factory", ver más abajo).

Interfaz de Línea de Comandos

La configuración avanzada debe realizarse mediante la línea de comandos en la interfaz de consola. Esta consola está disponible ya sea a través del puerto serie a 115200 baudios o mediante el puerto tcp 7777 (por ejemplo, "telnet 192.168.4.1 7777" desde una STA conectada).

Usa los siguientes comandos para una configuración inicial:

  • set ssid SSID_de_tu_router
  • set password contraseña_de_tu_router
  • set ap_ssid SSID_del_ESP
  • set ap_password contraseña_del_ESP
  • show (para comprobar los parámetros)
  • save
  • reset

De nuevo, si quieres introducir caracteres no ASCII o especiales puedes usar codificación hexadecimal estilo HTTP (por ejemplo, "My%20AccessPoint") o, solo en la CLI, como atajo, comillas estilo C con barra invertida (por ejemplo, "My\ AccessPoint"). Ambos métodos darán como resultado la cadena "My AccessPoint".

La línea de comandos entiende muchos más comandos:

Comandos Básicos

Suficientes para que funcione en casi todos los entornos.

  • help: imprime un mensaje de ayuda breve
  • set [ssid|password] valor: cambia los ajustes para el AP de enlace ascendente (configuración WiFi de tu router doméstico), usa la contraseña "none" para redes abiertas.
  • set [ap_ssid|ap_password] valor: cambia los ajustes para el soft-AP del ESP (para tus estaciones)
  • show [config|stats]: imprime la configuración actual o información de estado y estadísticas
  • save [dhcp]: guarda los parámetros de configuración actuales, las ACLs y las entradas de enrutamiento [+ las concesiones DHCP actuales] en la flash
  • lock [contraseña]: guarda y bloquea la configuración actual, no se permiten cambios. La contraseña se puede dejar vacía si ya se ha establecido antes (el valor por defecto es la contraseña del WiFi de enlace ascendente)
  • unlock contraseña: desbloquea la configuración, requiere la contraseña del comando lock
  • reset [factory]: reinicia el esp, 'factory' opcionalmente restablece los parámetros WiFi a los valores por defecto (en un dispositivo bloqueado solo funciona desde la consola serie)
  • quit: termina una sesión remota

Comandos Avanzados

La mayoría de los comandos set solo son efectivos después de save y reset.

Cualquier parte de una entrada de línea de comandos después de un solo "#" hasta el final de la línea se tratará como un comentario y se ignorará.

Configuración de Automesh

  • set automesh [0|1]: selecciona si el modo automesh está activado o desactivado (por defecto), ver detalles aquí https://github.com/martin-ger/esp_wifi_repeater#automesh-mode
  • set am_threshold dB: establece el umbral para una conexión "mala" (en dB negativos, por defecto 85, es decir, -85 dB)
  • set am_scan_time seg: establece el intervalo de tiempo en segundos que el ESP intenta en modo automesh encontrar un AP de enlace ascendente antes de dormirse (0 deshabilitado, por defecto)
  • set am_sleep_time seg: establece el intervalo de tiempo en segundos que el ESP duerme en modo automesh si no se encuentra ningún AP de enlace ascendente (0 deshabilitado, por defecto)

Configuración WiFi

  • set ap_on [0|1]: selecciona si el soft-AP está deshabilitado (ap_on=0) o habilitado (ap_on=1, por defecto)
  • set ap_open [0|1]: selecciona si el soft-AP usa seguridad WPA2-PSK (ap_open=0, automático, si se establece una ap_password) o abierta (ap_open=1)
  • set auto_connect [0|1]: selecciona si la STA debe seguir reintentando reconectarse al AP. auto_connect está desactivado (0) después del primer flasheo o después de "reset factory". Cuando introduces un nuevo SSID se activa automáticamente (1).
  • set ssid_hidden [0|1]: selecciona si el SSID del soft-AP está oculto (ssid_hidden=1) o visible (ssid_hidden=0, por defecto)
  • set phy_mode [1|2|3]: establece el PHY_MODE del WiFi (1=b, 2=g, 3=n(por defecto))
  • set country CC: establece el código de país regulatorio WiFi como un código ISO 3166-1 de 2 letras (por ejemplo, "US", "DE", "CN", "JP"). Los códigos que no sean US desbloquean los canales 12 y 13. Vacío (por defecto) deja el valor por defecto del SDK. El ajuste se guarda en la flash y se vuelve a aplicar en cada arranque.
  • set bssid xx:xx:xx:xx:xx:xx: establece el BSSID específico del AP de enlace ascendente al que conectarse (por defecto 00:00:00:00:00:00, que significa cualquiera)
  • set [ap_mac|sta_mac] xx:xx:xx:xx:xx:xx: establece la dirección MAC de la STA y del SOFTAP a un valor definido por el usuario (el bit 0 del primer byte de la dirección MAC no puede ser 1)
  • set sta_mac random: establece una nueva MAC STA aleatoria después de cada reinicio
  • set sta_hostname nombre: establece el nombre de la STA (visible para el AP de enlace ascendente)
  • set max_clients [1-8]: establece el número de STAs que pueden conectarse al SoftAP (el límite de la implementación del SoftAP del ESP es 8, por defecto)
  • scan: realiza un escaneo de APs
  • connect: intenta conectarse a un AP con el ssid y password configurados actualmente
  • disconnect: se desconecta de cualquier AP de enlace ascendente

Configuración WPA2 Enterprise

  • set use_peap [0|1]: selecciona si la STA debe conectarse mediante WPA-PSK simple (use_peap=0, por defecto) o usando WPA2 Enterprise (PEAP)
  • set peap_identity valor: establece la identidad 'exterior' de PEAP (la cadena que se presenta primero al servidor RADIUS, quizás [email protected])
  • peap_username valor: establece el nombre de usuario PEAP
  • peap_password valor: establece la contraseña PEAP

Configuración TCP/IP

  • set network ip-addr: establece la dirección IP de la red interna, la red es siempre /24, el router es siempre x.x.x.1
  • set dns dns-addr: establece una dirección DNS estática que se distribuye a los clientes mediante DHCP
  • set dns dhcp: configura el uso de la dirección DNS dinámica del DHCP, por defecto
  • set ip ip-addr: establece una dirección IP estática para la interfaz STA
  • set ip dhcp: configura la dirección IP dinámica para la interfaz STA, por defecto
  • set netmask netmask: establece una máscara de red estática para la interfaz STA
  • set gw gw-addr: establece una dirección de puerta de enlace estática para la interfaz STA
  • set max_nat nº_de_entradas: establece el tamaño de la tabla NAPT (por defecto 512)
  • set max_portmap nº_de_entradas: establece el tamaño de la tabla de portmap (por defecto 32)
  • set tcp_timeout seg: establece el timeout NAPT para conexiones TCP (0=por defecto (1800 seg))
  • set udp_timeout seg: establece el timeout NAPT para conexiones UDP (0=por defecto (2 seg))
  • set lease min: establece el tiempo de concesión en minutos para el servidor DHCP de la red interna (por defecto 120)
  • show dhcp: imprime el estado actual de la tabla de concesiones dhcp

Enrutamiento

  • show route: muestra la tabla de enrutamiento actual
  • route clear: borra todas las rutas estáticas
  • route add red gw: añade una ruta estática a una red (red dada en notación CIDR ('x.x.x.x/n')) a través de la puerta de enlace gw
  • route delete red: elimina una ruta estática a una red
  • interface inX [up|down]: establece el estado de la interfaz arriba o abajo (sin enrutamiento IP/tráfico a través de interfaces abajo, por defecto: up)
  • set nat [0|1]: selecciona si la interfaz soft-AP está NATeada (nat=1, por defecto) o no (nat=0). Sin NAT, el reenvío transparente del tráfico de las STAs internas no funciona. Útil principalmente en combinación con enrutamiento estático.
  • portmap add [TCP|UDP] puerto_externo ip_interna puerto_interno: añade un reenvío de puertos
  • portmap remove [TCP|UDP] puerto_externo: elimina un reenvío de puertos
  • nslookup nombre: inicia una consulta DNS para el nombre dado y muestra el resultado
  • ping host: comprueba la conectividad IP con eco/replicación ICMP (host como dirección IP o nombre DNS)

Configuración de Cortafuegos/Monitorización

  • acl [from_sta|to_sta|from_ap|to_ap] [TCP|UDP|IP] ip-origen [puerto_origen] ip-destino [puerto_destino] [allow|deny|allow_monitor|deny_monitor]: añade una nueva regla al ACL
  • acl [from_sta|to_sta|from_ap|to_ap] clear: borra todo el ACL
  • show acl: muestra los ACLs definidos y algunas estadísticas
  • set acl_debug [0|1]: activa/desactiva la salida de depuración del ACL - todos los paquetes denegados se registrarán en el terminal
  • set [upstream_kbps|downstream_kbps] bitrate: establece un bitrate máximo de subida/bajada (0 = sin límite, por defecto)
  • set daily_limit límite_en_KB: define una cantidad máxima de kilobytes que pueden transferir las STAs por día (0 = sin límite, por defecto)
  • set timezone desplazamiento_horas: define la zona horaria local (requerido para saber cuándo termina un día a las 00:00)
  • monitor [on|off|acl] puerto: inicia y detiene el servidor de monitorización en un puerto dado

Configuración de Interfaz de Usuario

  • set config_port nº_puerto: establece el número de puerto del inicio de sesión de consola (por defecto 7777, 0 deshabilita la configuración remota por consola)
  • set web_port nº_puerto: establece el número de puerto del servidor web de configuración (por defecto 80, 0 deshabilita la configuración web)
  • set config_access modo: controla las redes que permiten acceso de configuración para consola y web (0: sin acceso, 1: solo interno, 2: solo externo, 3: ambos (por defecto))

Configuración GPIO

  • show gpio: muestra la configuración gpio
  • gpio [0-16] mode [in|in_pullup|out]: configura un puerto GPIO del ESP (guardado en flash)
  • gpio [0-16] set [high|low]: escribe en un puerto de salida
  • gpio [0-16] set [high|low] for segundos: escribe en un puerto de salida y revierte después de una cierta duración
  • gpio [0-16] get: lee de un puerto de entrada
  • gpio [0-16] trigger [0-16] [monostable_NO|monostable_NC|bistable_NO|bistable_NC]: enlaza un puerto de entrada a un puerto de salida, ya sea como normalmente abierto monoestable (pulsador que se dispara cuando el estado cambia a bajo), normalmente cerrado monoestable (pulsador que se dispara cuando el estado cambia a alto), normalmente abierto biestable (interruptor que replica la entrada), o normalmente cerrado biestable (interruptor cuyo estado es el opuesto de la entrada)
  • gpio [0-16] trigger none: borra el enlace

Configuración del Chip

  • set speed [80|160]: establece la frecuencia de reloj de la CPU (por defecto 160 MHz)
  • sleep segundos: pone el ESP en sueño profundo durante el número de segundos especificado. Valores válidos entre 1 y 4294 (aprox. 71 minutos)
  • set status_led nºGPIO: selecciona un pin GPIO para el LED de estado (por defecto 2, >16 deshabilitado)
  • set hw_reset nºGPIO: selecciona un pin GPIO para un restablecimiento de fábrica por hardware (>16 deshabilitado, por defecto)
  • set ap_watchdog seg: establece el timeout del watchdog del AP - si no se reciben paquetes durante seg desde el AP de enlace ascendente, el repetidor se reinicia ("none" = sin timeout, por defecto)
  • set client_watchdog seg: establece el timeout del watchdog del cliente - si no se reciben paquetes durante seg de cualquier cliente conectado, el repetidor se reinicia ("none" = sin timeout, por defecto)
  • set vmin voltaje: establece el voltaje mínimo de la batería en mV. Si Vdd cae por debajo, el ESP entra en sueño profundo. Si es 0, no ocurre nada
  • set vmin_sleep seg: establece el intervalo de tiempo en segundos que el ESP duerme con voltaje bajo

LED de Estado

En la configuración por defecto, GPIO2 está configurado para controlar un LED de estado (conectado a GND) con las siguientes indicaciones:

  • permanentemente encendido: iniciado, pero no conectado correctamente al AP (sin IP externa válida)
  • parpadeando (1 por segundo): funcionando, conectado al AP
  • parpadeando de forma irregular: funcionando, tráfico en la red interna

Con "set status_led nºGPIO" se puede cambiar el pin GPIO (cualquier valor > 16, por ejemplo, "set status_led 255" deshabilitará el LED de estado por completo). Cuando se configura en GPIO1, funciona con el LED azul incorporado en las placas ESP-01. Sin embargo, como GPIO1 también es el pin UART-TX, esto significa que la consola serie no funciona. La configuración se limita entonces al acceso de red.

Restablecimiento de Fábrica por Hardware

Si pones en bajo un GPIO seleccionado durante más de 3 segundos, el repetidor hará un restablecimiento de fábrica y se reiniciará con la configuración por defecto. Con "set hw_reset nºGPIO" se puede cambiar el pin GPIO (cualquier valor > 16, por ejemplo, "set hw_reset 255" deshabilitará la función de restablecimiento de fábrica por hardware).

Para muchos módulos, incl. ESP-01s y NodeMCUs, probablemente sea una buena idea usar GPIO 0 para esto, ya que se usa de todos modos. Sin embargo, no es el pin por defecto, ya que podría interferir con ponerlo en bajo durante el flasheo. Por lo tanto, si quieres usar un pulsador existente en GPIO 0 para el restablecimiento de fábrica por hardware, configúralo con "set hw_reset 0" y "save" después del flasheo. Un restablecimiento de fábrica activado por el pin HW NO restablecerá el número de GPIO hw_reset configurado ("reset factory" desde la consola sí lo hará).

Mapeo de Puertos

Para permitir que clientes de la red externa se conecten al puerto del servidor en la red interna, los puertos deben mapearse. Un puerto externo se mapea a un puerto interno de una dirección IP interna específica. Usa el comando "portmap add" para eso. Los mapeos de puertos se pueden listar con el comando "show" y se guardan con la configuración actual.

Sin embargo, para asegurarse de que el dispositivo esperado está escuchando en una determinada dirección IP, hay que asegurarse de que este dispositivo tenga la misma dirección IP una vez que se reinicie él o el ESP. Para lograrlo, o bien se pueden configurar direcciones IP fijas en los dispositivos o el ESP debe recordar sus concesiones DHCP. Esto se puede lograr con el comando "save dhcp". Guarda el estado actual y todas las concesiones DHCP, para que se restauren después del reinicio. Las concesiones DHCP se pueden listar con el comando "show stats".

WPA2 Enterprise (PEAP)

El soporte para WPA2 Enterprise (PEAP) ahora se ha incluido en el proyecto. Permite un "conversor" que traduce una red WPA2 enterprise con autenticación PEAP a una red WPA2-PSK. Esto resuelve un problema común, especialmente en entornos universitarios: la red WiFi local es una red WPA2 Enterprise con autenticación PEAP-MSCHAPv2. Un ejemplo muy destacado es la red "eduroam", disponible en muchas universidades de todo el mundo. El problema es que muchos dispositivos IoT no pueden manejar la autenticación WPA2 Enterprise. Por lo tanto, el desarrollo y las demos son difíciles. Lo que es muy útil es un "conversor" que se conecte a la red WPA2 Enterprise y ofrezca una red WPA-PSK más simple a sus clientes.

Para usarlo, establece los siguientes parámetros de configuración: ssid, use_peap, peap_identity, peap_username y peap_password (no necesitas el parámetro de contraseña habitual). Esta configuración debe realizarse (y guardarse) a través de la CLI y no está disponible en la interfaz web.

El código actualmente no verifica el certificado del servidor RADIUS. Es vulnerable a ataques MITM, cuando alguien configura un AP y un servidor RADIUS falsos. Aunque la contraseña no se envía en texto plano, se sabe que el MSCHAPv2 utilizado está roto. Además, ten en cuenta que el ESP8266 ahora contiene la contraseña de tu red enterprise. Todo el tráfico que reenvía ahora puede ser relacionado por el administrador de red con tu cuenta. No lo uses mal ni lo ofrezcas a terceros no confiables, por ejemplo configurando una red abierta. E incluso cuando el dispositivo está bloqueado, la contraseña de tu red enterprise puede extraerse en texto plano a través del puerto serie desde la flash del ESP.

Modo Automesh

A veces es posible que quieras usar varios esp_wifi_repeaters en cadena o en malla para cubrir una mayor distancia o área. Generalmente, esto se puede hacer sin problemas con routers NAT; de hecho, tendrás varias capas de NAT. Sin embargo, esto significa que la conectividad es limitada: todos los nodos pueden hablar con internet, pero generalmente no hay conectividad IP directa entre los nodos. Y, por supuesto, el ancho de banda disponible disminuye cuantos más saltos necesites. Pero los usuarios han informado que incluso 5 esp_wifi_repeaters en cadena funcionan bastante bien.

En tal configuración, la configuración es una actividad bastante lenta y propensa a errores. Para simplificarlo, el esp_wifi_repeater ahora tiene un nuevo modo: "Automesh". Simplemente configura el SSID y la contraseña y activa "automesh" (ya sea en la CLI con "set automesh 1" o en la interfaz web marcando la casilla). Esto hará lo siguiente:Cada esp_wifi_repeater configurado de esa manera ofrecerá automáticamente una red WiFi en el AP con el mismo SSID/contraseña que la red a la que está conectado. Los clientes pueden usar los mismos ajustes de WiFi para la red original o para las repetidas. Cada esp_wifi_repeater configurado con "automesh" buscará primero el mejor otro AP al que conectarse. Este es el que está más cerca de la red WiFi original y tiene la mejor intensidad de señal (RSSI).

La intensidad de la señal es fácil de medir con un escaneo, pero ¿cuál es el más cercano a la red WiFi original cuando ves varios APs con el mismo SSID? Por lo tanto, el protocolo usa un truco algo sucio: los esp_wifi_repeaters en modo "automesh" manipulan su BSSID (en realidad, según el estándar IEEE 802.11 esto es el "ESSID" ya que es un AP, pero el SDK lo llama "BSSID"), es decir, la dirección MAC de su interfaz AP, que se envía con cada trama de baliza aproximadamente 10 veces por segundo. Usa el formato: 24:24:mm:rr:rr:rr. "24:24" es solo el identificador único de un repetidor (hay una probabilidad mínima de que esto colisione con el MAC de los APs reales, pero podemos ignorar esto, ya que podemos cambiar ese prefijo si realmente es necesario). "mm" significa el "nivel de malla", es decir, la distancia en saltos a la red WiFi original. Los últimos tres "rr:rr:rr" son solo números aleatorios para distinguir los distintos ESPs. El AP original mantiene su BSSID, es decir, el que no tiene el prefijo "24:24" se reconoce como raíz, llamado nivel de malla 0.

Ahora cada esp_wifi_repeater puede aprender qué otro esp_wifi_repeater está más cerca de la red WiFi original, puede conectarse a él y elegir su propio BSSID en consecuencia. También la dirección IP de la red interna se ajusta al nivel de malla: 10.24.m.0. Esto crea un árbol (una malla muy especial) con el AP WiFi original como raíz y nodos repetidores en varios niveles de malla (en realidad, funciona de manera algo similar al Protocolo de Árbol de Expansión (STP) en la capa de enlace o al enrutamiento en la capa de red mediante un protocolo de vector de distancia). Tan pronto como se detecta una pérdida del enlace ascendente, se reinicia la configuración. Esto debería evitar bucles, ya que durante la (re)configuración tampoco se envían balizas con un BSSID.

Por conveniencia, el esp_wifi_repeater después de la configuración "automesh" primero intenta comprobar si puede conectarse a un AP ascendente. Si esto falla, incluso cuando se ha encontrado un AP con el SSID correcto, asume que el usuario cometió un error con la contraseña y se restablece a los valores de fábrica. Después de haberse conectado correctamente una vez, asumirá que la configuración es correcta y seguirá intentándolo tras una pérdida de conexión o reinicio durante el tiempo que sea necesario (para evitar un ataque DoS con un AP mal configurado).

Ajuste de Automesh

Si hay más de un ESP dentro del alcance, puede haber un compromiso entre un camino "malo" más corto y un camino "bueno" más largo (bueno y malo en términos de calidad de enlace). El parámetro am_threshold determina qué es una mala conexión: si el RSSI en un escaneo es menor que este umbral, una conexión es mala y se prefiere un camino con un salto más. Es decir, dado que am_threshold es 85 y hay dos nodos automesh detectados en el escaneo: A con nivel 1 y RSSI -88 dB y B con nivel 2 y RSSI -60 dB, entonces un enlace a A se considera demasiado malo (-88 dB < -am_threshold) y se prefiere B. El nuevo nodo se convertirá en un nodo de nivel 3 con enlace ascendente a través de B. am_threshold se da como un valor positivo pero significa un valor negativo en dB. Un valor más pequeño es mejor.

Si quieres obtener más información sobre la topología de una red automesh, puedes considerar conectar todos los nodos a un broker MQTT y dejar que publiquen el tema "Topology" (ver más abajo). Si ahora te suscribes a "/WiFi/+/system/Topology" obtendrás toda la información de nodos y enlaces, incluido el RSSI (de los ESPs conectados) que necesitas para reconstruir el grafo completo y detectar enlaces débiles en la malla. El tema TopologyInfo contiene la siguiente estructura JSON, que se puede utilizar para reconstruir un grafo completo de una red automesh:``` { "nodeinfo" { "id":"ESP_07e37e", "ap_mac":"24:24:01:72:c7:f9", "sta_mac":"60:01:bc:07:e3:7e", "uplink_bssid":"00:1a:54:93:23:0a", "ap_ip":"10.24.1.1", "sta_ip":"192.168.178.33", "rssi":"-66", "mesh_level":"1", "no_stas":"2" }, "stas":[ {"mac":"5c:cf:45:11:7f:13","ip":"10.24.1.2"}, {"mac":"00:14:22:76:99:c5","ip":"10.24.1.3"} ] }

root@kitploit:~
Usando los dos parámetros _am_scan_time_ y _am_sleep_time_ se puede implementar la gestión de energía en modo automesh, si se ha conectado GPIO16 a RST. Tras el arranque, el esp_wifi_repeater escanea durante _am_scan_time_ segundos en busca de APs de enlace ascendente disponibles. Si no encuentra ninguno, entra en deepsleep durante _am_sleep_time_ segundos y lo intenta de nuevo tras el reinicio (el valor predeterminado es 0 = deshabilitado para ambos parámetros).

# Monitorización
Desde la consola se puede iniciar un servicio de monitorización ("monitor on [portno]"). Este servicio refleja el tráfico de la red interna en formato pcap hacia un flujo TCP. Por ejemplo, con "netcat [external_ip_of_the_repeater] [portno] | sudo wireshark -k -S -i -" desde un ordenador de la red externa, ahora se puede observar el tráfico de la red interna en tiempo real. Úselo, por ejemplo, para observar con qué sitios de internet se están comunicando sus clientes internos. Tenga en cuenta que esto al menos duplica la carga del esp y de la red WiFi. Con una carga elevada, esto puede provocar que algunos paquetes se trunquen o incluso se descarten en la sesión de monitorización. PRECAUCIÓN: dejar este puerto abierto es un posible problema de seguridad. Cualquier persona de las redes locales puede conectarse y observar su tráfico.

# Firewall
El router ESP tiene un firewall básico integrado. Se pueden aplicar ACL (Listas de Control de Acceso) a la interfaz SoftAP. Esta es una piedra angular en la seguridad de IoT, cuando el router se utiliza para llevar otros dispositivos IoT a internet. Se puede utilizar para evitar, p. ej., que los dispositivos IoT de terceros "llamen a casa", que sean utilizados como bots de malware, y para proteger su red doméstica con PC, tabletas y teléfonos de ser visibles para los dispositivos de domótica.

Las cuatro listas ACL se denominan "from_sta", "to_sta", "from_ap" y "to_ap" para los paquetes entrantes y salientes en ambas interfaces ("sta" significa las interfaces hacia los clientes conectados, "ap" la interfaz hacia el AP de enlace ascendente). Las ACL se definen "en estilo CISCO IOS".

El siguiente ejemplo es útil para una subred de invitados. Permite el acceso a internet pero no a ninguna otra dirección local (use el rango de su red local para la dirección xx.xx.xx.xx). Este conjunto de reglas permite las difusiones locales salientes (para DHCP) y UDP 53 (DNS), cualquier otro paquete hacia la subred del router ascendente será bloqueado, todos los demás paquetes pueden pasar a internet:```
acl from_sta clear
acl from_sta IP any 255.255.255.255 allow
acl from_sta UDP any any any 53 allow
acl from_sta IP any xx.xx.xx.xx/24 deny
acl from_sta IP any any allow

El siguiente ejemplo es más restrictivo y resulta útil cuando se planifica una subred de IoT con acceso muy restringido en el AP del ESP. También permitirá broadcasts locales salientes (para DHCP), UDP 53 (DNS) y TCP 1883 (MQTT) a un broker local, pero cualquier otro paquete será bloqueado, incluido el acceso arbitrario a Internet (puede adaptar la cuarta regla según sus necesidades para habilitar otros hosts):``` acl from_sta clear acl from_sta IP any 255.255.255.255 allow acl from_sta UDP any any any 53 allow acl from_sta TCP any any 192.168.0.0/16 1883 allow acl from_sta IP any any deny

root@kitploit:~
ACLs for the "to_sta" direction may be defined as well, but this is usually not required, as the reverse direction is quite well protected against unsolicited traffic by the NAT transation.

ACLs consist of filtering rules that are processed for each packet. Each rule consists of a protocol (IP, TCP, or UDP), source address/port, destination address/port, as well as an action "allow" or "deny". In case of plain IP no ports, only addresses are given. IP rules include TCP and UDP packets. Addresses can be given as subnet addresses in the "/" notation, e.g. 192.168.178.0/24. Also "any" can be used as wildcard, it matches on any address or portnumber. A rule is defined by the "acl" command:

- acl [from_sta|to_sta|from_ap|to_ap] [TCP|UDP|IP] _src-ip_ [_src_port_] _desr-ip_ [_dest_port_] [allow|deny|allow_monitor|deny_monitor]

The rules are processed top-down in the order of their appearance in the list. The first rule that matches a packet is applied and determies whether a packet is allowed (and forwarded) or denied (and dropped). This means, special cases first, general rules at the end. If there are rules in an ACL all packets that don't match any rule are denied by default. Thus, the last rule "from_sta IP any any deny" in the example above is not really needed, as it is the default anyway. If an ACL is empty, all packets are allowed.

Definition of ACL rules works also top-down: a new rule is always added at the end of a list. To change an ACL you first have to clear it completely (acl from_sta clear) and then rebuild it. ACLs are saved with the config. "show acl" will print out the ACLs plus statistics on the number of hits for each rule and the overall number of allowed and denied packets.

With the command "set acl_debug 1" a summary of all denied packets is printed to the console. Also, an MQTT topic can publishe this summary. This can be used for firewall configuration to determine which rules are required to get the connected devices working. It also gives a hint if, if unexpected traffic happens (and is denied). 

For deeper analysis the monitoring service can be used (even denied packets are reported to the monitor before they are dropped). When the monitor is started with the "monitor acl _port_" command, ACLs can be used as online filters. All rules that are defined as 
"allow_monitor" instead of "allow" and "deny_monitor" instead of "deny" are processed as usual, resulting in allowing of forwarding a packet, but they also send the packet to the monitor. Thus a list of rules that basically "allow" or "allow_monitor" all packets still makes sense, as it can be used to select already during catpure time which packet should be recorded. E.g. a lists:```
acl from_sta clear
acl from_sta IP 192.168.0.0/16 any allow_monitor
acl from_sta IP any any allow

acl to_sta clear
acl to_sta IP any 192.168.0.0/16 allow_monitor
cl to_sta IP any any allow

permitirá todos los paquetes y también seleccionará todos los paquetes para monitorización que vayan de una estación a la subred 192.168.0.0/16 (local) y de la 192.168.0.0/16 a una estación. Por supuesto, un filtro de este tipo también puede aplicarse después de la captura a un rastro de monitorización completo, pero si ya sabes lo que buscas, estos filtros en línea ayudarán a reducir drásticamente la sobrecarga de monitorización. También puede usarse para depurar todas las reglas de firewall de denegación simplemente usando "deny_monitor" en lugar de deny.

Rutas estáticas

Por defecto, la interfaz del AP está traducida mediante NAT, de modo que cualquier nodo conectado al AP podrá acceder al mundo exterior de forma transparente a través de la interfaz STA del ESP. Así que no se requiere ninguna acción adicional, a menos que seas un auténtico friki de las redes.

Para aquellos que estén realmente interesados en una configuración de red más avanzada: la pila IPv4 lwip del ESP se ha mejorado para este proyecto con soporte para rutas estáticas: "show route" muestra la tabla de enrutamiento con todas las rutas conocidas, incluidos los enlaces a las interfaces de red conectadas (la interfaz AP y la interfaz STA). El enrutamiento entre estas dos interfaces funciona sin configuración adicional. Se pueden añadir rutas adicionales a otras redes mediante el comando "route add network gateway", conocido de los sistemas Linux o routers. Un comando "save" escribe el estado actual de la tabla de enrutamiento en la configuración flash.

Aquí hay un ejemplo sencillo de lo que se puede hacer con rutas estáticas. Dado el siguiente esquema de red con dos ESP conectados por las interfaces STA a través de un router doméstico central:``` | 10.0.1.1 AP-ESP1-STA 192.168.1.10 | <-> |Home Router| <-> | 192.168.1.20 STA-ESP2-AP 10.0.2.1|

root@kitploit:~
Cada ESP tiene una segunda red detrás de su AP con diferentes direcciones de red: 10.0.1.0/24 y 10.0.2.0/24. ESP1 puede hacer ping a ESP2 hacia la 192.168.1.20, pero no a la 10.0.2.1, ya que no sabe que puede alcanzarla a través de la 192.168.1.20. Esto cambia si añades dos rutas estáticas. En ESP1:```
route add 10.0.2.0/24 192.168.1.20

y en ESP2:``` route add 10.0.1.0/24 192.168.1.10

root@kitploit:~
Ahora un "ping 10.0.2.1" en ESP1 tendrá éxito. Se envía a 192.168.1.20 y luego es respondido por ESP2.

Ahora en cada red se conecta un cliente adicional (con direcciones 10.0.1.2 y 10.0.2.2):```
| STA1 10.0.1.2 | <-> | 10.0.1.1 ESP1 192.168.1.10 | <-> |Home Router| <-> | 192.168.1.20 ESP2 10.0.2.1| <-> | STA2 10.0.2.2 |

Ahora incluso el cliente STA1 con la dirección local 10.0.1.2 puede hacer ping a STA2 con 10.0.2.2, ya que envía su solicitud primero a su router por defecto ESP1 y este sabe que todos los paquetes destinados a una dirección 10.0.2.0/24 deben reenviarse a 192.168.1.20. Allí el ESP2 sabe cómo enviarlos a STA2. Lo mismo aplica para la respuesta en la otra dirección.

Esto te permite configurar una topología multi-estrella de ESPs, donde cada ESP y sus clientes STA pueden alcanzarse directamente entre sí (sin necesidad de mapeos de puertos). La configuración de las rutas requeridas puede ser algo tediosa, pero es un buen ejercicio de redes. El siguiente paso sería portar un protocolo de enrutamiento dinámico como RIP al ESP...

Límites de Bitrate

Al establecer upstream_kbps y downstream_kbps a un valor distinto de 0 (0 es el valor por defecto), puedes limitar el bitrate máximo del AP del ESP. Este valor es un límite que se aplica al tráfico de todos los clientes conectados. Los paquetes que excedan el bitrate definido se descartan. El conformador de tráfico utiliza el algoritmo "Token Bucket" con un tamaño de cubo de actualmente cuatro veces el bitrate por segundo, lo que permite ráfagas cuando no ha habido tráfico anteriormente.

Soporte MQTT

Desde la versión 1.3 el router incluye un cliente MQTT integrado (gracias a Tuan PM por su librería https://github.com/tuanpmt/esp_mqtt). Esto puede ayudar a integrar el router/repetidor en el IoT. Un sistema de domótica puede, por ejemplo, tomar decisiones basadas en información sobre las estaciones actualmente asociadas, puede encender y apagar los repetidores (por ejemplo, según un horario), o simplemente usarse para monitorizar la carga. El router puede conectarse a un broker MQTT local o a un broker disponible públicamente en la nube. Sin embargo, actualmente no soporta cifrado TLS.

Por defecto, el cliente MQTT está deshabilitado. Se puede habilitar estableciendo el parámetro de configuración "mqtt_host" a un nombre de host distinto de "none". Para configurar MQTT puedes establecer los siguientes parámetros:

  • set mqtt_host IP_or_hostname: IP o nombre de host del broker MQTT ("none" deshabilita el cliente MQTT)
  • set mqtt_port port: Puerto del broker MQTT utilizado para la conexión (por defecto: 1883)
  • set mqtt_qos QoS: Valor QoS de MQTT para publicaciones y suscripciones (0-2, por defecto: 0)
  • set mqtt_user username: Nombre de usuario para la autenticación ("none" si el broker no requiere autenticación)
  • set mqtt_password password: Contraseña para la autenticación
  • set mqtt_id clientId: Id del cliente en el broker (por defecto: "ESPRouter_xxxxxx" derivado de la dirección MAC)
  • set mqtt_prefix prefix_path: Prefijo para todos los temas publicados (por defecto: "/WiFi/ESPRouter_xxxxxx/system", también derivado de la dirección MAC)
  • set mqtt_command_topic command_topic: Tema suscrito para recibir comandos, igual que desde la consola. (por defecto: "/WiFi/ESPRouter_xxxxxx/command", "none" deshabilita los comandos vía MQTT)
  • set mqtt_interval secs: Establece el intervalo en el que el router publica los temas de estado (por defecto: 15s, 0 deshabilita la publicación de estado)
  • set mqtt_mask mask_in_hex: Selecciona qué temas se publican (por defecto: "ffff" significa todos)

Los parámetros MQTT se pueden mostrar con el comando "show mqtt".

El router puede publicar periódicamente los siguientes temas de estado (cada mqtt_interval):

  • prefix_path/Uptime: Tiempo de actividad del sistema desde el último reinicio en s (mask: 0x0020)
  • prefix_path/Vdd: Voltaje de la fuente de alimentación en mV (mask: 0x0040)
  • prefix_path/Bpsin: KBytes/s desde las estaciones hacia el AP (mask: 0x0800)
  • prefix_path/Bpsout: KBytes/s desde el AP hacia las estaciones (mask: 0x0800)
  • prefix_path/Bpd: KBytes por día desde y hacia las estaciones (mask: 0x0400)
  • prefix_path/Ppsin: Paquetes/s desde las estaciones hacia el AP (mask: 0x0200)
  • prefix_path/Ppsout: Paquetes/s desde el AP hacia las estaciones (mask: 0x0200)
  • prefix_path/Bin: Bytes totales desde las estaciones hacia el AP (mask: 0x0100)
  • prefix_path/Bout: Bytes totales desde el AP hacia las estaciones (mask: 0x0100)
  • prefix_path/NoStations: Número de estaciones actualmente conectadas al AP (mask: 0x2000)
  • prefix_path/TopologyInfo: Estructura JSON con la información de topología actual del nodo (mask: 0x1000)

Además, el repetidor puede publicar según eventos:

  • prefix_path/join: Dirección MAC de una estación que se une al AP (mask: 0x0008)
  • prefix_path/leave: Dirección MAC de una estación que abandona el AP (mask: 0x0010)
  • prefix_path/IP: Dirección IP del router cuando se recibe vía DHCP (mask: 0x0002)
  • prefix_path/ScanResult: Tema separado para los resultados de un comando "scan" (un mensaje por cada AP encontrado) (mask: 0x0004)
  • prefix_path/ACLDeny: Un paquete ha sido denegado por una regla ACL y ha sido descartado (mask: 0x0080)

Como LWT e informe de estado, el repetidor publica:

  • prefix_path/status: Un tema retenido que es "online" (tan pronto como el repetidor se conecta) u "offline" (después de la pérdida de conexión como LWT)

El router se puede configurar utilizando los siguientes temas:

  • command_topic: El router se suscribe a este tema e interpreta todos los mensajes como líneas de comando
  • prefix_path/response: El router publica en este tema la salida de la línea de comandos (mask: 0x0001)

Si ahora quieres que el router publique, por ejemplo, solo Vdd, su IP y la salida de la línea de comandos, establece mqtt_mask a 0x0001 | 0x0002 | 0x0040 (= "set mqtt_mask 0043").

Soporte de Ethernet ENC28J60

El esp_wifi_repeater ahora incluye soporte para una tarjeta de red Ethernet ENC28J60 conectada vía SPI (Gracias a Andrew Kroll https://github.com/xxxajk por su gran trabajo para lograrlo), si activas la opción de compilación HAVE_ENC28J60 en "user_config.h". La interfaz Ethernet soportará aproximadamente 1 Mbps cuando el ESP esté funcionando a 160 MHz. Activar la interfaz AP y usar Ethernet como uplink convertirá al esp_wifi_repeater en un AP económico para dispositivos WiFi (por ejemplo, otros ESPs).

La conexión vía SPI debe ser:``` NodeMCU/Wemos ESP8266 ENC28J60

root@kitploit:~
    D6     GPIO12 <---> MISO
    D7     GPIO13 <---> MOSI
    D5     GPIO14 <---> SCLK
    D8     GPIO15 <---> CS
    D1     GPIO5  <---> INT
D2     GPIO4  <---> RESET
           Q3/V33 <---> 3.3V
           GND    <---> GND
root@kitploit:~
Cables cortos y soldados funcionan mejor. Además necesitarás un transistor para desacoplar GPIO15; de lo contrario, tu ESP ya no arrancará. Ver: https://esp8266hints.wordpress.com/category/ethernet/ . También es importante tener una buena fuente de alimentación: el ENC28j60 necesita unos 160mA cuando está activo. En mi caso falla si intento usar los 3.3V de la placa ESP.

Ahora puedes configurar la nueva interfaz Ethernet: 
- set eth_enable [0|1]: habilita/deshabilita una NIC Ethernet ENC28J60 en el bus SPI (por defecto: 0 - deshabilitado)
- set eth_ip _ip-addr_: establece una dirección IP estática para la interfaz ETH
- set eth_netmask _netmask_: establece una máscara de red estática para la interfaz ETH
- set eth_gw _gw-addr_: establece una dirección de puerta de enlace estática para la interfaz ETH
- set eth_dhcpd [0|1]: inicia un servidor DHCP para direcciones IP dinámicas en la interfaz ETH (por defecto: 0 - deshabilitado)

# Gestión de energía
El repetidor supervisa su tensión de alimentación actual (que se muestra en el comando "show stats"). Esto solo funciona si el byte 107 en esp_init_data_default.bin, llamado vdd33_const, está configurado en 255 (0xFF). La forma más sencilla de lograrlo es escribir esp_init_data_default_v08_vdd33.bin en la flash (ver más abajo).

Si _vmin_ (en mV, por defecto 0) se establece a un valor > 0 y la tensión de alimentación cae por debajo de ese valor, el dispositivo entrará en modo de suspensión profunda durante _vmin_sleep_ segundos. Si has conectado GPIO16 a RST (lo cual es difícil de soldar en un ESP-01), se reiniciará después de ese intervalo, intentará reconectarse y continuará con sus mediciones. Si _vmin_ se guarda con la configuración, dormirá una y otra vez hasta que la tensión de alimentación supere el umbral. Estos ajustes son especialmente (¿solo?) útiles si has alimentado el ESP con una batería (de litio) sin protección contra descarga profunda. Entonces, un valor de 2900mV-3000mV probablemente sea útil, ya que reduce el consumo de energía del ESP al mínimo y dispones de mucho más tiempo para recargar o reemplazar la batería antes de que se dañe. Esto solo tiene sentido si tienes el ESP conectado directamente a la batería. Si tienes lógica adicional, esta seguirá agotando la batería.

Puedes enviar el ESP a dormir manualmente una vez usando el comando "sleep".

Precaución: Si guardas un valor de _vmin_ superior a la tensión máxima de alimentación en la flash, el repetidor se apagará inmediatamente cada vez después del reinicio. Entonces tendrás que borrar toda la configuración grabando blank.bin (o cualquier otro archivo) en 0x0c000.

# Repetidor WiFi - Puente L2

El proyecto ofrece ahora dos modos operativos distintos: **Router NAT** y **Puente de Capa 2** (denominado "modo repetidor"). Si bien ambos modos amplían la cobertura de red, difieren fundamentalmente en cómo manejan el tráfico y la identidad de los dispositivos.

### Modo Router NAT (Estándar)
En este modo, como se ha descrito anteriormente, el dispositivo actúa como una puerta de enlace estándar. Crea una nueva subred y realiza traducción de direcciones de red (NAT) para todos los dispositivos conectados a su punto de acceso (AP).

*   **Aislamiento de subred**: Los clientes conectados están en una subred privada (p. ej., 192.168.4.x) y quedan protegidos de la red principal.
*   **Identidad del tráfico**: Todo el tráfico de los clientes aparece ante el router principal como si se originara desde la propia dirección IP/MAC del ESP8266.
*   **Simplicidad**: No requiere configuración especial en el router ascendente y es compatible con prácticamente todas las redes Wi-Fi estándar.
*   **Limitación**: Los dispositivos de la red principal no pueden iniciar fácilmente conexiones con los dispositivos detrás del repetidor debido a la barrera NAT, a menos que se utilice mapeo de puertos.

### Modo Puente de Capa 2 (variante "repetidor")
Este modo implementa un puente transparente de Capa 2 (capa de enlace de datos). El ESP8266 extiende la red principal existente en lugar de crear una subred secundaria.

*   **Puente transparente**: El ESP8266 puentea el tráfico a nivel de trama Ethernet. Los clientes conectados reciben direcciones IP directamente del servidor DHCP de la red principal (mediante DHCP snooping/relay).
*   **Red unificada**: Todos los dispositivos (tanto en el repetidor como en el router principal) existen en el mismo dominio de difusión L2.
*   **Visibilidad de los dispositivos**: Los dispositivos detrás del repetidor conservan sus identidades MAC e IP originales en la red principal. Esto permite que los protocolos de descubrimiento local (como mDNS/Bonjour, UPnP o el descubrimiento de red) funcionen sin problemas en toda la red.
*   **Complejidad**: Requiere manejo avanzado, como Proxy ARP y DHCP snooping, para garantizar que la red ascendente enrute correctamente el tráfico de vuelta a los clientes "ocultos" conectados a través del repetidor.
*   **Caso de uso**: Ideal cuando se requiere descubrimiento de dispositivos (p. ej., controlar una impresora o un dispositivo doméstico inteligente mediante una aplicación móvil) en toda la red.

El modo repetidor tiene menos funciones: no se requieren enrutamiento, mapeo de puertos ni DHCP; las ACL y Automesh tampoco tienen mucho sentido, ni tampoco la monitorización de red mediante pcap. Por lo tanto, todas estas funciones no están disponibles en el modo repetidor. Además, se ha eliminado MQTT. Las funciones restantes siguen disponibles a través de la consola o la consola remota.

Puedes encontrar los binarios precompilados en la carpeta "firmware-repeater".

La configuración inicial de la versión en modo repetidor es básicamente tan simple como la del router NAT. Mediante la consola serie, simplemente establece ssid, password, ap_ssid y ap_password, luego guarda y reinicia. Si prefieres hacerlo a través de la interfaz web, también es simple, pero debes seguir el orden correcto:

- Conéctate al WiFi "MyAP" con tu cliente
- Apunta el navegador a "http://192.168.4.1"
- Introduce **primero** el ssid y la contraseña de los ajustes del AP, configúralo y reinicia
- Luego conéctate al ssid del AP recién definido, apunta el navegador de nuevo a "http://192.168.4.1"
- Ahora introduce el ssid y la contraseña de los ajustes STA y conéctate

Una vez definido el ssid de STA, el repetidor ya no ejecutará su propio servidor DHCP, sino que recibirá su IP del DHCP ascendente (ya no 192.168.4.1). Para conectarte a su página web o a la consola remota, puedes usar el nombre "esp-wifi-repeater.local", si tu cliente es compatible con mDNS, o tienes que buscar la dirección asignada en tu router ascendente (o en la consola serie con "show stats"). Siempre puedes restablecer el ESP mediante la consola y "reset factory".

### Resumen de las diferencias clave

| Característica | Router NAT | Puente de Capa 2 |
| :--- | :--- | :--- |
| **Arquitectura de red** | Crea una subred nueva y aislada | Extiende el dominio de difusión existente |
| **Direccionamiento IP** | Los clientes usan un pool secundario | Los clientes usan el servidor DHCP ascendente |
| **Descubrimiento (mDNS/UPnP)** | A menudo bloqueado/difícil | Totalmente compatible (transparente) |
| **Visibilidad ascendente** | Identidad del cliente oculta (NAT) | Identidad del cliente preservada |
| **Implementación** | Redes estándar | Proxying avanzado (Proxy ARP/Snooping) |

# Compilación y grabación
Para grabar directamente los binarios precompilados en el dispositivo, usa el [Web-Installer](https://martin-ger.github.io/esp_wifi_repeater/). 

Si tienes Docker instalado, la forma más sencilla de acceder al entorno de compilación completo es conectar tu ESP8266 a /dev/ttyUSB0 y ejecutar la imagen usando:```
git clone https://github.com/martin-ger/esp_wifi_repeater.git
docker run -it --rm --device=/dev/ttyUSB0 -v $(pwd)/esp_wifi_repeater:/home/esp/esp_wifi_repeater martinfger/iot_devel:1.0
cd esp_wifi_repeater
make
make flash

Para compilar la versión L2 WiFi Repeater, simplemente usa la opción VARIANT=bridge para el comando make:``` git clone https://github.com/martin-ger/esp_wifi_repeater.git docker run -it --rm --device=/dev/ttyUSB0 -v $(pwd)/esp_wifi_repeater:/home/esp/esp_wifi_repeater martinfger/iot_devel:1.0 cd esp_wifi_repeater make VARIANT=bridge make flash

root@kitploit:~
Para configurar el entorno de compilación desde cero y compilar este binario, descarga e instala el esp-open-sdk (sugiero esta versión con la base NONOS SDK 2.2: https://github.com/xxxajk/esp-open-sdk). Asegúrate de poder compilar y descargar el ejemplo "blinky" incluido.

Luego descarga este árbol de código fuente en un directorio separado y ajusta la variable BUILD_AREA en el Makefile y las opciones deseadas en user/user_config.h. Los cambios de la configuración predeterminada se pueden realizar en user/config_flash.c. Compila el firmware esp_wifi_repeater con "make". "make flash" lo graba en un esp8266.

El árbol de código fuente incluye una versión binaria de liblwip_open más las inclusiones adicionales necesarias de mi fork de esp-open-lwip y un binario de la herramienta rboot. *No se requiere ninguna acción de instalación adicional para eso.* Solo si no quieres usar la biblioteca precompilada, revisa las fuentes desde https://github.com/martin-ger/esp-open-lwip . Úsala para reemplazar el directorio "esp-open-lwip" en el árbol de esp-open-sdk. Ejecuta "make clean" en el directorio esp_open_lwip y nuevamente un "make" en el directorio superior esp_open_sdk. Esto compilará un liblwip_open.a que contiene las características NAT. Reemplaza liblwip_open_napt.a con ese binario. También puedes compilar el binario "rboot.bin" desde https://github.com/raburton/rboot y reemplazarlo en el directorio raíz del proyecto.

*Actualización*: si lees en algún lugar de la web instrucciones de instalación que usan "0x10000.bin" - debido a OTA esto se ha cambiado a "0x02000.bin" ahora.

Si quieres usar los binarios de firmware precompilados completos, puedes grabarlos con "esptool.py --port /dev/ttyUSB0 write_flash -fs 4MB -ff 80m -fm dio 0x00000 firmware/0x00000.bin 0x02000 firmware/0x02000.bin" (usa -fs 1MB para un ESP-01). Para el esp8285 debes usar -fs 1MB y -fm dout.

En Windows puedes grabarlo usando la "ESP8266 Download Tool" disponible en https://espressif.com/en/support/download/other-tools. Descarga los dos archivos 0x00000.bin y 0x02000.bin del directorio de firmware. Para un ESP12 genérico, un NodeMCU o un Wemos D1 usa la siguiente configuración (para un ESP-01 cambia FLASH SIZE a "8Mbit"):

<img src="https://raw.githubusercontent.com/martin-ger/esp_wifi_repeater/master/FlashRepeaterWindows.jpg">

Si el modo "QIO" falla en tu dispositivo, prueba "DIO" en su lugar. También echa un vistazo a la "Detected Info" para comprobar el tamaño y el modo del chip de flash. Si tu firmware descargado aún no se inicia correctamente, verifica con las sumas de verificación incluidas si los archivos binarios están posiblemente corruptos. Si dudas de que los binarios del firmware estén corruptos, descarga el repositorio completo como zip y extrae los binarios de ese zip; esto evita problemas de descarga HTTP (por ejemplo, conversiones CR-LF).

# Soporte de actualización OTA (Over the air)

Basado en el uso de la librería rboot: https://github.com/raburton/rboot y gracias a la contribución de christianchristensen.

El proceso de compilación crea dos copias del binario esp_wifi_repeater en el directorio de firmware: 0x02000.bin y 0x82000.bin. Para una instalación inicial es suficiente grabar solo 0x00000.bin (el cargador de arranque rboot) y 0x02000.bin (una copia del programa). El esp_wifi_repeater funcionará.

Si tienes al menos 1MB de flash, puedes hacer una actualización OTA (Over the air) con otra versión. Es decir, puedes cargar interactivamente un nuevo binario desde la CLI y cambiar a él. El otro binario se carga en la ubicación de memoria actualmente no activa (ya sea 0x02000 (rom0) o 0x82000 (rom1)) y se inicia si tiene éxito. También puedes cambiar interactivamente entre dos binarios instalados. La configuración actual se usará para ambos binarios (siempre que su formato no haya cambiado).

Puedes controlar las funciones OTA con los siguientes comandos:
- show ota: muestra el binario actualmente activo y la URL de la próxima actualización
- set ota_host _hostname_: define el nombre de host o la dirección IP del servidor OTA (predeterminado: "none")
- set ota_port _portno_: define el número de puerto del servidor OTA (predeterminado: 80)
- ota update: intenta descargar un nuevo binario (0x02000.bin o 0x82000.bin) a través de HTTP desde ota_host:ota_port y lo inicia
- ota switch: cambia al otro binario (si está instalado)

Para probar la función OTA, configura tu ESP (como STA o AP) para que esté conectado a la red con el servidor de actualización. Allí inicia un servidor web simple en el directorio de firmware, por ejemplo;```
cd firmware
python -m SimpleHTTPServer 8080

Establezca el parámetro hostname al nombre de host o IP de su computadora, establezca portno en 8080 y "save". Luego escriba en la CLI:``` ota update

root@kitploit:~
Si está configurado correctamente, la actualización se iniciará y el ESP se reiniciará con el nuevo binario.

# Problemas conocidos
- Debido a las limitaciones de la implementación de SoftAP del ESP, hay un máximo de 8 estaciones conectadas simultáneamente.
- El ESP8266 requiere una fuente de alimentación buena, ya que produce picos de corriente de hasta 170 mA durante la transmisión (el consumo medio típico es de alrededor de 70 mA cuando el WiFi está activado). Compruebe primero la fuente de alimentación si su ESP funciona de forma inestable y se reinicia de vez en cuando. Un condensador grande entre Vdd y Gnd puede ayudar si experimenta problemas aquí.

# Licencias
El software es de código abierto. Los archivos fuente de terceros tienen su propia cabecera de licencia. Para todos los demás archivos se aplica la licencia MIT.
Descargar herramienta