Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92
优先级的计算:
public boolean processMessage(Message message) { case WifiManager.CONNECT_NETWORK: //注意第二个参数是true if (mWifiConfigStore.selectNetwork(config, /* updatePriorities = */ true, message.sendingUid) && mWifiNative.reconnect()) } boolean selectNetwork(WifiConfiguration config, boolean updatePriorities, int uid) { //第一连接的时候mLastPriority为默认值-1,条件成立 // Reset the priority of each network at start or if it goes too high. if (mLastPriority == -1 || mLastPriority > 1000000) { for(WifiConfiguration config2 : mConfiguredNetworks.values()) { if (updatePriorities) { if (config2.networkId != INVALID_NETWORK_ID) { config2.priority = 0; setNetworkPriorityNative(config2.networkId, config.priority); } } } //优先级从0开始 mLastPriority = 0; } // Set to the highest priority and save the configuration. if (updatePriorities) { //每连接一次会累加,也就是说最后连接的无线网络优先级总要比前面高,除非主动设置 config.priority = ++mLastPriority; //跟新到wpa_supplicant的优先级列表中 setNetworkPriorityNative(config.networkId, config.priority); buildPnoList(); } //保存优先级属性到配置wpa_supplicant.conf文件中 if (updatePriorities) mWifiNative.saveConfig(); else mWifiNative.selectNetwork(config.networkId); }优先级的使用: 当RSSI相同以及没有user choice的时候,会用优先级去比较选择使用哪个作为最佳网络 最佳网络的选择可参考WiFi之Autojoin对无线网络的选择机制
int compareWifiConfigurations(WifiConfiguration a, WifiConfiguration b) { { if (order == 0) { // We don't know anything - pick the last seen i.e. K behavior // we should do this only for recently picked configurations if (a.priority > b.priority) { // a is of higher priority - descending if (VDBG) { logDbg(" compareWifiConfigurations prefers -1 " + a.configKey() + " over " + b.configKey() + " due to priority"); } order = -1; } else if (a.priority < b.priority) { // a is of lower priority - ascending if (VDBG) { logDbg(" compareWifiConfigurations prefers +1 " + b.configKey() + " over " + a.configKey() + " due to priority"); } order = 1; } } }另外在pno list排序时也有用到优先级:
private void buildPnoList() { mCachedPnoList = new ArrayList<WifiNative.WifiPnoNetwork>(); ArrayList<WifiConfiguration> sortedWifiConfigurations = new ArrayList<WifiConfiguration>(getConfiguredNetworks()); Log.e(TAG, "buildPnoList sortedWifiConfigurations size " + sortedWifiConfigurations.size()); if (sortedWifiConfigurations.size() != 0) { // Sort by descending priority Collections.sort(sortedWifiConfigurations, new Comparator<WifiConfiguration>() { public int compare(WifiConfiguration a, WifiConfiguration b) { return a.priority - b.priority; } }); } }