android wifi总结

大体能够分为四个主要的类ScanResult wifiConfiguration WifiInfo WifiManager
(1)ScanResult,主要是经过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。
在咱们进行wifi 搜索的时候,通常会搜到这些信息,首先是接入点名字、接入点信息的强弱、还有接入点使用的安全模式,是WPA、WPE。
打开这个类,咱们能够看到如下几个信息
BSSID 接入点的地址,这里主要是指小范围几个无线设备相链接所获取的地址,好比说两台笔记本经过无线网卡进行链接,双方的无线网卡分配的地址。
SSID 网络的名字,当咱们搜索一个网络时,就是靠这个来区分每一个不一样的网络接入点。
Capabilities 网络接入的性能,这里主要是来判断网络的加密方式等。
Frequency 频率,每个频道交互的MHz 数。
Level 等级,主要来判断网络链接的优先数。
这里只提供了一个方法,就是将得到信息编程字符串toString()。
(2)wifiConfiguration 在咱们连通一个wifi 接入点的时候,须要获取到的一些信息。你们能够跟咱们有线的设备进行对比一下。
这里的数据相对来讲比较复杂一下。
六个子类
WifiConfiguration.AuthAlgorthm 用来判断加密方法。
WifiConfiguration.GroupCipher 获取使用GroupCipher 的方法来进行加密。
WifiConfiguration.KeyMgmt 获取使用KeyMgmt 进行。
WifiConfiguration.PairwiseCipher 获取使用WPA 方式的加密。
WifiConfiguration.Protocol 获取使用哪种协议进行加密。
wifiConfiguration.Status 获取当前网络的状态。
对于上述加密感兴趣的朋友,能够在网上搜索相关的内容。
(3)WifiInfo 在咱们的wifi 已经连通了之后,能够经过这个类得到一些已经连通的wifi 链接的信息获取当前连接的信息,这里信息就比较简单了,这里简单介绍一下这里的方法:
getBSSID() 获取BSSID
getDetailedStateOf() 获取客户端的连通性
getHiddenSSID() 得到SSID 是否被隐藏
getIpAddress() 获取IP 地址
getLinkSpeed() 得到链接的速度
getMacAddress() 得到Mac 地址
getRssi() 得到802.11n 网络的信号
getSSID() 得到SSID
getSupplicanState() 返回具体客户端状态的信息
(4)wifiManager 这个不用说,就是用来管理咱们的wifi 链接,这里已经定义好了一些类,能够供咱们使用。这里来讲相对复杂,里面的内容比较多,可是经过字面意思,咱们仍是能够得到不少相关的信息。这个类里面预先定义了许多常量,咱们能够直接使用,不用再次建立。
这里仍是简单介绍一下这里的方法:
addNetwork(WifiConfiguration config) 经过获取到的网络的连接状态信息,来添加网络
calculateSignalLevel(int rssi , int numLevels) 计算信号的等级
compareSignalLevel(int rssiA, int rssiB) 对比链接A 和链接B
createWifiLock(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) 更新一个网络链接的信息
此外wifiManaer 还提供了一个内部的子类,也就是wifiManagerLock,WifiManagerLock 的做用是这样的,在普通的状态下,若是咱们的wifi 的状态处于闲置,那么网络的连通,将会暂时中断。可是若是咱们把当前的网络状态锁上,那么wifi 连通将会保持在必定状态,固然接触锁定以后,就会恢复常态

可是关于连接加密的wifi如今尚未成功……android

 

首先附上一个工具类,有各类WIFI操做方法:编程

public class WifiAdmin { 
    // 定义WifiManager对象  
    private WifiManager mWifiManager; 
    // 定义WifiInfo对象  
    private WifiInfo mWifiInfo; 
    // 扫描出的网络链接列表  
    private List<ScanResult> mWifiList; 
    // 网络链接列表  
    private List<WifiConfiguration> mWifiConfiguration; 
    // 定义一个WifiLock  
    WifiLock mWifiLock; 
 
    // 构造器  
    public WifiAdmin(Context context) { 
        // 取得WifiManager对象  
        mWifiManager = (WifiManager) context 
                .getSystemService(Context.WIFI_SERVICE); 
        // 取得WifiInfo对象  
        mWifiInfo = mWifiManager.getConnectionInfo(); 
    } 
 
    // 打开WIFI  
    public void openWifi() { 
        if (!mWifiManager.isWifiEnabled()) { 
            mWifiManager.setWifiEnabled(true); 
        } 
    } 
 
    // 关闭WIFI  
    public void closeWifi() { 
        if (mWifiManager.isWifiEnabled()) { 
            mWifiManager.setWifiEnabled(false); 
        } 
    } 
 
    // 检查当前WIFI状态  
    public int checkState() { 
        return mWifiManager.getWifiState(); 
    } 
 
    // 锁定WifiLock  
    public void acquireWifiLock() { 
        mWifiLock.acquire(); 
    } 
 
    // 解锁WifiLock  
    public void releaseWifiLock() { 
        // 判断时候锁定  
        if (mWifiLock.isHeld()) { 
            mWifiLock.acquire(); 
        } 
    } 
 
