Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
esp_wifi_repeater — 一个功能完整的 WiFi NAT 路由器(现在还兼作 WiFi 中继器) | Kitploit
工具/GitHubGitHub/martin-ger/esp_wifi_repeater
嵌入式系统安全数据包嗅探与分析Wi-Fi审计物联网安全网络安全无线安全硬件与物联网安全DNS 分析
GitHubmartin-ger/esp_wifi_repeater

esp_wifi_repeater

一个功能完整的 WiFi NAT 路由器(现在还兼作 WiFi 中继器)

查看仓库
5.2k9812个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

esp_wifi_repeater

一个功能完整的 WiFi NAT 路由器(现在也成为了 WiFi 中继器,即 L2 桥接)

2026 年新特性: 在首次发布 10 年后,它终于成为了它一直想要成为的东西:一个真正的 WiFi 中继器。为了不破坏现有的文档和链接,标准版仍然保留众所周知的 NAT 路由器版本,并包含所有高级功能。但如果你感兴趣的是一个精简的真正 L2 桥接,请看下面的 ESP8266 WiFi Repeater - L2 bridge 章节。

这是在 esp8266 和 esp8285 上实现的 WiFi NAT 路由器。它还包含对带有 ACL 的包过滤防火墙、端口映射、流量整形、远程监控(或数据包嗅探)钩子、MQTT 管理接口、简单 GPIO 交互以及电源管理的支持。为了在 mesh 中使用多个路由器覆盖更大区域,还加入了一种新模式 "Automesh"。

如果你正在寻找将 NAT 功能集成到 Arduino 项目中的方法 - 请参见 此处 。

EPS32 NAT Router 是针对 ESP32 的高级项目。

典型使用场景包括:

  • 用于现有 WiFi 网络的简单范围扩展器
  • 电池供电的户外(mesh)网络
  • 为访客设置具有不同 SSID/密码的附加 WiFi 网络
  • 为物联网设备设置安全且受限的网络
  • 将 WPA2 Enterprise 网络转换为 WPA-PSK
  • 用于 WiFi 流量分析的监控探针
  • 使用路由、ACL 和流量整形进行网络实验
  • 具有基本 I/O 能力和 MQTT 控制的 mesh 物联网设备

默认情况下,ESP 同时作为 STA 和 soft-AP,并透明地转发经过它的所有 IP 流量。由于它使用 NAT,网络侧和连接的站点都无需路由条目。站点默认通过 DHCP 在 192.168.4.0/24 网段中配置,并从现有 WiFi 网络获取 DNS 应答服务器地址。

测量结果表明,它在两个方向上都能达到约 5 Mbps 的吞吐量,因此即使是流媒体播放也是可行的。

一些细节在这个 视频 中有所说明。

Web 安装器

如需直接刷写到设备上,请使用 Web 安装器。

首次启动

esp_wifi_repeater 启动时采用以下默认配置:

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

首次启动(或出厂重置)后,它将提供一个开放 AP、SSID 为 "MyAP" 的 WiFi 网络。它暂时不会尝试自动重新连接上行 AP(因为它还不知道有效的 ssid 或密码)。

连接到这个 WiFi 网络,然后通过简单的 Web 界面进行基本配置,或通过控制台进行包含所有选项的完整配置。

基础 Web 配置界面

Web 界面允许配置基本转发功能所需的全部参数。感谢 rubfi 在此方面的主要工作:https://github.com/rubfi/esp_wifi_repeater/。将浏览器指向 "http://192.168.4.1"。应出现此页面:

首先为上行 WiFi 网络("STA Settings")输入合适的值。对于开放网络,使用密码 "none"。当且仅当你确实想使用 automesh 模式时,勾选 "Automesh" 复选框。点击 "Connect"。ESP 重新启动并将连接到你的 WiFi 路由器。几秒钟后状态 LED 应开始闪烁。

如果你选择了 automesh,配置就完成了。无需配置 "Soft AP Settings",因为在 automesh 模式下这些设置与 "STA Settings" 相同。所有已连接的 ESP 中继器将提供相同的 ssid。

如果你不使用 automesh,现在可以重新加载页面并更改 "Soft AP Settings"。点击 "Set",ESP 将再次重新启动。现在它已就绪,可以通过新配置的 Soft AP 转发流量。请注意,这些更改也会影响配置界面,即要进行进一步配置,请通过新配置的 WiFi 网络之一连接到 ESP。如果要通过 Soft AP 访问,请记住 Soft AP 网络的地址(如果你更改了它)(ESP 在此网络中始终具有地址 x.x.x.1)。

如果你愿意,可以勾选 "lock" 复选框并点击 "Lock"。此后,除非先用上行 WiFi 网络的密码解锁,否则无法再更改配置(即使网络是开放的,也要定义一个密码)。

如果要在 Web 界面中输入非 ASCII 或特殊字符,必须使用 HTTP 风格的十六进制编码,例如 "My%20AccessPoint"。这将得到字符串 "My AccessPoint"。使用这种十六进制编码,你可以输入任何字节值,但 0 除外(由于 C 内部原因)。

如果出现失误且与 ESP 失去了所有联系,你仍可以使用串行控制台来恢复它("reset factory",见下文)。

命令行界面

高级配置必须通过控制台界面上的命令行完成。此控制台可通过串行端口(115200 波特)或 TCP 端口 7777 访问(例如,从已连接的 STA 执行 "telnet 192.168.4.1 7777")。

使用以下命令进行初始设置:

  • set ssid your_home_router's_SSID
  • set password your_home_router's_password
  • set ap_ssid ESP's_ssid
  • set ap_password ESP's_password
  • show (to check the parameters)
  • save
  • reset

同样,如果要输入非 ASCII 或特殊字符,可以使用 HTTP 风格的十六进制编码(例如 "My%20AccessPoint"),或者仅在 CLI 上使用带反斜杠的 C 风格引号作为快捷方式(例如 "My\ AccessPoint")。两种方法都会得到字符串 "My AccessPoint"。

命令行还支持更多命令:

基本命令

