第二十五讲: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 连接,拆开来看其实是一连串的步骤。任何一步失败,整个连接就断了。我习惯把连接过程画成一条流水线:

  1. 扫描:是否看到目标 SSID?
  2. 认证:Open / WPA2 / WPA3 握手是否完成?
  3. 关联:AP 是否返回 Association Response?
  4. 四次握手:PTK 是否协商成功?
  5. DHCP:是否拿到 IP?
  6. 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 核心逻辑。你可以把它当作一个诊断框架:

WifiDiagnostics 诊断框架 数据收集层 事件日志 · 状态快照 · 异常记录 连接失败分析 扫描 → 认证 → 关联 → DHCP → DNS 信号质量评估 RSSI · SNR · 重传率 · 信道占用 诊断引擎(Diagnostics Engine) 诊断输出 根因报告 修复建议 质量评分

25.5 实战建议:如何用好 WifiDiagnostics

嗯,这里要注意一点。WifiDiagnostics 不是写完了就完事的。你得让它真正跑起来。

  • 线上环境一定要开:别怕性能开销。诊断数据的写入是异步的,不会卡 UI。
  • 设置合理的轮转策略:日志文件别无限增长。我一般保留最近 7 天的数据,超过的自动删除。
  • 结合用户反馈:用户说「连不上」的时候,让他上传诊断日志。你一看就知道问题在哪。

我的经验:曾经有一个用户反馈「Wi-Fi 连上但上不了网」。我看了诊断日志,发现 DHCP 拿到了 IP,DNS 也能解析,但 ping 网关超时。最后定位到是 AP 的 NAT 表满了。这种问题,没有诊断数据根本没法查。

说白了,WifiDiagnostics 就是你的「事后诸葛亮」。但有了它,你就能在用户抱怨之前,先把问题干掉。


公众号:蓝海资料掘金营,微信deep3321