目录
前言 #一个测量网络环境的APP demo#
一、如何获取WiFi扫描结果
当我们获取到WiFi扫描结果之后,可以从wifiList.get(i)遍历scan列表,
public String wifidisturbance(Context context) {
List<ScanResult> wifiList;
int ConectedFreq = 0;
String ConnectedMac = "hello world";
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifiManager != null) {
Log.d(TAG, "wifiManager != null");
wifiList = wifiManager.getScanResults();
WifiInfo info = wifiManager.getConnectionInfo();
if (wifiList != null && info != null) {
int j = 0;
for (int i = 0; i < wifiList.size(); i++) {
ScanResult result = wifiList.get(i);
if (info.getBSSID().equals(result.BSSID)) {
Log.d(TAG, "connected wifiname: " + result.SSID +
" mac: " + result.BSSID + " bandwidth: " + result.channelWidth + " frequency: " + result.frequency + " rssi: " + result.level);
ConectedFreq = result.frequency;
ConnectedMac = result.BSSID;
}
Log.d(TAG, " wifiname: " + result.SSID + " frequency: "
+ result.frequency + " channelWidth: " + result.channelWidth + " rssi: " + result.level
/* + "Encryption" + result.capabilities + " mac" + result.BSSID*/);
}
}
}
Log.d(TAG, "The function exits ");
return connectedWifiMacAddress;
}
二、获取要计算的数据
1. 通过第一节的方法我们可以获取到如下信息:
SSID WiFi名称
frequency 信道
BSSID MAC地址
channelWidth 带宽。
class wifi_table {
public String name; //WiFi名称
public String mac; //mac地址
public int rssi; //信号强度
public int freq; //信道
public int bandwidth; //带宽
}
然后就可以计算各个频段的干扰了(2.4G、5.2G、5.8G)
2. 获取当前连接的信道后,将对应频段的AP信息存入数组
if (result.frequency <= 2472 && result.frequency >= 2412 && ConectedFreq <= 2472 && ConectedFreq >= 2412 ) {
j++;
ConnectBand = 2.4;
Swifilist[j-1] = new wifi_table();
Swifilist[j-1].name = result.SSID;
Swifilist[j-1].mac = result.BSSID;
Swifilist[j-1].rssi = result.level;
Swifilist[j-1].freq = result.frequency;
Swifilist[j-1].bandwidth = result.channelWidth;
} else if (result.frequency <= 5320 && result.frequency >= 5180 && ConectedFreq <= 5320 && ConectedFreq >= 5180) {
j++;
ConnectBand = 5.2;
Swifilist[j-1] = new wifi_table();
Swifilist[j-1].name = result.SSID;
Swifilist[j-1].mac = result.BSSID;
Swifilist[j-1].rssi = result.level;
Swifilist[j-1].freq = result.frequency;
Swifilist[j-1].bandwidth = result.channelWidth;
} else if (result.frequency <= 5825 && result.frequency >= 5745 && ConectedFreq <= 5825 && ConectedFreq >= 5745) {
j++;
ConnectBand = 5.8;
Swifilist[j-1] = new wifi_table();
Swifilist[j-1].name = result.SSID;
Swifilist[j-1].mac = result.BSSID;
Swifilist[j-1].rssi = result.level;
Swifilist[j-1].freq = result.frequency;
Swifilist[j-1].bandwidth = result.channelWidth;
}
三、计算公式
由于WiFi的信道非常多,这里就不贴流水账代码了,详细描述一下公式
信道的干扰计算方式为:
同频干扰 + 邻频干扰
同频干扰 = 当前信道热点干扰分数叠加
单个热点对当前信道干扰计算方式:100 + 信号强度
邻频干扰:
针对不同带宽对邻频干扰有不同的衰减
举例以6信道为中心信道的AP
信号强度 -30
对当前的信道干扰分数为 100-30=70
20M带宽
5、7信道 邻频干扰为70*0.85
4、8信道邻频干扰为70*0.7
40M带宽
3、9信道 邻频干扰为 70*0.6
2、10信道 邻频干扰为 70*0.5
上述衰减系数仅为经验值,但计算的干扰结果排名理论上是可行的
四、注意事项
1. APP获取WiFi的扫描结果需要开启定位权限,高版本的Android系统还需要用户弹窗授权,这边建议使用平台的系统签名。
2. WiFi信道需要留意,不同国家码的设置会导致系统在scan时获取的结果不一致。
3. 隐藏WiFi也会造成干扰,请不要忽略隐藏WiFi。
4. 不同芯片厂家的做法存在差异,其邻道抑制比不同,也就是说上述衰减经验值并不够精准,但大体衰减趋势没有问题。
5. 该算法仅计算当前网络环境下AP个数造成的干扰,并不能确认当前热点是否有一个或多个设备在连接并进行通信;
因此,此文提到的算法并不能完全的代表WiFi的干扰,仅是一个浅显的、粗糙的、不严谨的WiFi干扰计算。