足以让它在几乎所有环境中正常工作。

  • help: 打印一条简短的帮助信息
  • set [ssid|password] value: 更改上行 AP 的设置(你家路由器的 WiFi 配置),对于开放网络使用密码 "none"。
  • set [ap_ssid|ap_password] value: 更改 ESP 的 soft-AP 设置(供你的站点使用)
  • show [config|stats]: 打印当前配置或一些状态信息和统计信息
  • save [dhcp]: 将当前配置参数、ACL 和路由条目 [+ 当前 DHCP 租约] 保存到闪存
  • lock [password]: 保存并锁定当前配置,不允许更改。如果之前已设置密码,则可以留空(默认是上行 WiFi 的密码)
  • unlock password: 解锁配置,需要 lock 命令中的密码
  • reset [factory]: 重置 esp,'factory' 可选择将 WiFi 参数重置为默认值(对于已锁定的设备,只能从串行控制台操作)
  • quit: 终止远程会话

高级命令

大多数 set 命令只有在 save 和 reset 之后才会生效。

命令行输入中单个 "#" 之后直到行尾的任何部分都将被视为注释并被忽略。

Automesh 配置

  • set automesh [0|1]: 选择 automesh 模式是开启还是关闭(默认),详情请参见 https://github.com/martin-ger/esp_wifi_repeater#automesh-mode
  • set am_threshold dB: 设置“差”连接的阈值(以负 dB 为单位,默认 85,即 -85 dB)
  • set am_scan_time secs: 设置 ESP 在 automesh 模式下尝试查找上行 AP 后进入休眠前的时间间隔(秒)(0 为禁用,默认)
  • set am_sleep_time secs: 设置 ESP 在 automesh 模式下找不到上行 AP 时休眠的时间间隔(秒)(0 为禁用,默认)

WiFi 配置

  • set ap_on [0|1]: 选择 soft-AP 是禁用(ap_on=0)还是启用(ap_on=1,默认)
  • set ap_open [0|1]: 选择 soft-AP 是使用 WPA2-PSK 安全(ap_open=0,如果设置了 ap_password 则自动)还是开放(ap_open=1)
  • set auto_connect [0|1]: 选择 STA 是否应持续重试重新连接 AP。首次刷写后或执行 "reset factory" 后,auto_connect 处于关闭状态(0)。当你输入新的 SSID 时,它将自动设为开启(1)。
  • set ssid_hidden [0|1]: 选择 soft-AP 的 SSID 是隐藏(ssid_hidden=1)还是可见(ssid_hidden=0,默认)
  • set phy_mode [1|2|3]: 设置 WiFi 的 PHY_MODE(1=b,2=g,3=n(默认))
  • set country CC: 将 WiFi 监管国家代码设置为 2 字母 ISO 3166-1 代码(例如 "US"、"DE"、"CN"、"JP")。非美国代码会解锁频道 12 和 13。留空(默认)则保持 SDK 默认值不变。该设置会保存到闪存,并在每次启动时重新应用。
  • set bssid xx:xx:xx:xx:xx:xx: 设置要连接的上行 AP 的特定 BSSID(默认 00:00:00:00:00:00,表示任意)
  • set [ap_mac|sta_mac] xx:xx:xx:xx:xx:xx: 将 STA 和 SOFTAP 的 MAC 地址设置为用户定义的值(MAC 地址首字节的第 0 位不能为 1)
  • set sta_mac random: 每次重启后设置一个新的随机 STA MAC
  • set sta_hostname name: 设置 STA 的名称(对上行 AP 可见)
  • set max_clients [1-8]: 设置可以连接到 SoftAP 的 STA 数量(ESP 的 SoftAP 实现限制为 8,默认)
  • scan: 扫描 AP
  • connect: 尝试使用当前配置的 ssid 和 password 连接到 AP
  • disconnect: 断开与任何上行 AP 的连接

WPA2 Enterprise 配置

  • set use_peap[0|1]: 选择 STA 应通过简单的 WPA-PSK(use_peap=0,默认)还是 WPA2 Enterprise(PEAP)连接
  • set peap_identity value: 设置 PEAP “外部”身份(首先呈现给 RADIUS 服务器的字符串,可能是 [email protected])
  • peap_username value: 设置 PEAP 用户名
  • peap_password value: 设置 PEAP 密码

TCP/IP 配置

  • set network ip-addr: 设置内部网络的 IP 地址,网络始终为 /24,路由器始终为 x.x.x.1
  • set dns dns-addr: 设置通过 DHCP 分发给客户端的静态 DNS 地址
  • set dns dhcp: 配置使用来自 DHCP 的动态 DNS 地址,默认
  • set ip ip-addr: 为 STA 接口设置静态 IP 地址
  • set ip dhcp: 为 STA 接口配置动态 IP 地址,默认
  • set netmask netmask: 为 STA 接口设置静态子网掩码
  • set gw gw-addr: 为 STA 接口设置静态网关地址
  • set max_nat no_of_entries: 设置 NAPT 表的大小(默认 512)
  • set max_portmap no_of_entries: 设置端口映射表的大小(默认 32)
  • set tcp_timeout secs: 设置 TCP 连接的 NAPT 超时(0=默认(1800 秒))
  • set udp_timeout secs: 设置 UDP 连接的 NAPT 超时(0=默认(2 秒))
  • set lease min: 设置内部网络 DHCP 服务器的租约时间(分钟)(默认 120)
  • show dhcp: 打印 dhcp 租约表的当前状态

路由

  • show route: 显示当前路由表
  • route clear: 清除所有静态路由
  • route add network gw: 通过网关 gw 向网络添加静态路由(网络以 CIDR 表示法('x.x.x.x/n')给出)
  • route delete network: 删除到某个网络的静态路由
  • interface inX [up|down]: 将接口状态设置为 up 或 down(不通过 down 接口进行 IP 路由/流量转发,默认:up)
  • set nat [0|1]: 选择 soft-AP 接口是否进行 NAT(nat=1,默认)或不进行(nat=0)。没有 NAT,来自内部 STA 的流量透明转发将无法工作!主要与静态路由结合使用。
  • portmap add [TCP|UDP] external_port internal_ip internal_port: 添加端口转发
  • portmap remove [TCP|UDP] external_port: 删除端口转发
  • nslookup name: 对给定名称执行 DNS 查找并显示结果
  • ping host: 通过 ICMP 回显请求/回复检查 IP 连通性(主机为 IP 地址或 DNS 名称)

