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;
}
});
}
}