    // 建立一个WifiLock  
    public void creatWifiLock() { 
        mWifiLock = mWifiManager.createWifiLock("Test"); 
    } 
 
    // 获得配置好的网络  
    public List<WifiConfiguration> getConfiguration() { 
        return mWifiConfiguration; 
    } 
 
    // 指定配置好的网络进行链接  
    public void connectConfiguration(int index) { 
        // 索引大于配置好的网络索引返回  
        if (index > mWifiConfiguration.size()) { 
            return; 
        } 
        // 链接配置好的指定ID的网络  
        mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, 
                true); 
    } 
 
    public void startScan() { 
        mWifiManager.startScan(); 
        // 获得扫描结果  
        mWifiList = mWifiManager.getScanResults(); 
        // 获得配置好的网络链接  
        mWifiConfiguration = mWifiManager.getConfiguredNetworks(); 
    } 
 
    // 获得网络列表  
    public List<ScanResult> getWifiList() { 
        return mWifiList; 
    } 
 
    // 查看扫描结果  
    public StringBuilder lookUpScan() { 
        StringBuilder stringBuilder = new StringBuilder(); 
        for (int i = 0; i < mWifiList.size(); i++) { 
            stringBuilder 
                    .append("Index_" + new Integer(i + 1).toString() + ":"); 
            // 将ScanResult信息转换成一个字符串包  
            // 其中把包括:BSSID、SSID、capabilities、frequency、level  
            stringBuilder.append((mWifiList.get(i)).toString()); 
            stringBuilder.append("/n"); 
        } 
        return stringBuilder; 
    } 
 
    // 获得MAC地址  
    public String getMacAddress() { 
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); 
    } 
 
    // 获得接入点的BSSID  
    public String getBSSID() { 
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); 
    } 
 
    // 获得IP地址  
    public int getIPAddress() { 
        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); 
    } 
 
    // 获得链接的ID  
    public int getNetworkId() { 
        return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); 
    } 
 
    // 获得WifiInfo的全部信息包  
    public String getWifiInfo() { 
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString(); 
    } 
 
    // 添加一个网络并链接  
 public void addNetwork(WifiConfiguration wcg) { 
        int wcgID = mWifiManager.addNetwork(wcg); 
        boolean b =  mWifiManager.enableNetwork(wcgID, true); 
        System.out.println("a--" + wcgID);
        System.out.println("b--" + b);
    } 
 
    // 断开指定ID的网络  
    public void disconnectWifi(int netId) { 
        mWifiManager.disableNetwork(netId); 
        mWifiManager.disconnect(); 
    } 
安全

而后是一个实际应用方法,只验证过没有密码的状况:网络

 
       WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) 
      { 
          WifiConfiguration config = new WifiConfiguration();   
           config.allowedAuthAlgorithms.clear(); 
           config.allowedGroupCiphers.clear(); 
           config.allowedKeyManagement.clear(); 
           config.allowedPairwiseCiphers.clear(); 
           config.allowedProtocols.clear(); 
          config.SSID = "\"" + SSID + "\"";   
          if(Type == Data.WIFICIPHER_NOPASS) 
          { 
               config.wepKeys[0] = ""; 
               config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
               config.wepTxKeyIndex = 0; 
          } 
          if(Type == Data.WIFICIPHER_WEP) 
          { 
              config.hiddenSSID = true;
              config.wepKeys[0]= "\""+Password+"\""; 
              config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 
              config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
              config.wepTxKeyIndex = 0; 
          } 
          if(Type == Data.WIFICIPHER_WPA) 
          { 
          config.preSharedKey = "\""+Password+"\""; 
          config.hiddenSSID = true;   
          config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);   
          config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                         
          config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);                         
          config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                    
          config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);                      
          config.status = WifiConfiguration.Status.ENABLED;   
          }app

           return config; 
               } 工具

  
}
性能

分为三种状况:1没有密码2用wep加密3用wpa加密测试

 

 

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
boolean bRet1 = wifiManager.setWifiEnabled(true);
//add network
if (wifiManager.startScan()) //扫描可用的无线网络
{
List scanResultList = wifiManager.getScanResults();
for (int i = 0; i < scanResultList.size(); i++)
{
ScanResult scanRet = scanResultList.get(i);
if (scanRet.SSID.equalsIgnoreCase("TEST")) //找到 TEST
{
WifiConfiguration config = new WifiConfiguration();
config.SSID = "\"" + scanRet.SSID + "\"";
config.preSharedKey = "\"password\""; //指定密码
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.status = WifiConfiguration.Status.ENABLED;
int netID = wifiManager.addNetwork(config);
boolean bRet = wifiManager.enableNetwork(netID, true);
}
}
}
 

<!-- 如下是使用wifi访问网络所须要的权限-->ui


android.permission.CHANGE_NETWORK_STATE //修改网络状态的权限加密


android.permission.CHANGE_WIFI_STATE //修改wifi状态的权限


android.permission.ACCESS_NETWORK_STATE //访问网络权限

android.permission.ACCESS_WIFI_STATE //访问wifi权

相关文章
相关标签/搜索