防火墙/监控配置

  • 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]: 向 ACL 添加新规则
  • acl [from_sta|to_sta|from_ap|to_ap] clear: 清除整个 ACL
  • show acl: 显示已定义的 ACL 和一些统计信息
  • set acl_debug [0|1]: 打开/关闭 ACL 调试输出 - 所有被拒绝的数据包将记录到终端
  • set [upstream_kbps|downstream_kbps] bitrate: 设置最大上行/下行比特率(0 = 无限制,默认)
  • set daily_limit limit_in_KB: 定义 STA 每天可以传输的最大千字节数(0 = 无限制,默认)
  • set timezone hours_offset: 定义本地时区(用于知道一天在 00:00 结束的时间)
  • monitor [on|off|acl] port: 在给定端口上启动和停止监控服务器

用户界面配置

  • set config_port portno: 设置控制台登录的端口号(默认 7777,0 禁用远程控制台配置)
  • set web_port portno: 设置 Web 配置服务器的端口号(默认 80,0 禁用 Web 配置)
  • set config_access mode: 控制允许控制台和 Web 进行配置访问的网络(0:不允许访问,1:仅内部,2:仅外部,3:两者(默认))

GPIO 配置

  • show gpio: 显示 gpio 配置
  • gpio [0-16] mode [in|in_pullup|out]: 配置 ESP 的 GPIO 端口(保存到闪存)
  • gpio [0-16] set [high|low]: 向输出端口写入
  • gpio [0-16] set [high|low] for seconds: 向输出端口写入并在一定时间后恢复
  • gpio [0-16] get: 从输入端口读取
  • gpio [0-16] trigger [0-16] [monostable_NO|monostable_NC|bistable_NO|bistable_NC]: 将输入端口连接到输出端口,可以是单稳态常开(状态变为低电平时触发按钮)、单稳态常闭(状态变为高电平时触发按钮)、双稳态常开(复制输入的开关)或双稳态常闭(状态与输入相反的开关)
  • gpio [0-16] trigger none: 清除该链接

芯片配置

  • set speed [80|160]: 设置 CPU 时钟频率(默认 160 MHz)
  • sleep seconds: 让 ESP 进入深度睡眠指定的秒数。有效值在 1 到 4294 之间(约 71 分钟)
  • set status_led GPIOno: 为状态 LED 选择一个 GPIO 引脚(默认 2,>16 禁用)
  • set hw_reset GPIOno: 为硬件出厂重置选择一个 GPIO 引脚(>16 禁用,默认)
  • set ap_watchdog secs: 设置 AP 看门狗超时 - 如果在 secs 时间内没有从上行 AP 收到数据包,中继器将重置("none" = 无超时,默认)
  • set client_watchdog secs: 设置客户端看门狗超时 - 如果在 secs 时间内没有从任何已连接客户端收到数据包,中继器将重置("none" = 无超时,默认)
  • set vmin voltage: 设置最小电池电压(mV)。如果 Vdd 低于该值,ESP 将进入深度睡眠。如果为 0,则不执行任何操作
  • set vmin_sleep secs: 设置 ESP 在低电压时休眠的时间间隔(秒)

状态 LED

在默认配置中,GPIO2 被配置为驱动状态 LED(连接到 GND),其指示如下:

  • 持续亮起:已启动,但未成功连接到 AP(没有有效的外部 IP)
  • 闪烁(每秒 1 次):工作中,已连接到 AP
  • 不定期闪烁:工作中,内部网络有流量

使用 "set status_led GPIOno" 可以更改 GPIO 引脚(任何大于 16 的值,例如 "set status_led 255" 将完全禁用状态 LED)。当配置为 GPIO1 时,它将与 ESP-01 开发板上的内置蓝色 LED 配合工作。但是,由于 GPIO1 同时也是 UART-TX 引脚,这意味着串行控制台将无法工作。配置此时仅限于网络访问。

硬件出厂重置

如果你将所选 GPIO 拉低超过 3 秒,中继器将执行出厂重置并使用默认配置重新启动。使用 "set hw_reset GPIOno" 可以更改 GPIO 引脚(任何大于 16 的值,例如 "set hw_reset 255" 将禁用硬件出厂重置功能)。

对于许多模块,包括 ESP-01s 和 NodeMCU,使用 GPIO 0 可能是个好主意,因为它反正也要用到。但是,它不是默认引脚,因为它在刷写期间可能会干扰拉低操作。因此,如果你想使用 GPIO 0 上现有的按钮进行硬件出厂重置,请在刷写后使用 "set hw_reset 0" 和 "save" 进行配置。由 HW 引脚触发的出厂重置不会重置已配置的 hw_reset GPIO 编号(控制台中的 "reset factory" 可以做到)。

端口映射

为了允许外部网络的客户端连接到内部网络上的服务器端口,必须映射端口。外部端口映射到特定内部 IP 地址的内部端口。请使用 "portmap add" 命令进行映射。可以使用 "show" 命令列出端口映射,并随当前配置一起保存。

然而,为了确保预期的设备在特定 IP 地址上监听,必须确保该设备在自身或 ESP 重新启动后仍具有相同的 IP 地址。要实现这一点,可以在设备中配置固定 IP 地址,或者让 ESP 记住其 DHCP 租约。这可以通过 "save dhcp" 命令实现。它会保存当前状态和所有 DHCP 租约,以便在重新启动后恢复。可以使用 "show stats" 命令列出 DHCP 租约。

WPA2 Enterprise (PEAP)

WPA2 Enterprise (PEAP) 支持现已包含在项目中。它提供了一个“转换器”,可将使用 PEAP 认证的 WPA2 Enterprise 网络转换为 WPA2-PSK 网络。这解决了一个常见问题,尤其是在大学环境中:本地 WiFi 网络是使用 PEAP-MSCHAPv2 认证的 WPA2 Enterprise 网络。一个非常典型的例子是许多世界各地的大学都可用的 "eduroam" 网络。问题是许多 IoT 设备无法处理 WPA2 Enterprise 认证,因此开发和演示都很困难。非常有帮助的是一个“转换器”,它登录 WPA2 Enterprise 网络,并向其客户端提供更简单的 WPA-PSK 网络。

