android中wifi属性的介绍以及连接到指定的wifi

     今天公司的一个项目中的某一个功能正好需要切换wifi热点的连接,所有顺带记录一下

   代码:http://download.csdn.net/detail/zhudonggangg/9803438

wifi模块简介

android本身已经提供了包来处理Android环境下对Wifi的操作,位置是android.net.wifi下面。调用wifi操作需要在mainfest中添加对应权限。

 

主要功能类

官方提供的大致可以分为四个主要的类:WifiManager,ScanResult,WifiConfiguration,WifiInfo,此外还有WifiLock,MulticastLock等

 

WifiManager

提供wifi管理的各种主要API,主要包含wifi的扫描,建立连接,配置等

(要操作 WIFI 设备,需要先获取  Context.getSystemService(Context.WIFI_SERVICE)获取WifiManager 对象,并通过这个对象来管理WIFI设备。 )


addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。
calculateSignalLevel(int rssi , int numLevels) 计算信号的等级
compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度
createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接
disableNetwork(int netId) 让一个网络连接失效
disconnect() 断开当前的WIFI连接
enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用
getConfiguredNetworks() 获取网络连接的状态
getConnectionInfo() 获取当前连接的信息
getDhcpInfo() 获取DHCP 的信息
getScanResulats() 获取扫描测试的结果
getWifiState() 获取当前WIFI设备的状态
isWifiEnabled() 判断WIFI设备是否打开
pingSupplicant() ping操作,和PCping操作相同作用
ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的
reconnect() 重新连接一个未连接上的WIFI网络
removeNetwork() 移除某一个网络
saveConfiguration() 保留一个配置信息
setWifiEnabled() 让一个连接有效
startScan() 开始扫描
updateNetwork(WifiConfiguration config) 更新一个网络连接


ScanResult

描述开启扫描后的Wifi热点的信息。包含SSID、Capabilities、frequency、level(信号强度)等。

ListscanResults=mWifiManager.getScanResults();//搜索到的设备列表s
tv01.setText("");
for (ScanResult scanResult:scanResults){
    //设备名称是这wifi热点的名字
    tv01.append("\n设备名称:"+scanResult.SSID+"\nBSSID接入点的地址:"+scanResult.BSSID+"\n网络接入的性能:"+scanResult.capabilities+"\n热点的频率(MHz)"+scanResult.frequency+"\n信号强度:"+scanResult.level+"\n计算信号的等级 :"+mWifiManager.calculateSignalLevel(scanResult.level,10)+"\n"+"\n");
}
android中wifi属性的介绍以及连接到指定的wifi_第1张图片


WifiInfo

     描述 已建立连接后的wifi信息。包含ip、mac地址、连接速度等信息。区别与ScanResult的概念

    WifiInfo 是专门用来表示连接的对象,这个对象可以通过 WifiManager.getConnectionInfo() 来获取。
    WifiInfo中包含了当前连接中的相关信息。
 getBSSID() 获取BSSID属性
 getDetailedStateOf() 获取客户端的连通性
 getHiddenSSID() 获取SSID 是否被隐藏
 getIpAddress() 获取IP 地址
 getLinkSpeed() 获取连接的速度
 getMacAddress() 获取Mac 地址
 getRssi() 获取802.11n 网络的信号
 getSSID() 获取SSID
 getSupplicanState() 获取具体客户端状态的信息

//    返回返回当前连接的wifi的相关信息
    private void getConnectionInfoss(){
//        WifiInfo mWifiInfo=mWifiManager.getConnectionInfo();
        String ipText = intToIp(mWifiInfo.getIpAddress());//mWifiInfo.getIpAddress()这个得到的是十进位的数字,需要转化成192.168.xxx.xx的形式
        int networkID = mWifiInfo.getNetworkId();
        tv01.setText("");
        tv01.append("\n获取BSSID属性:"+mWifiInfo.getBSSID()+"\n 获取IP 地址 :"+ipText +"\n设备名称:"+mWifiInfo.getSSID()
        +"\nnetworkID  "+networkID+"\n获取Mac 地址:"+mWifiInfo.getMacAddress());


    }

private String intToIp(int ip){
// java将IP地址转换为数字以及逆向转换(位运算和0xFF的使用)
    return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF);
}

WifiConfiguration

描述wifi的连接信息,包含SSID、SSID隐藏、Password等的设置。

   //
这个方法可以连接到指定的wifi,Type=3已经测试过了,可以使用

  public 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 + "\"";
        WifiConfiguration tempConfig = this.IsExsits(SSID);
        if(tempConfig != null) {
            mWifiManager.removeNetwork(tempConfig.networkId);
        }

        if(Type == 1) //WIFICIPHER_NOPASS 没有密码的情况
        {
            config.wepKeys[0] = "";
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            config.wepTxKeyIndex = 0;
        }
        if(Type == 2) //WIFICIPHER_WEP 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 == 3) //WIFICIPHER_WPA 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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
        }
        return config;
    }

//这个方法的作用在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序,
//列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始
//配置wifi网络之前将其移除,以避免ssid的重复:
    private WifiConfiguration IsExsits(String SSID)
    {
        List existingConfigs = mWifiManager.getConfiguredNetworks();
        for (WifiConfiguration existingConfig : existingConfigs)
        {
            if (existingConfig.SSID.equals("\""+SSID+"\""))
            {
                return existingConfig;
            }
        }
        return null;
    }

网络权限


     android:name="android.permission.CHANGE_NETWORK_STATE"/>
     android:name="android.permission.CHANGE_WIFI_STATE" />
     android:name="android.permission.ACCESS_NETWORK_STATE" />
     android:name="android.permission.ACCESS_WIFI_STATE" />

常用功能代码

获取WifiManager

WifiManager wm = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);

设置wifi功能开启

bRet = wifiManager.isWifiEnabled();//判断是否开启

bRet = wifiManager.setWifiEnabled(true);//设置开启关闭

注意,调用setWifiEnabled后,系统进行wifi模块的开启需要一定时间,此时通过wifiManager.getWifiState()获取的状态来判断是否完成。

 

WifiManager.WIFI_STATE_DISABLED : WIFI网卡不可用(1)

WifiManager.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)

WifiManager.WIFI_STATE_ENABLED : WIFI网卡可用(3)

WifiManager.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)

WifiManager.WIFI_STATE_UNKNOWN  : 未知网卡状态

 

while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {    
  try {    
            Thread.currentThread();
           Thread.sleep(100); } 
             catch (InterruptedException ie) {    }   }

获取手机中保存过配置的连接信息

List existingConfigs = wifiManager.getConfiguredNetworks();//获取保存的配置信息

判断某ssid的AP是否有保存过配置信息

for (WifiConfiguration existingConfig : existingConfigs) {       
  if (existingConfig.SSID.equals("/"" + SSID + "/"")) {                  
      return existingConfig;        
 }}

关闭Wifi连接

wifiManager.disableNetwork(existingConfig.networkId);

移除Wifi连接配置

wifiManager.removeNetwork(networkId);
















你可能感兴趣的:(android项目知识点)