18、WiFi网络评分与切换:WifiNetworkScoreManager、网络评分机制、自动切换最优网络

各位同学,今天我们来聊一个非常实际的话题——WiFi网络评分与自动切换。

你想想看,手机同时搜到好几个WiFi信号,系统凭什么决定连哪个?连上之后发现信号变差了,它又凭什么自动切到另一个?

这背后,就是一套网络评分机制在干活。

18.1 网络评分机制:系统如何“打分”

Android从早期版本就开始引入网络评分了。说白了,系统给每个可用网络打一个分数,然后选分数最高的那个连。

评分维度主要有这几个:

  • 信号强度(RSSI):最直观的指标,-50dBm比-80dBm好得多
  • 链路质量:丢包率、延迟、吞吐量
  • 安全类型:WPA3 > WPA2 > WEP > 开放网络
  • 历史表现:之前连上后是否频繁断线
  • 用户偏好:用户手动选择过的网络会有加分

我记得在Android 10之前,评分逻辑还比较粗糙。有一次我在项目中调试,发现手机明明连着信号满格的5G WiFi,却突然切到了信号一般的2.4G网络。查了半天,原来是5G频段的信道干扰太严重,系统检测到丢包率飙升,自动降了分。

核心原则:系统不是只看信号强度,而是综合评估“能不能稳定上网”。

18.2 WifiNetworkScoreManager:评分的管理者

Android 10之后,Google引入了WifiNetworkScoreManager这个系统服务。它负责什么呢?

  • 收集各个维度的评分数据
  • 计算最终的网络分数
  • 触发网络切换决策

这个类不是公开API,普通App调不到。但系统应用和厂商可以扩展它。我建议你在做系统定制时,重点关注这个类的源码。

来看一个简化的评分流程:

// 伪代码:网络评分计算
int calculateScore(WifiNetwork network) {
    int score = 0;
    
    // 信号强度评分(0-40分)
    score += getRssiScore(network.rssi);
    
    // 链路质量评分(0-30分)
    score += getLinkQualityScore(network.latency, network.packetLoss);
    
    // 安全评分(0-20分)
    score += getSecurityScore(network.securityType);
    
    // 历史表现评分(0-10分)
    score += getHistoryScore(network.ssid);
    
    return score;
}

个人经验:我在做某个运营商定制项目时,发现他们的评分阈值设得太低,导致手机频繁在两个AP之间来回切换。后来我们把切换的“滞后阈值”从5分调到了15分,问题就解决了。

18.3 自动切换最优网络:系统如何决策

系统不是每时每刻都在切换。它有一个“评估周期”,通常是30秒到2分钟一次。评估时,系统会:

  1. 扫描当前所有可用网络
  2. 计算每个网络的分数
  3. 如果当前网络的分数低于某个阈值,且另一个网络的分数高出一定值,就触发切换

这里有个关键点——切换不是瞬间完成的。系统会先尝试连接新网络,确认能上网后,才会断开旧网络。这叫“先建后断”,避免断网。

避坑指南:我曾经遇到过一个问题——手机在两个WiFi之间来回切,每次切换都要重新认证,导致用户频繁掉线。后来发现是评分周期太短,加上两个网络的分数太接近。解决方案是增加“切换冷却时间”,至少30秒内不重复切换。

18.4 核心知识体系

下面这张图,帮你理清整个评分与切换的脉络:

WiFi网络评分与切换核心流程 输入数据 信号强度 RSSI 链路质量 安全类型 历史表现 WifiNetworkScoreManager 切换决策

18.5 实际项目中的调优建议

如果你在做系统定制或WiFi相关开发,这几个点值得注意:

场景 问题 建议
信号弱但稳定 系统频繁尝试切换 提高切换阈值,增加滞后
两个AP信号接近 来回切换(乒乓效应) 增加冷却时间,至少30秒
5G频段干扰大 实际体验不如2.4G 加入信道利用率评分
用户手动选择过 系统不尊重用户选择 给用户偏好加权重

我的习惯:每次调试WiFi切换问题时,我都会先打开开发者选项里的“WiFi扫描日志”和“WiFi连接日志”。这两个日志能直接看到系统给每个网络打了多少分,以及为什么触发切换。省去了很多猜谜时间。

嗯,关于网络评分和切换,今天就聊这么多。核心就一句话——系统不是看谁信号强就连谁,而是看谁“综合表现好”。理解了这个,你就能看懂很多WiFi相关的奇怪现象了。


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