要使用它,请设置以下配置参数:ssid、use_peap、peap_identity、peap_username 和 peap_password(你不需要通常的 password 参数)。此配置必须通过 CLI 完成(并保存),在 Web 界面中不可用。

该代码目前不检查 RADIUS 服务器的证书。如果有人设置了恶意 AP 和 RADIUS 服务器,它容易受到 MITM 攻击。虽然密码不是以明文发送的,但所使用的 MSCHAPv2 已知已被破解。另外,请注意 ESP8266 现在包含你的企业网络密码。它转发的所有流量现在都可能被网络管理员关联到你的账户。不要滥用它,也不要将其提供给不可信的其他人,例如通过配置开放网络。即使设备已锁定,你的企业网络密码也可以通过串行端口从 ESP 的闪存中以明文提取。

Automesh Mode

有时你可能想连续使用多个 esp_wifi_repeater 或组成 mesh 网络,以覆盖更大的距离或面积。一般来说,使用 NAT 路由器可以毫无问题地做到这一点,实际上你会有多层 NAT。但这意味着连通性受限:所有节点都可以访问互联网,但节点之间通常没有直接的 IP 连接。当然,需要的跳数越多,可用带宽就越低。但用户报告说,即使是 5 个 esp_wifi_repeater 串联也能很好地工作。

在这种设置中,配置是一项相当耗时且容易出错的工作。为了简化这一点,esp_wifi_repeater 现在提供了一种新模式:"Automesh"。只需配置 SSID 和密码,然后打开 "automesh"。(在 CLI 上使用 "set automesh 1",或在 Web 界面上只需勾选复选框)。它将执行以下操作:每个以这种方式配置的 esp_wifi_repeater 都会在其 AP 上自动提供一个 WiFi 网络,其 SSID/密码与其所连接的网络相同。客户端可以使用与原始网络或中继网络相同的 WiFi 设置。每个配置了 "automesh" 的 esp_wifi_repeater 都会首先搜索要连接的最佳其他 AP。该 AP 是离原始 WiFi 网络最近且信号强度(RSSI)最好的那一个。

信号强度很容易通过扫描来测量,但当你看到多个具有相同 SSID 的 AP 时,哪一个才是离原始 WiFi 网络最近的呢?因此,该协议使用了一个有点取巧的手段:处于 "automesh" 模式的 esp_wifi_repeater 会修改它们的 BSSID(实际上,根据 IEEE 802.11 标准,由于它是一个 AP,这应该被称为 "ESSID",但 SDK 将其称为 "BSSID"),也就是它们 AP 接口的 MAC 地址,该地址会随每个信标帧发送,每秒大约 10 次。它使用的格式为:24:24:mm:rr:rr:rr。其中 "24:24" 只是中继器的唯一标识符(它极低概率会与真实 AP 的 MAC 地址冲突,但我们可以忽略这一点,因为如果确实需要,我们可以更改该前缀)。"mm" 表示 "mesh level"(网格层级),即到原始 WiFi 网络的跳数距离。最后三个 "rr:rr:rr" 只是用于区分各个 ESP 的随机数。原始 AP 保留其 BSSID,即没有 "24:24" 前缀的 AP 被识别为根节点,称为 mesh level 0(网格层级 0)。

现在,每个 esp_wifi_repeater 都可以得知哪个其他 esp_wifi_repeater 离原始 WiFi 网络最近,可以连接到该设备,并相应地选择自己的 BSSID。内部网络的 IP 地址也会根据网格层级进行调整:10.24.m.0。这将构建一棵以原始 WiFi AP 为根、中继节点分布在多个网格层级上的树(一种非常特殊的网格;实际上,它的工作方式与链路层的生成树协议(STP)或网络层使用距离矢量协议的路由有些相似)。一旦检测到上行链路丢失,就会重新开始配置。这应该可以避免环路,因为在(重新)配置期间也不会发送带 BSSID 的信标帧。

为方便起见,esp_wifi_repeater 在完成 "automesh" 配置后,首先会尝试检查它是否能够连接到上行 AP。如果失败,即使找到了具有正确 SSID 的 AP,它也会假定用户输入了错误的密码,并重置为出厂默认设置。一旦它成功连接过一次,它就会假定配置是正确的,并在连接丢失或重置后持续尝试,无论需要多长时间(以避免因配置错误的 AP 而遭受 DOS 攻击)。

Automesh 调优

如果范围内有多个 ESP,则在较短的“差”路径和较长的“好”路径(就链路质量而言的好与差)之间可能存在权衡。参数 am_threshold 决定了什么算是差连接:如果扫描中的 RSSI 低于此阈值,则连接为差,并且会优先选择多一跳的路径。也就是说,假设 am_threshold 为 85,扫描中检测到两个 automesh 节点:A 的层级为 1,RSSI 为 -88 dB;B 的层级为 2,RSSI 为 -60 dB。那么到 A 的链路被认为太差(-88 dB < -am_threshold),因此优先选择 B。新节点将成为层级 3 的节点,通过 B 上行。am_threshold 以正值给出,但表示负的 dB 值。值越小越好。

如果你想更深入地了解 automesh 网络的拓扑结构,可以考虑将所有节点连接到 MQTT 代理,并让它们发布 “Topology”(拓扑)主题(见下文)。如果你现在订阅 "/WiFi/+/system/Topology",你将获得重建完整图所需的所有节点和链路信息,包括(已连接 ESP 的)RSSI,从而检测网格中的薄弱链路。TopologyInfo 主题包含以下 JSON 结构,可用于重建 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:~
使用两个参数 _am_scan_time_ 和 _am_sleep_time_,可以在 automesh 模式下实现电源管理,前提是你已将 GPIO16 连接到 RST。启动后,esp_wifi_repeater 会扫描可用的上行 AP 达 _am_scan_time_ 秒。如果没有找到任何 AP,它将进入深度睡眠 _am_sleep_time_ 秒,并在重启后重试(默认值为 0 = 两个参数均禁用)。

