Android掌控WiFi不完全指南

前言如果想要对针对WiFi的攻击进行监测,就需要定期获取WiFi的运行状态,例如WiFi的SSID,WiFi强度 , 是否开放,加密方式等信息,在Android中通过WiFiManager来实现
WiFiManager简介WiFiManager这个类是Android暴露给开发者使用的一个系统服务管理类,其中包含对WiFi响应的操作函数;其隐藏掉的系统服务类为IWifiService,这个类是google私有的,属于系统安全级别的API类我们需要通过WifiManager进行函数操作完成UI , 监听对应的广播消息,从而实现获取WiFi信息的功能
内置方法方法含义addNetwork(WifiConfiguration config)通过获取到的网络的链接状态信息,来加入网络calculateSignalLevel(int rssi , int numLevels)计算信号的等级compareSignalLevel(int rssiA, int rssiB)对照连接A 和连接BcreateWifiLock(int lockType, String tag)创建一个wifi 锁,锁定当前的wifi 连接disableNetwork(int netId)让一个网络连接失效disconnect()断开连接enableNetwork(int netId, Boolean disableOthers)连接一个连接getConfiguredNetworks()获取网络连接的状态getConnectionInfo()获取当前连接的信息getDhcpInfo()获取DHCP 的信息getScanResulats()获取扫描測试的结果getWifiState()获取一个wifi 接入点是否有效isWifiEnabled()推断一个wifi 连接是否有效pingSupplicant()ping 一个连接 。推断能否连通ressociate()即便连接没有准备好,也要连通reconnect()假设连接准备好了 , 连通removeNetwork()移除某一个网络saveConfiguration()保留一个配置信息setWifiEnabled()让一个连接有效startScan()开始扫描updateNetwork(WifiConfiguration config)更新一个网络连接的信息其他常用基类ScanResult通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息
字段含义BSSID接入点的地址,这里主要是指小范围几个无线设备相连接所获取的地址,比如说两台笔记本通过无线网卡进行连接 , 双方的无线网卡分配的地址SSID网络的名字,当我们搜索一个网络时,就是靠这个来区分每个不同的网络接入点Capabilities网络接入的性能,这里主要是来判断网络的加密方式等Frequency频率,每一个频道交互的MHz 数Level等级 , 主要来判断网络连接的优先数 。WifiInfoWiFi连接成功后,可通过WifiInfo类获取WiFi的一些具体信息
方法含义getBSSID()获取BSSIDgetDetailedStateOf()获取client的连通性getHiddenSSID()获得SSID 是否被隐藏getIpAddress()获取IP 地址getLinkSpeed()获得连接的速度getMacAddress()获得Mac 地址getRssi()获得802.11n 网络的信号getSSID()获得SSIDgetSupplicanState() 返回详细client状态的信息wifiConfigurationWiFi的配置信息
类名含义WifiConfiguration.AuthAlgorthm用来判断加密方法WifiConfiguration.GroupCipher获取使用GroupCipher 的方法来进行加密WifiConfiguration.KeyMgmt获取使用KeyMgmt 进行WifiConfiguration.PairwiseCipher获取使用WPA 方式的加密WifiConfiguration.Protocol获取使用哪一种协议进行加密wifiConfiguration.Status获取当前网络的状态权限app AndroidManifest.xml 申请权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

【Android掌控WiFi不完全指南】Android 6.0版本中如果未开启GPS是无法获取到扫描列表的,需要动态申请ACCESS_COARSE_LOCATION
// 检测项目是否被赋予定位权限public void checkPermissions(Context context){if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){//未开启定位权限//开启定位权限,200是标识码ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},200);}}在运行之前调用该函数进行申请即可
牛刀小试WiFi状态分类
  • 网卡正在关闭 WIFI_STATE_DISABLING WIFI ( 状态码:0 )
  • 网卡不可用 WIFI_STATE_DISABLED WIFI ( 状态码:1 )
  • 网卡正在打开 WIFI_STATE_ENABLING WIFI ( 状态码:2 )
  • 网卡可用 WIFI_STATE_ENABLED WIFI ( 状态码:3 )
  • 网卡状态不可知 WIFI_STATE_UNKNOWN WIFI ( 状态码:4 )
代码中获取WIFI的状态
// 获取 WIFI 的状态.public static int getWifiState(WifiManager manager) {return manager == null ? WifiManager.WIFI_STATE_UNKNOWN : manager.getWifiState();}获取WiFiManager实例// 获取 WifiManager 实例.public static WifiManager getWifiManager(Context context) {return context == null ? null : (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);}

推荐阅读