第二十五讲:WifiDiagnostics——诊断数据收集、连接失败分析、信号质量评估
说实话,Wi-Fi 出问题的时候,用户第一反应就是「网断了」。但对我们工程师来说,问题远没那么简单。是驱动挂了?是 DHCP 超时?还是信号太弱?
WifiDiagnostics 就是干这个的。它像一个黑匣子,把 Wi-Fi 从扫描到连接、从认证到 DHCP、从数据传送到断连的每一个关键节点都记录下来。有了这些数据,你才能做真正的根因分析。
我个人习惯,在开发阶段就把 Diagnostics 的日志级别调到最高。别等到线上出问题了才想起来加日志,那时候已经晚了。
25.1 诊断数据收集:到底要收什么?
很多人以为诊断就是打 log。其实不止。WifiDiagnostics 收集的数据分三类:
- 事件日志:连接成功、断开、漫游、DHCP 完成、DNS 解析等关键事件
- 状态快照:某个时刻的 RSSI、链路速度、信道、频段、IP 配置
- 异常记录:认证失败、四次握手超时、DHCP NAK、DNS 超时等
我在项目中遇到过一个问题:用户反馈 Wi-Fi 频繁断连,但普通日志里什么都看不到。后来我加了状态快照,才发现每次断连前 RSSI 都掉到了 -85dBm 以下。原来是用户走到了信号死角。
核心原则:不要只收「成功」的数据。失败的数据才是最有价值的。
25.2 连接失败分析:从扫描到 IP 分配
一个 Wi-Fi 连接,拆开来看其实是一连串的步骤。任何一步失败,整个连接就断了。我习惯把连接过程画成一条流水线:
- 扫描:是否看到目标 SSID?
- 认证:Open / WPA2 / WPA3 握手是否完成?
- 关联:AP 是否返回 Association Response?
- 四次握手:PTK 是否协商成功?
- DHCP:是否拿到 IP?
- DNS:能否解析域名?
你想想看,如果用户说「连不上」,你至少得知道卡在哪一步。WifiDiagnostics 里有一个 ConnectivityMonitor,专门记录每一步的状态。
// 伪代码示例:连接失败诊断
if (scanResult == null) {
report("SSID not found in scan results");
} else if (authenticationFailed) {
report("4-way handshake timeout or MIC mismatch");
} else if (dhcpTimeout) {
report("DHCP request sent but no ACK received");
} else if (dnsFailed) {
report("DNS resolution failed for google.com");
} else {
report("Connection established successfully");
}
小技巧:我曾经遇到一个 case,DHCP 总是超时。后来发现是 AP 的 DHCP 池满了。这种问题在日志里表现为「DHCP OFFER 未收到」,但如果你只看 Wi-Fi 层日志,永远找不到原因。所以诊断数据一定要跨层收集。
25.3 信号质量评估:不只是看 RSSI
很多人觉得信号好就是 RSSI 高。其实不是。RSSI 只告诉你「收到了多少信号」,但不告诉你「信号有多干净」。
我常用的信号质量指标有这几个:
| 指标 | 含义 | 好/坏阈值 |
|---|---|---|
| RSSI | 接收信号强度 | > -65dBm 好,< -80dBm 差 |
| SNR | 信噪比 | > 25dB 好,< 15dB 差 |
| Link Speed | 当前连接速率 | > 300Mbps 好(5GHz) |
| Retry Rate | 重传率 | < 10% 好,> 30% 差 |
| Channel Utilization | 信道占用率 | < 50% 好,> 80% 差 |
说白了,RSSI 高但重传率高,说明干扰严重。这种情况在公寓楼里特别常见——隔壁邻居的路由器跟你抢信道。
注意:不要只看单次采样。信号是动态的。我建议至少取 10 秒内的滑动平均值,才能反映真实质量。
25.4 知识体系总览
下面这张图是我自己整理的 WifiDiagnostics 核心逻辑。你可以把它当作一个诊断框架:
25.5 实战建议:如何用好 WifiDiagnostics
嗯,这里要注意一点。WifiDiagnostics 不是写完了就完事的。你得让它真正跑起来。
- 线上环境一定要开:别怕性能开销。诊断数据的写入是异步的,不会卡 UI。
- 设置合理的轮转策略:日志文件别无限增长。我一般保留最近 7 天的数据,超过的自动删除。
- 结合用户反馈:用户说「连不上」的时候,让他上传诊断日志。你一看就知道问题在哪。
我的经验:曾经有一个用户反馈「Wi-Fi 连上但上不了网」。我看了诊断日志,发现 DHCP 拿到了 IP,DNS 也能解析,但 ping 网关超时。最后定位到是 AP 的 NAT 表满了。这种问题,没有诊断数据根本没法查。
说白了,WifiDiagnostics 就是你的「事后诸葛亮」。但有了它,你就能在用户抱怨之前,先把问题干掉。
公众号:蓝海资料掘金营,微信deep3321