package com.zznode.walktest.utils; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import com.zznode.walktest.AppConstant; import com.zznode.walktest.Entity.WifiListEntity; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Author by ckl, Email xx@xx.com, Date on 2020/7/8. * PS: Not easy to write code, please indicate. */ public class WifiUtil { private static WifiUtil instance = null; private final WifiManager mWifiManager; private Context mContext; private WifiUtil(Context context) { this.mContext = context; mWifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); } public static WifiUtil getInstance(Context context){ if (instance == null){ synchronized (WifiUtil.class){ if (instance == null){ instance = new WifiUtil(context); } } } return instance; } /** * 判断wifi是否可用 * @param * @return */ public boolean isWiFiActive() { Context context = mContext.getApplicationContext(); ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getTypeName().equals("WIFI") && info[i].isConnected()) { return true; } } } } return false; } /** * 获取当前连接WIFI的SSID */ public String getSSID() { assert mWifiManager != null; WifiInfo info = mWifiManager.getConnectionInfo(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return info.getSSID(); } else { return info.getSSID().replace("\"", ""); } } /** * 获取当前连接WIFI的Rssi */ public int getRssi() { assert mWifiManager != null; WifiInfo info = mWifiManager.getConnectionInfo(); return info.getRssi(); } /** * 获取连接速度 info.LINK_SPEED_UNITS 单位Mbps */ public int getLinkSpeed(){ assert mWifiManager != null; WifiInfo info = mWifiManager.getConnectionInfo(); return info.getLinkSpeed(); } /** * 获取wifi列表 */ public List<WifiListEntity> getWifiList(){ List<ScanResult> scanResult = mWifiManager.getScanResults(); /** * wifi列表 */ List<WifiListEntity> wifiList = new ArrayList<>(); Iterator localIterator = scanResult.iterator(); while (localIterator.hasNext()) { ScanResult sr = (ScanResult)localIterator.next(); WifiListEntity we = new WifiListEntity(); /*if(isHaveScanResult){*/ we.setScanResult(sr); /*}*/ we.setBssid(sr.BSSID); we.setSsid(sr.SSID); we.setCapabilities(sr.capabilities); we.setFrequency(sr.frequency); we.setLevel(sr.level); // 用传入的freq值进行判断,若在2400~2500之间,不含边界为24GHz //5GHz(frequency),即用自己的信道频率值进行判断,如果频率值在4900~5900之间 if(sr.frequency>4900 &&sr.frequency<5900){ we.setBand(AppConstant.CHANNEL_5G); } else if(sr.frequency>2400 &&sr.frequency<2500){ we.setBand(AppConstant.CHANNEL_24G); } else{ we.setBand(AppConstant.CHANNEL_5G); } we.setChannel(getChannel(sr.frequency)); wifiList.add(we); } wifiList=WifiListEntity.sortSiganal(wifiList,1); return wifiList; } /** * 同频,信道相同(且信号高于-75dBm,不包括当前wifi) * @param * @param * @return */ public int getCalSameFrequencyInterference(){ assert mWifiManager != null; WifiInfo info = mWifiManager.getConnectionInfo(); int localSfi=0; int channel = getChannel(info.getFrequency()); List<WifiListEntity> wifiList = getWifiList(); for( WifiListEntity we :wifiList){ if(channel==we.getChannel() && we.getLevel() >= -55 && !we.isCurNetwork()){ localSfi++; } } return localSfi; } /** * 邻频 前后2个频率的信道(且信号高于-75dBm) * @param * @param * @return */ public int getCalNearbyFrequencyInterference() { assert mWifiManager != null; WifiInfo info = mWifiManager.getConnectionInfo(); int localSfi=0; int channel = getChannel(info.getFrequency()); List<WifiListEntity> wifiList = getWifiList(); for( WifiListEntity we :wifiList){ if((channel==we.getChannel()-1 || channel==we.getChannel()-2 || channel==we.getChannel()+1 || channel==we.getChannel()+2) && we.getLevel() >= -55){ localSfi++; } } return localSfi; } /** * 根据频率获取信道 * @param paramInt * @return */ public static int getChannel(int paramInt) { if (paramInt > 10000) { paramInt /= 10000; } switch (paramInt) { default: return 0; case 2412: return 1; case 2417: return 2; case 2422: return 3; case 2427: return 4; case 2432: return 5; case 2437: return 6; case 2442: return 7; case 2447: return 8; case 2452: return 9; case 2457: return 10; case 2462: return 11; case 2467: return 12; case 2472: return 13; case 2484: return 14; case 5745: return 149; case 5765: return 153; case 5785: return 157; case 5805: return 161; case 5825: return 165; case 5180: return 36; case 5200: return 40; case 5220: return 44; case 5240: return 48; case 5260: return 52; case 5280: return 56; case 5300: return 60; case 5320: return 64; case 5500: return 100; case 5520: return 104; } } }