别再被“全屋WiFi”忽悠了,手把手教你让手机自动切换最强信号!
家里Wi-Fi信号满格但网速卡?因为你手机是个路痴,三招给它装个导航!
家里WiFi漫游差,苹果设备不切路由器。装usteer协调器加static-neighbor-reports补全802.11k邻居列表,5G频段信号弱的粘性客户端消失,漫游正常了。
我搞定了家里WiFi乱跑不切换的问题
我家里的WiFi之前有个烦人的问题,就是你拿着手机从客厅走到厨房,它死活不切换到你身边的那个路由器,非要连着远处那个信号只剩一格的路由器。这就好比你明明已经到了公交站,但手机导航还让你往前走两百米,蠢到家了。
我家里有四个路由器,都是Cudy AX3000刷了OpenWRT系统,网线连的2.5G口,信号覆盖按理说没问题。但苹果手机、iPad、MacBook就是不听话,死活赖在一个路由器上不走。后来我研究了一下,发现是因为路由器之间没有互相告诉对方“我在这里”,手机也不知道附近还有更好的信号源。
所以我装了一个叫usteer的软件,再配上一个叫static-neighbor-reports的小工具,问题就解决了。现在手机会主动切换到信号更好的路由器上,那些信号差到-90dBm的脑残连接彻底消失了。
我为啥不把两个频段的名字改成一样的
很多人觉得WiFi漫游最简单的方法就是把2.4G和5G的WiFi名字设成一样,让设备自己选。这个想法在办公室或者公共场合挺好使,但在家里就是给自己找麻烦。
我家里有一堆老旧物联网设备,比如智能插座、灯泡这些东西,它们的技术水平还停留在2016年。这些玩意儿只认WPA2加密,你给它搞个WPA3它直接罢工给你看。所以我必须保留一个老古董专用的2.4G网络,名字叫LegacyNet,加密用WPA2,设置得保守一点,让那些老设备能安安稳稳待着。
5G网络那边就自由多了,我给起名叫ModernNet,用WPA3加密,速度快延迟低。手机电脑平板都连这个。两个网络完全分开,就像两条互不干扰的车道,2.4G跑拖拉机和三轮车,5G跑小轿车和跑车。
后端的网线是2.5G口连接四个路由器,每个路由器都设置成“胖AP”模式,也就是它们自己管自己的,没有中央控制器。我不喜欢那种需要云端账号才能管理的设备,万一厂家倒闭了或者断网了,你连改个密码都改不了,这叫什么玩意儿。所以我的原则就是不用任何厂商自己的管理软件,全用OpenWRT搞定。
用户开始抱怨漫游不好用
一开始我并没发现漫游有问题,因为我自己用的安卓手机切换还挺积极的。但我老婆开始抱怨了,说她拿着iPhone从卧室走到厨房,视频通话就开始卡顿掉帧。
我查了一下日志,发现这台iPhone还连着客厅那个路由器,信号已经掉到-85dBm了。这个数字啥概念呢,就好比你跟人说话,对方站在两百米开外还得靠吼才能听见。按理说厨房里就有一个路由器,信号应该是-45dBm,但手机就是死活不切过去。
苹果设备的脾气我是知道的,它们对当前连接的路由器有种迷之执着,就像那种明知道对方是渣男但就是不分手的朋友。即使信号已经烂到没法正常上网了,它还是想再坚持一下。
我当时在OpenWRT的设置界面里把跟漫游有关的选项都打开了,包括802.11r(快速切换)、802.11k(邻居报告)、802.11v(负载均衡),但效果还是不行。后来我发现问题出在哪儿了:802.11k虽然开着,但路由器根本没生成邻居列表,手机问“附近还有哪些路由器”的时候,路由器说“我不知道”,手机就只能靠自己瞎猜。
这就像你在一个陌生的商场里想找厕所,服务员告诉你“厕所在那边”,但你问“具体哪条路”的时候,他说“我也不清楚”,那你只能自己瞎转悠了。
我装上了usteer这个漫游管家
翻了一下OpenWRT的论坛,我发现需要装一个叫usteer的软件。这玩意儿就是个WiFi漫游的协调员,它会让各个路由器之间互相通信,交换信息,知道每个设备当前连着谁、信号怎么样。
安装过程特别简单,四条命令搞定。先更新软件列表,然后装usteer和它的网页界面,最后启动服务让它开机自启。
opkg update
opkg install usteer luci-app-usteer
/etc/init.d/usteer enable
/etc/init.d/usteer restart
安装完之后,usteer的默认配置就已经够用了。它会在局域网里自动发现其他装了usteer的路由器,然后开始交换客户端数据。我的四个路由器很快就互相认出来了,就像四个同事拉了个群,开始在群里汇报“我这边连了三个设备”“我这边连了五个设备”“有个iPhone信号有点弱,你们谁离得近准备接手”。
usteer这玩意儿还有个好处,它不依赖云端,也不依赖什么专有协议,就是靠局域网里的UDP广播互相喊话。就算外网断了,家里的漫游照样工作,这才像个靠谱的设备。
但装完usteer之后,我检查了一下802.11k的邻居列表,发现还是空的。这说明虽然有了协调员,但路由器还是不知道怎么告诉手机“旁边还有谁”。
我补上了邻居报告这块拼图
又研究了一圈论坛,我发现OpenWRT里有个小工具叫static-neighbor-reports,这个名字起得特别直白,就是“静态邻居报告”。它的工作就是把邻居路由器的信息塞进802.11k的数据包里面。
我可以用一条命令让路由器自己生成邻居信息。比如对于5G网络,在某个网络接口上跑这个命令,就能看到这个路由器知道的所有邻居。
ubus call hostapd.wlan0 rrm_nr_get_own
但是这条命令生成的数据只是它自己知道的,别的路由器的信息还得手动告诉它。所以我要做的事情是,在每个路由器上,把其他三个路由器的信息都配置进去。而且必须分频段配置,2.4G的只能看到2.4G的邻居,5G的只能看到5G的邻居。因为我家2.4G和5G的WiFi名字不一样,加密方式也不一样,你不能让一个连2.4G的设备去尝试连接5G的路由器,那会出问题的。
装好static-neighbor-reports之后,同样让它开机自启。
opkg install static-neighbor-reports
/etc/init.d/static-neighbor-reports enable
/etc/init.d/static-neighbor-reports restart
配置完成之后,每个路由器在2.4G频段上会告诉手机“除了我还有另外三个路由器在附近”,在5G频段上同样会告诉手机“另外三个5G路由器也在附近”。手机拿到这份邻居列表,就知道该往哪儿切了。
这就好比你在一个大型火车站里,站台广播不再只说“列车进站了”,而是会说“列车进站了,8号车厢在A区,9号车厢在B区,换乘2号线的乘客请往C口走”。信息越详细,乘客越不容易跑错。
2.4G频段的信号变化没啥惊喜
改了设置之后我观察了一个礼拜,用Graphite收集数据画了图表。先看2.4G频段的信噪比变化。
2.4G频段本来就乱得像菜市场。你家周围的邻居们、微波炉、蓝牙耳机、无线鼠标、甚至某些劣质电源适配器,都在这个频段上挤着。你就算把自家的设备调到最优,也挡不住隔壁老王家的路由器在同一个信道上狂发数据。
从数据上看,有两个路由器的信号质量稍微好了一点,有两个反而变差了一点。这个波动不是我能控制的,可能因为邻居家的网络负载变了,也可能因为有人新装了个什么设备在干扰。对于2.4G频段,我的预期本来就是能连上就行,不指望它能有多好的漫游体验。那些老旧的物联网设备只要能正常工作,不频繁掉线,我就谢天谢地了。
所以2.4G这边的漫游改善基本可以忽略不计,这不是配置能解决的问题,这是物理规律和频谱拥堵的问题。
5G频段的漫游效果很明显
5G频段就完全不一样了。5G的信号穿墙能力弱,但是干净,干扰少,就像一条没什么车的专用高速路。我的四个路由器在5G频段上覆盖的区域会有重叠,但只要设备能及时切换到最近的那个,体验就会非常好。
从比特率数据来看,有两个路由器之间的负载发生了明显的转移。具体来说就是,以前很多设备宁可连着一个信号较弱的客厅路由器,也不去连信号更强的厨房路由器。改了设置之后,设备的分布明显变得更合理了,每个路由器都主要在服务它附近区域的设备。
这个变化说明usteer和802.11k确实在起作用。设备不再只靠自己的臆断来决定连谁,而是听取了路由器提供的邻居报告,知道了附近还有更好的选择。
最让我满意的检查是“粘性客户端”的对比。改动之前,我能看到有设备连着信号-90dBm的路由器,这个信号强度基本等于快断连的边缘了,就像手机只剩1%电量还在撑。改动之后,那种极端弱的连接完全消失了,最差的设备也在-75dBm以上,这个强度足够流畅看视频了。
原来那些抱怨断流卡顿的情况也基本没有了。我老婆没再跟我提过视频通话的问题,这说明这个改进是真实的、可感知的。
还有点小毛病不过能忍
当然事情不可能完美。我在日志里发现了一条错误信息,内容是FT相关的,大概意思是某个路由器在响应快速切换请求的时候缺了一个加密参数。这条信息只出现了一次,之后再也没有复现过。
FT是802.11r协议里的快速切换机制,目的是让设备在切换路由器的时候不需要重新认证,省去那几百毫秒的握手时间。这个功能本身很复杂,尤其是跟WPA3混合使用的时候,涉及好几种加密方式的协商,容易出现配置不兼容的情况。
一次错误不代表系统坏了,毕竟之后漫游都在正常工作,没有出现断连或者认证失败的情况。但我还是把这个日志加进了监控列表,如果之后频繁出现,我得再查查是不是某个路由器的驱动或者配置有问题。
WiFi这种东西就是这样,你永远没法做到完美,只能做到“够用且稳定”。家里有冰箱压缩机启动、微波炉工作、甚至有人走过路由器前面,都可能影响信号。这种环境变数太多了,你不能像实验室里那样控制所有变量。
接下来我要继续盯着它
这套配置已经稳定跑了一段时间,我打算继续观察几个礼拜。为了省事,我写了个脚本让大模型帮我自动查Graphite的数据和画图,不然每次都要手动敲命令太麻烦了。我又不是专职网管,没那个功夫天天盯着仪表盘看。
配置文件我已经存到了本地的Gitea代码仓库里,所有的设置都有记录,啥时候改的、为啥改的、改了哪里,清清楚楚。过几个月抽几分钟跑一下脚本看一眼关键指标就行。
我特别喜欢Cudy这些路由器的点在于,它们不需要什么云控制器、不需要手机App注册、不需要什么独家秘方。就是干干净净的OpenWRT系统,配合collectd采集数据、Graphite存数据画图,偶尔SSH登录进去看一眼配置。出问题了我也能自己查,因为所有的东西都是透明的、可检查的。
这种掌控感比任何“智能”功能都重要。当问题变得奇怪的时候,它至少是在你可以检查的范围内变奇怪,而不是在黑盒子里变奇怪。
作者单位背景:Rui Carmo,独立技术博主,家庭网络爱好者