# 监控
可以从控制台启动监控服务("monitor on [portno]")。该服务将以 pcap 格式将内部网络的流量镜像到 TCP 流。例如,在外部网络中的一台计算机上执行 "netcat [external_ip_of_the_repeater] [portno] | sudo wireshark -k -S -i -",即可实时观察内部网络中的流量。例如,可以用它来观察你的内部客户端正在与哪些互联网站点通信。请注意,这至少会使 esp 和 WiFi 网络的负载加倍。在高负载下,可能会导致某些数据包在监控会话中被截断甚至丢弃。注意:保持此端口开放是一个潜在的安全问题。本地网络中的任何人都可以连接并观察你的流量。

# 防火墙
ESP 路由器内置了一个基础防火墙。可以将 ACL(访问控制列表)应用于 SoftAP 接口。当路由器用于将其他 IoT 设备接入互联网时,这是 IoT 安全的一个基石。它可以用于防止第三方 IoT 设备“呼叫总部”、被滥用为恶意软件僵尸网络,并保护你的家庭网络中的 PC、平板电脑和手机不被家庭自动化设备看到。

四个 ACL 列表分别命名为 "from_sta"、"to_sta"、"from_ap" 和 "to_ap",用于两个接口上的传入和传出数据包("sta" 表示连接到已连接客户端的接口,"ap" 表示连接到上行 AP 的接口)。ACL 采用“CISCO IOS 风格”定义。

以下示例对访客子网很有用。它允许访问互联网,但不允许访问任何其他本地地址(请将 xx.xx.xx.xx 地址替换为你自己的本地网络范围)。该规则集允许出站本地广播(用于 DHCP)和 UDP 53(DNS),任何发往上游路由器子网的其他数据包都将被阻止,所有其他数据包都可以通过并访问互联网:```
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

下一个示例限制性更强,当您计划在 ESP 的 AP 处设置一个访问受限的 IoT 子网时非常有用。它还将允许出站本地广播(用于 DHCP)、UDP 53(DNS)以及到本地代理的 TCP 1883(MQTT),但任何其他数据包都将被阻止,包括任意互联网访问(您可以根据需要调整第四条语句以启用其他主机):``` 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:~
“to_sta” 方向的 ACL 也可以定义,但通常不需要,因为反向方向通过 NAT 转换已经能很好地防止未经请求的流量。

ACL 由针对每个数据包处理的过滤规则组成。每条规则包含一个协议(IP、TCP 或 UDP)、源地址/端口、目的地址/端口,以及一个动作 "allow" 或 "deny"。对于纯 IP 规则,没有端口,只给出地址。IP 规则包含 TCP 和 UDP 数据包。地址可以用 "/" 记法给出子网地址,例如 192.168.178.0/24。也可以使用 "any" 作为通配符,它匹配任何地址或端口号。规则通过 "acl" 命令定义:

- 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]

规则按其在列表中的出现顺序自上而下处理。匹配数据包的第一条规则将被应用,并决定数据包是允许(并被转发)还是拒绝(并被丢弃)。这意味着,特殊情况在前,通用规则在后。如果 ACL 中有规则,则所有不匹配任何规则的数据包默认都会被拒绝。因此,上面示例中的最后一条规则 "from_sta IP any any deny" 并不是必需的,因为无论如何它都是默认行为。如果 ACL 为空,则允许所有数据包。

ACL 规则的定义同样自上而下:新规则总是添加到列表末尾。要更改 ACL,必须首先将其完全清除(acl from_sta clear),然后重新构建。ACL 随配置一起保存。 "show acl" 会打印出 ACL 以及每条规则的命中次数统计和允许/拒绝数据包的总数。

使用命令 "set acl_debug 1" 可以将所有被拒绝的数据包摘要打印到控制台。此外,MQTT 主题也可以发布此摘要。这可用于防火墙配置,以确定启用已连接设备所需的规则。同时,如果出现意外流量(并被拒绝),它也能提供提示。

为了进行更深入的分析,可以使用监控服务(即使是被拒绝的数据包也会在丢弃之前报告给监控器)。当使用 "monitor acl _port_" 命令启动监控器时,ACL 可以作为在线过滤器使用。所有定义为 
"allow_monitor"(而不是 "allow")和 "deny_monitor"(而不是 "deny")的规则都会像往常一样被处理,结果是允许转发数据包,但同时也会将数据包发送给监控器。因此,基本上 "allow" 或 "allow_monitor" 所有数据包的规则列表仍然有意义,因为它可以在捕获时预先选择应记录哪些数据包。例如,一个列表:```
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

will allow all packets and also select all packets for monitoring that go from a station to the 192.168.0.0/16 (本地)子网 and from the 192.168.0.0/16 to a station. 当然,这种过滤器也可以在捕获完成后应用于完整的监控跟踪记录,但如果你已经知道自己要找什么,这些在线过滤器将大幅减少监控开销。它还可以用于调试所有拒绝防火墙规则,只需使用 "deny_monitor" 代替 "deny" 即可。

静态路由

默认情况下,AP 接口已启用 NAT,因此任何连接到 AP 的节点都能通过 ESP 的 STA 接口透明地访问外部世界。因此,如果你不是真正的网络极客,就无需进一步操作。

对于那些真正对进一步网络配置感兴趣的人:ESP 的 lwip IPv4 栈已针对此项目进行了增强,支持静态路由:"show route" 命令显示包含所有已知路由的路由表,包括到所连接网络接口(AP 和 STA 接口)的链路。这两个接口之间的路由无需进一步配置即可工作。可以通过 "route add network gateway" 命令添加通往其他网络的路由,该命令在 Linux 主机或路由器上很常见。"save" 命令将路由表的当前状态写入闪存配置。

这里有一个简单示例,展示了利用静态路由可以实现什么。假设有以下网络设置:两个 ESP 通过 STA 接口连接到一个中央家庭路由器:``` | 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:~
每个 ESP 在其 AP 后面都有一个第二网络,其网络地址不同:10.0.1.0/24 和 10.0.2.0/24。ESP1 可以 ping 通 ESP2 的 192.168.1.20,但无法 ping 通 10.0.2.1,因为它不知道可以通过 192.168.1.20 到达该地址。如果添加两条静态路由,这种情况就会改变。在 ESP1 上:```
route add 10.0.2.0/24 192.168.1.20

以及在 ESP2 上:``` route add 10.0.1.0/24 192.168.1.10

