关于Android如何获取WiFi列表信息,并计算WiFi干扰程度

目录

前言 #一个测量网络环境的APP demo#

一、如何获取WiFi扫描结果

二、获取要计算的数据

三、计算公式

四、注意事项


一、如何获取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干扰计算。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值