跳转至

全屋网络覆盖

都 2026 年了,不会还有人不知道"数据漫游"这东西吧?如果想简单组网,两个 WiFi 名称设置一样,那没有看这篇文章的必要了,陈大剩所说的全屋网络覆盖是指通过 OpenWrt 实现"数据漫游",两个 AP 无缝衔接。

为什么同名 WiFi 不叫无缝漫游

很多人的解决方案是把两个路由器的 SSID 和密码设置一样,确实能连上,但问题在于设备侧决定切换时机。手机靠近副 AP 了,但信号还没差到让它主动切换,它就会死抱着主 AP 不放,直到信号差到掉线才切,这个过程网络会中断 1-3 秒,打游戏、视频通话直接感受到卡顿。

真正的无缝漫游需要三个协议配合:

协议 作用
802.11r(Fast BSS Transition) 切换 AP 时跳过重新认证,切换时间从几百毫秒压到 50ms 以内
802.11k(Radio Resource Management) AP 主动告知设备周边有哪些 AP 可用,帮设备找到更好的候选
802.11v(BSS Transition Management) AP 可以主动"劝说"设备切换到信号更好的 AP

三个协议同时开,效果最好。

组网方案

我的方案是主路由 + 副 AP,通过网线做有线回程(Wired Backhaul),稳定性远强于无线回程。

Text Only
光猫 ──── 主路由(OpenWrt,运行 DHCP) ──── 交换机 ──── 副 AP(OpenWrt,dumb AP 模式)
                                                    └──── 其他有线设备
  • 主路由:负责拨号、DHCP、防火墙,同时也是一个 AP
  • 副 AP:只做无线接入点,关掉 DHCP,桥接到主路由的网络,IP 固定用于管理

副 AP 用什么设备

刷了 OpenWrt 的旧路由器完全够用,不需要买专门的 AP。我用的是一台吃灰的小米路由器刷机,省钱又够用。

副 AP 配置(Dumb AP 模式)

先把副 AP 改成哑路由模式,这步一定要先做,否则两个 DHCP 服务器会打架。

网线插 LAN 口,不是 WAN 口

从交换机/主路由拉过来的网线,必须插副 AP 的任意一个 LAN 口。OpenWrt 默认 WAN 口是独立的 wan 接口,不在 LAN 桥里,插错口设备根本上不了网。

SSH 进副 AP,执行:

Bash
# 关闭 DHCP
uci set dhcp.lan.ignore=1
uci commit dhcp

# 关闭防火墙(dumb AP 不需要)
/etc/init.d/firewall stop
/etc/init.d/firewall disable

# 给副 AP 一个固定 IP,方便后续管理(根据你的网段修改)
uci set network.lan.ipaddr='192.168.1.2'
uci set network.lan.gateway='192.168.1.1'
uci set network.lan.dns='192.168.1.1'
uci commit network

/etc/init.d/network restart

之后用 192.168.1.2 访问副 AP 的管理界面。

开启 802.11r/k/v

主路由和副 AP 都要配置,且配置必须完全一致,否则漫游会出问题。

进入 Network → Wireless,点击对应无线接口的 Edit,找到 WLAN Roaming 选项卡:

  • 802.11r Fast Transition:勾选启用
  • Mobility Domain:填一个 4 位十六进制数,例如 abcd,主副 AP 必须相同
  • FT protocol:选 FT over the Air(无需预配置密钥,更简单)
  • 802.11k Neighbor Report:勾选启用
  • 802.11v BSS Transition:勾选启用
Bash
# 以 2.4G 接口为例,接口名根据实际情况修改(通常是 radio0 或 radio1)
uci set wireless.@wifi-iface[0].ieee80211r=1
uci set wireless.@wifi-iface[0].mobility_domain='abcd'
uci set wireless.@wifi-iface[0].ft_over_ds=0
uci set wireless.@wifi-iface[0].ft_psk_generate_local=1
uci set wireless.@wifi-iface[0].ieee80211k=1
uci set wireless.@wifi-iface[0].ieee80211v=1
uci set wireless.@wifi-iface[0].bss_transition=1
uci commit wireless
wifi reload

5G 接口同样操作,把 wifi-iface[0] 换成对应的接口索引。

Mobility Domain 必须两边一致

这个值如果主副 AP 不一样,802.11r 形同虚设,设备切换时还是要走完整认证流程。

调整 AP 发射功率

光配协议还不够,还要让设备"愿意"切换。两个 AP 覆盖范围如果重叠太多,设备没有切换动力;重叠太少,中间会有信号死角。

一般经验:

  • 两个 AP 之间的信号重叠区域约占各自覆盖半径的 15%–20%
  • 如果房子不大,主动降低发射功率(比如从 20dBm 降到 17dBm),让设备更早触发漫游
  • 可以在 LuCI 的 Wireless → Advanced Settings 里调整 Transmit Power

验证漫游效果

手机连上 WiFi 后,从主 AP 走向副 AP,用以下方式验证:

方法一:ping 测延迟

Bash
# 手机上用 Network Analyzer 之类的 App,或电脑上 ping 网关
ping 192.168.1.1 -t

漫游时如果丢包不超过 1 个、延迟没有明显跳升,说明 802.11r 生效了。

方法二:看关联 AP

在主路由 LuCI 的 Status → OverviewNetwork → Wireless 页面,观察设备是否从主路由的关联列表消失,同时出现在副 AP 的关联列表里。

方法三:抓包(进阶)

用 Wireshark 抓 802.11 帧,看切换时是否有 FT Action 帧,有的话说明 Fast Transition 正常工作。

踩坑记录

坑一:部分安卓设备不触发漫游

某些安卓手机对 802.11v 的 BSS Transition Request 支持很差,AP 发劝离帧它直接忽略。这种情况只能靠降低发射功率,让信号差到触发设备自己切换,或者开启 disassoc_low_ack(超时未响应的客户端强制踢掉),这个选项在 UCI 里:

Bash
uci set wireless.@wifi-iface[0].disassoc_low_ack=1
uci commit wireless
wifi reload

坑二:802.11r 与部分老设备不兼容

开了 802.11r 之后,极少数老设备(主要是 IoT 设备,比如老款智能插座)会连不上。解法是单独为这些设备开一个不启用 802.11r 的 SSID,或者换一个频段(IoT 设备通常只支持 2.4G,5G 单独开漫游不影响它们)。

坑三:有线回程和无线回程混用

如果副 AP 是无线回程接入的(Mesh 模式),OpenWrt 的配置会更复杂,需要用 relaydbatman-adv,这篇就不展开了。有条件一定拉网线,省心。

总结

配完之后,手机从客厅走到卧室,WiFi 全程不断,连视频通话都感受不到切换,体验接近商用 AP 的 Mesh 方案,但成本低得多——两台刷了 OpenWrt 的旧路由器就够了。

核心要点:

  • 副 AP 必须设为 dumb AP 模式,关掉 DHCP 和防火墙
  • 802.11r 的 Mobility Domain 两边必须一致
  • 802.11k + 802.11v 配合 802.11r 才能发挥最好效果
  • 有线回程比无线回程稳定得多,能拉网线就拉网线

创建日期: 2025年7月22日 最后更新: 2026年3月26日