root@kitploit:~
现在,在ESP1上执行 "ping 10.0.2.1" 将会成功。它被发送到192.168.1.20,然后由ESP2应答。

现在,每个网络中都有一个额外的客户端接入(地址为10.0.1.2和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 |

现在,即使是本地地址为 10.0.1.2 的客户端 STA1 也可以 ping 通 10.0.2.2 的 STA2,因为它先将请求发送到其默认路由器 ESP1,而 ESP1 知道所有发往 10.0.2.0/24 地址的数据包都必须转发到 192.168.1.20。在那里,ESP2 知道如何将其发送到 STA2。反向的回复也是同样的情况。

这使您可以配置 ESP 的多星型拓扑,其中每个 ESP 及其 STA 客户端都可以直接相互访问(无需任何端口映射)。所需路由的配置可能有些繁琐——但这是一个很好的网络练习。下一步将是在 ESP 上移植动态路由协议(如 RIP)……

比特率限制

通过将 upstream_kbps 和 downstream_kbps 设置为 0 以外的值(0 是默认值),您可以限制 ESP AP 的最大比特率。该值是一个适用于所有已连接客户端流量的限制。超过所定义比特率的数据包将被丢弃。流量整形器使用“令牌桶”算法,桶大小目前为每秒比特率的四倍,允许在之前没有流量时产生突发。

MQTT 支持

从 1.3 版本开始,路由器内置了 MQTT 客户端(感谢 Tuan PM 贡献了他的库 https://github.com/tuanpmt/esp_mqtt)。这有助于将路由器/中继器集成到物联网中。例如,家庭自动化系统可以根据当前关联站点的信息做出决策,可以打开或关闭中继器(例如基于时间计划),或者可以简单地用于监控负载。路由器既可以连接到本地 MQTT 代理,也可以连接到云中公开可用的代理。但目前它不支持 TLS 加密。

默认情况下,MQTT 客户端处于禁用状态。可以通过将配置参数 "mqtt_host" 设置为不同于 "none" 的主机名来启用它。要配置 MQTT,您可以设置以下参数:

  • set mqtt_host IP_or_hostname: MQTT 代理的 IP 或主机名("none" 禁用 MQTT 客户端)
  • set mqtt_port port: 用于连接的 MQTT 代理端口(默认:1883)
  • set mqtt_qos QoS: 用于发布和订阅的 MQTT QoS 值(0-2,默认:0)
  • set mqtt_user username: 用于认证的用户名(如果代理不需要认证,则为 "none")
  • set mqtt_password password: 用于认证的密码
  • set mqtt_id clientId: 客户端在代理上的 Id(默认:"ESPRouter_xxxxxx",由 MAC 地址派生)
  • set mqtt_prefix prefix_path: 所有已发布主题的前缀(默认:"/WiFi/ESPRouter_xxxxxx/system",同样由 MAC 地址派生)
  • set mqtt_command_topic command_topic: 订阅用于接收命令的主题,与从控制台发出的命令相同。(默认:"/WiFi/ESPRouter_xxxxxx/command","none" 禁用通过 MQTT 接收命令)
  • set mqtt_interval secs: 设置路由器发布状态主题的间隔(默认:15s,0 禁用状态发布)
  • set mqtt_mask mask_in_hex: 选择发布哪些主题(默认:"ffff" 表示全部)

可以使用 "show mqtt" 命令显示 MQTT 参数。

路由器可以定期(每 mqtt_interval)发布以下状态主题:

  • prefix_path/Uptime: 自上次复位以来的系统运行时间,单位秒(mask: 0x0020)
  • prefix_path/Vdd: 电源电压,单位 mV(mask: 0x0040)
  • prefix_path/Bpsin: 从站点进入 AP 的 KBytes/s(mask: 0x0800)
  • prefix_path/Bpsout: 从 AP 到站点的 KBytes/s(mask: 0x0800)
  • prefix_path/Bpd: 每天与站点之间传输的 KBytes(mask: 0x0400)
  • prefix_path/Ppsin: 从站点进入 AP 的数据包/秒(mask: 0x0200)
  • prefix_path/Ppsout: 从 AP 到站点的数据包/秒(mask: 0x0200)
  • prefix_path/Bin: 从站点进入 AP 的总字节数(mask: 0x0100)
  • prefix_path/Bout: 从 AP 到站点的总字节数(mask: 0x0100)
  • prefix_path/NoStations: 当前连接到 AP 的站点数量(mask: 0x2000)
  • prefix_path/TopologyInfo: 包含节点当前拓扑信息的 JSON 结构(mask: 0x1000)

此外,中继器还可以在事件基础上发布:

  • prefix_path/join: 加入 AP 的站点的 MAC 地址(mask: 0x0008)
  • prefix_path/leave: 离开 AP 的站点的 MAC 地址(mask: 0x0010)
  • prefix_path/IP: 通过 DHCP 接收时路由器的 IP 地址(mask: 0x0002)
  • prefix_path/ScanResult: 用于 "scan" 命令结果的单独主题(每个发现的 AP 一条消息)(mask: 0x0004)
  • prefix_path/ACLDeny: 数据包已被 ACL 规则拒绝并被丢弃(mask: 0x0080)

作为 LWT 和状态报告,中继器发布:

  • prefix_path/status: 一个保留主题,内容为 "online"(当中继器连接后)或 "offline"(在连接丢失后作为 LWT)

路由器可以使用以下主题进行配置:

  • command_topic: 路由器订阅此主题并将所有消息解释为命令行
  • prefix_path/response: 路由器在此主题上发布命令行输出(mask: 0x0001)

如果您现在希望路由器只发布例如 Vdd、其 IP 和命令行输出,请将 mqtt_mask 设置为 0x0001 | 0x0002 | 0x0040(即 "set mqtt_mask 0043")。

ENC28J60 以太网支持

esp_wifi_repeater 现在支持通过 SPI 连接的 ENC28J60 以太网 NIC(感谢 Andrew Kroll https://github.com/xxxajk 在使其正常工作方面所做的出色工作),前提是您在 "user_config.h" 中打开 HAVE_ENC28J60 编译选项。当 ESP 以 160 MHz 运行时,以太网接口将支持约 1 Mbps。打开 AP 接口并使用以太网作为上行链路,将使 esp_wifi_repeater 成为 WiFi 设备(例如其他 ESP)的廉价 AP。

通过 SPI 的连接必须为:``` 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:~
短而焊接的导线效果最佳。此外,你还需要一个晶体管来隔离 GPIO15,否则你的 ESP 将无法再启动,参见:https://esp8266hints.wordpress.com/category/ethernet/ 。另外,良好的电源供应也很重要:ENC28j60 在激活时需要约 160mA。对我来说,如果尝试使用 ESP 板上的 3.3V,就会失败。

现在你可以配置新的以太网接口:
- set eth_enable [0|1]:在 SPI 总线上启用/禁用 ENC28J60 以太网网卡(默认:0 - 禁用)
- set eth_ip _ip-addr_:为 ETH 接口设置静态 IP 地址
- set eth_netmask _netmask_:为 ETH 接口设置静态子网掩码
- set eth_gw _gw-addr_:为 ETH 接口设置静态网关地址
- set eth_dhcpd [0|1]:在 ETH 接口上启动 DHCP 服务器以分配动态 IP 地址(默认:0 - 禁用)

# 电源管理
中继器会监控其当前供电电压(显示在“show stats”命令中)。这仅在 esp_init_data_default.bin 中名为 vdd33_const 的第 107 个字节被设置为 255(0xFF) 时才有效。实现这一点的最简单方法是将 esp_init_data_default_v08_vdd33.bin 写入闪存(见下文)。

如果 _vmin_(单位 mV,默认 0)被设置为大于 0 的值,并且供电电压降至该值以下,它将进入深度睡眠模式,持续 _vmin_sleep_ 秒。如果你已将 GPIO16 连接到 RST(这在 ESP-01 上很难焊接),它将在该时间间隔后重启,尝试重新连接,并继续其测量。如果使用配置保存了 _vmin_,它将反复进入睡眠,直到供电电压升至阈值以上。这些设置尤其(仅?)在你使用没有过放保护的(锂)电池为 ESP 供电时非常有用。此时,2900mV-3000mV 的值可能会有帮助,因为它能将 ESP 的功耗降至最低,并在损坏发生前给你更多时间来充电或更换电池。这只有在 ESP 直接连接到电池时才有意义。如果你还连接了其他逻辑电路,它们仍会消耗电池电量。

你可以使用“sleep”命令手动将 ESP 送入睡眠一次。

注意:如果你将高于最大供电电压的 _vmin_ 值保存到闪存中,中继器将在每次重启后立即关机。此时你必须通过将 blank.bin(或任何其他文件)刷写到 0x0c000 来擦除整个配置。

# WiFi 中继器 - L2 桥接

该项目现在提供两种不同的运行模式:**NAT 路由器**和**二层桥接**(称为“中继器模式”)。虽然这两种模式都能扩展网络覆盖范围,但它们在处理流量和设备身份方面存在根本区别。

### NAT 路由器模式(标准)
在这种模式下,如上所述,设备充当标准网关。它创建一个新的子网,并为其接入点(AP)连接的所有设备执行网络地址转换(NAT)。

*   **子网隔离**:连接的客户端位于私有子网(例如 192.168.4.x)中,与主网络隔离。
*   **流量身份**:来自客户端的所有流量在主路由器看来都像是来自 ESP8266 自身的 IP/MAC 地址。
*   **简单性**:无需在上游路由器上进行特殊配置,并且与几乎所有标准 Wi-Fi 网络兼容。
*   **限制**:由于 NAT 屏障,主网络上的设备难以主动连接到中继器后面的设备,除非你使用端口映射。

### 二层桥接模式(“中继器”变体)
此模式实现透明的二层(数据链路层)桥接。ESP8266 扩展现有的主网络,而不是创建辅助子网。

*   **透明桥接**:ESP8266 在以太网帧级别桥接流量。连接的客户端直接从主网络的 DHCP 服务器获取 IP 地址(通过 DHCP 侦听/中继)。
*   **统一网络**:所有设备(无论是连接中继器还是主路由器)都处于同一个 L2 广播域中。
*   **设备可见性**:中继器后面的设备在主网络上保留其原始的 MAC 和 IP 身份。这允许本地发现协议(如 mDNS/Bonjour、UPnP 或网络发现)在整个网络中无缝运行。
*   **复杂性**:需要高级处理,例如代理 ARP 和 DHCP 侦听,以确保上游网络正确地将流量路由回通过中继器连接的“隐藏”客户端。
*   **用例**:当需要在整个网络中进行设备发现(例如通过手机应用控制打印机或智能家居设备)时,此模式是理想选择。

中继器模式的功能较少:无需路由、端口映射和 DHCP,ACL 和 Automesh 也没有实际意义,通过 pcap 进行网络监控同样如此。因此,这些功能在中继器模式中均不可用。此外,MQTT 也被移除。其余功能仍可通过控制台或远程控制台使用。

你可以在“firmware-repeater”文件夹中找到预编译的二进制文件。

中继器模式版本的首次配置与 NAT 路由器基本相同。通过串行控制台只需设置 ssid、password、ap_ssid 和 ap_password,然后保存并重置。如果你想通过 Web 界面进行配置,也同样简单,但必须遵循正确的顺序:

- 使用你的客户端连接到“MyAP”WiFi
- 将浏览器指向“http://192.168.4.1”
- **首先**输入 AP 设置中的 ssid 和 password,设置并重启
- 然后连接到新定义的 AP ssid,再次将浏览器指向“http://192.168.4.1”
- 现在输入 STA 设置中的 ssid 和 password 并连接

一旦定义了 STA ssid,中继器将不再运行自己的 DHCP 服务器,而是从上游 DHCP 获取其 IP(不再是 192.168.4.1)。为了连接到其网页或远程控制台,你可以使用名称“esp-wifi-repeater.local”(如果你的客户端支持 mDNS),或者你必须在上游路由器中查找分配到的地址(或通过串行控制台中的“show stats”)。你始终可以通过控制台执行“reset factory”来重置 ESP。

### 关键对比总结

| 特性 | NAT 路由器 | 二层桥接 |
| :--- | :--- | :--- |
| **网络架构** | 创建新的隔离子网 | 扩展现有广播域 |
| **IP 地址分配** | 客户端使用辅助地址池 | 客户端使用上游 DHCP 服务器 |
| **发现(mDNS/UPnP)** | 通常被阻止/困难 | 完全支持(透明) |
| **上游可见性** | 客户端身份被隐藏(NAT) | 客户端身份被保留 |
| **实现方式** | 标准网络 | 高级代理(代理 ARP/侦听) |

# 构建与刷写
要将预编译的二进制文件直接刷写到设备上,请使用 [Web-Installer](https://martin-ger.github.io/esp_wifi_repeater/)。

如果你已安装 Docker,获取完整构建环境的最简单方法是将 ESP8266 连接到 /dev/ttyUSB0,然后使用以下命令运行镜像:```
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

要构建 L2 WiFi 中继器版本,只需为 make 命令使用 VARIANT=bridge 选项:``` 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:~
要搭建全新的构建环境并编译该二进制文件,请下载并安装 esp-open-sdk(我建议使用这个基于基础 NONOS SDK 2.2 的版本:https://github.com/xxxajk/esp-open-sdk)。请确保你可以编译并下载其中自带的“blinky”示例。

然后,将本源码树下载到单独的目录中,并根据需要调整 Makefile 中的 BUILD_AREA 变量以及 user/user_config.h 中的任意选项。默认配置的修改可以在 user/config_flash.c 中完成。使用“make”构建 esp_wifi_repeater 固件。“make flash”会将其烧写到 esp8266 上。

源码树中包含 liblwip_open 的二进制版本、来自我的 esp-open-lwip 分支所需的额外头文件,以及 rboot 工具的二进制文件。*无需为此执行额外的安装操作。* 仅当你不希望使用预编译库时,才需从 https://github.com/martin-ger/esp-open-lwip 检出源码。用其替换 esp-open-sdk 源码树中的“esp-open-lwip”目录。在 esp_open_lwip 目录中执行“make clean”,然后在 esp_open_sdk 上层目录再次执行“make”。这将编译出包含 NAT 功能的 liblwip_open.a。用该二进制文件替换 liblwip_open_napt.a。此外,你也可以从 https://github.com/raburton/rboot 构建“rboot.bin”二进制文件,并将其替换到项目的根目录中。

*更新*:如果你在网上看到使用“0x10000.bin”的安装说明——由于 OTA 的原因,现在已改为“0x02000.bin”。

如果你想使用完整的预编译固件二进制文件,可以用以下命令烧写:“esptool.py --port /dev/ttyUSB0 write_flash -fs 4MB -ff 80m -fm dio 0x00000 firmware/0x00000.bin 0x02000 firmware/0x02000.bin”(对于 ESP-01 请使用 -fs 1MB)。对于 esp8285,必须使用 -fs 1MB 和 -fm dout。

在 Windows 上,你可以使用 https://espressif.com/en/support/download/other-tools 提供的“ESP8266 Download Tool”进行烧写。从 firmware 目录下载 0x00000.bin 和 0x02000.bin 这两个文件。对于通用 ESP12、NodeMCU 或 Wemos D1,请使用以下设置(对于 ESP-01,请将 FLASH SIZE 改为“8Mbit”):

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

如果“QIO”模式在你的设备上失败,请尝试“DIO”。同时请查看“Detected Info”以确认 Flash 芯片的大小和模式。如果下载的固件仍然无法正常启动,请使用附带的校验和检查二进制文件是否可能已损坏。如果你怀疑固件二进制文件已损坏,请将整个仓库下载为 zip,并从该 zip 中提取二进制文件——这样可以避免 HTTP 下载问题(例如 CR-LF 转换)。

# OTA(空中)更新支持

基于 rboot 库:https://github.com/raburton/rboot ,并感谢 christianchristensen 的贡献。

构建过程会在 firmware 目录中生成两份 esp_wifi_repeater 二进制文件:0x02000.bin 和 0x82000.bin。对于初始安装,只需烧写 0x00000.bin(rboot 引导加载程序)和 0x02000.bin(程序的一个副本)即可。esp_wifi_repeater 即可正常工作。

如果你的 Flash 至少有 1MB,你就可以通过 OTA(空中)更新到另一个版本。也就是说,你可以从 CLI 交互式地加载新的二进制文件并切换到它。另一个二进制文件会被加载到当前非活动的内存位置(0x02000 (rom0) 或 0x82000 (rom1)),并在成功后启动。你也可以在两个已安装的二进制文件之间交互式切换。当前的配置将同时用于两个二进制文件(只要其格式没有变化)。

你可以通过以下命令控制 OTA 功能:
- show ota:显示当前活动的二进制文件以及下次更新的 URL
- set ota_host _hostname_:设置 OTA 服务器的主机名或 IP 地址(默认:"none")
- set ota_port _portno_:设置 OTA 服务器的端口号(默认:80)
- ota update:尝试通过 HTTP 从 ota_host:ota_port 下载新的二进制文件(0x02000.bin 或 0x82000.bin)并启动它
- ota switch:切换到另一个二进制文件(如果已安装)

要测试 OTA 功能,请将你的 ESP(作为 STA 或 AP)配置为连接到包含更新服务器的网络。然后在 firmware 目录中启动一个简单的 Web 服务器,例如;```
cd firmware
python -m SimpleHTTPServer 8080

将参数 hostname 设置为你计算机的主机名或 IP,将 portno 设置为 8080,然后“保存”。接着在 CLI 上输入:``` ota update

root@kitploit:~
如果配置正确,更新将开始,ESP 将使用新的二进制文件重新启动。

# 已知问题
- 由于 ESP 的 SoftAP 实现的限制,最多可同时连接 8 个站点。
- ESP8266 需要良好的电源,因为它在传输过程中会产生高达 170 mA 的电流尖峰(WiFi 开启时典型平均功耗约为 70 mA)。如果您的 ESP 运行不稳定并时不时重启,请首先检查电源。如果您在此处遇到问题,在 Vdd 和 Gnd 之间连接一个大电容可能会有所帮助。

# 许可证
该软件是开源的。第三方源文件有自己的许可证头。对于所有其他文件,适用 MIT 许可证。
下载工具