Wi-Fi网络评分机制00_(WiFi选网/自动连接)

评分机制简介

当扫描到多个wifi网络时,系统又是如何确定到底连接哪一个AP呢,在Android WiFi Framework中,存在一套评分机制,它会对每一个扫描到的AP进行打分,最后选择一个最优的进行连接。

WifiConnectivityManagerhandleScanResults()方法为入口。当收到扫描结果后,现通过WifiNetworkSelectorgetCandidatesFromScan()方法生成所有待评分的candidates,随后再通过WifiNetworkSelectorselectNetwork()方法对每个candidate进行评分并选择最优的一个candidate。

// packages/modules/Wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
private void handleScanResults(@NonNull List<ScanDetail> scanDetails,
        @NonNull String listenerName,
        boolean isFullScan,
        @NonNull HandleScanResultsListener handleScanResultsListener) {
    // ... ...
    List<WifiCandidates.Candidate> candidates = mNetworkSelector.getCandidatesFromScan(
        scanDetails, bssidBlocklist, cmmStates, mUntrustedConnectionAllowed,
        mOemPaidConnectionAllowed, mOemPrivateConnectionAllowed,
        mRestrictedConnectionAllowedUids, isMultiInternetConnectionRequested());
    mLatestCandidates = candidates;
    mLatestCandidatesTimestampMs = mClock.getElapsedSinceBootMillis();
    // ... ...
    handleCandidatesFromScanResultsForPrimaryCmmUsingMbbIfAvailable(
                listenerName, candidates, handleScanResultsListener);
}

private void handleCandidatesFromScanResultsForPrimaryCmmUsingMbbIfAvailable(
        @NonNull String listenerName, @NonNull List<WifiCandidates.Candidate> candidates,
        @NonNull HandleScanResultsListener handleScanResultsListener) {
    WifiConfiguration candidate = mNetworkSelector.selectNetwork(candidates);
    if (candidate != null) {
        localLog(listenerName + ":  WNS candidate-" + candidate.SSID);
        connectToNetworkForPrimaryCmmUsingMbbIfAvailable(candidate);
        handleScanResultsWithCandidate(handleScanResultsListener);
    } else {
        localLog(listenerName + ":  No candidate");
        handleScanResultsWithNoCandidate(handleScanResultsListener);
    }
}

selectNetwork()的步骤如下:

  1. 获取评分器CandidateScorer

    final WifiCandidates.CandidateScorer activeScorer = getActiveCandidateScorer();
    

    目前系统默认的评分器是ThroughputScorer

    public static final String PRESET_CANDIDATE_SCORER_NAME = "ThroughputScorer";
    private WifiCandidates.CandidateScorer getActiveCandidateScorer() {
            WifiCandidates.CandidateScorer ans = mCandidateScorers.get(PRESET_CANDIDATE_SCORER_NAME);
    
  2. 运行所有评分器

    其实对最后结果产生影响的只有ThroughputScorer

    for (WifiCandidates.CandidateScorer candidateScorer : mCandidateScorers.values()) {
            WifiCandidates.ScoredCandidate choice;
            try {
                choice = wifiCandidates.choose(candidateScorer);
            } catch (RuntimeException e) {
                Log.wtf(TAG, "Exception running a CandidateScorer", e);
                continue;
            }
    

总结

Android的WiFi选择器功能是通过WifiNetworkSelector实现的。

WifiNetworkSelector通过通过打分算法对每一个scan result进行打分,最终选择分数最高的进行连接。

目前支持的评分器有:

  • BubbleFunScorer

    只关心信号强度rssi(received signal strength indicator)

  • CompatibilityScorer

  • ScoreCardBasedScorer

  • ThroughputScorer

WifiNetworkSelectorselectNetwork()方法会运行所有的评分器,但是有效(active)的评分器只有ThroughputScorer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Wifi 知识指的是与Android系统中的Wifi连接相关的知识。Android是一个广泛使用的移动操作系统,它允许设备连接到无线网络,以便上网、进行文件传输和与其他设备进行通信。 首先,我们可以了解一下Android连接Wifi网络的步骤。在Android设备的设置中,有一个Wifi选项,通过点击它可以打开设备的Wifi功能。接下来,设备会自动搜索附近的Wifi网络,并列出可用的网络名字(SSID)。用户可以选择要连接网络,并输入密码(如果有的话)。一旦输入正确的密码,设备就会连接到所选的Wifi网络。 在连接Wifi后,我们可以通过Android设备进行多种操作。首先,我们可以使用浏览器、社交媒体应用程序或邮件应用程序等上网工具来浏览互联网。其次,我们可以使用Wifi来与其他设备进行文件传输,包括共享照片、视频或文档。此外,许多应用程序和游戏也需要Wifi连接才能正常运行。 在使用Android Wifi时,还需要了解一些相关概念。首先是Wifi信号强度的概念,通常以信号强度指示图标的形式表示。它可以告诉用户设备与无线路由器之间的连接强度,越强则表示连接更稳定。其次是Wifi的安全性,可以通过使用WPA或WPA2密码来保护Wifi网络,以防止未经授权的人连接网络并窃取数据。 除了上述知识,还有一些其他细节需要了解,例如一些设备可能不支持某些Wifi频段(例如2.4 GHz或5 GHz)或某些Wifi加密类型(例如WEP),这可能会影响设备的连接能力。 总体而言,Android Wifi知识是指能够了解如何连接Wifi网络、使用Wifi进行各种操作以及了解与Wifi连接相关的概念和细节。这些知识可以帮助我们更好地使用Android设备上的Wifi功能,并更好地享受与其他设备的无线连接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值