您的位置:首页 > 移动开发 > Android开发

android连接wifi相关知识

2015-08-26 21:12 633 查看
这里列了很多,但是大致可以分为四个主要的类ScanResultwifiConfigurationWifiInfoWifiManager

(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(WifiConfigurationconfig)通过获取到的网络的链接状态信息,来添加网络

calculateSignalLevel(intrssi,intnumLevels)计算信号的等级

compareSignalLevel(intrssiA,intrssiB)对比连接A和连接B

createWifiLock(intlockType,Stringtag)创建一个wifi锁,锁定当前的wifi连接

disableNetwork(intnetId)让一个网络连接失效

disconnect()断开连接

enableNetwork(intnetId,BooleandisableOthers)连接一个连接

getConfiguredNetworks()获取网络连接的状态

getConnectionInfo()获取当前连接的信息

getDhcpInfo()获取DHCP的信息

getScanResulats()获取扫描测试的结果

getWifiState()获取一个wifi接入点是否有效

isWifiEnabled()判断一个wifi连接是否有效

pingSupplicant()ping一个连接,判断是否能连通

ressociate()即便连接没有准备好,也要连通

reconnect()如果连接准备好了,连通

removeNetwork()移除某一个网络

saveConfiguration()保留一个配置信息

setWifiEnabled()让一个连接有效

startScan()开始扫描

updateNetwork(WifiConfigurationconfig)更新一个网络连接的信息

此外wifiManaer还提供了一个内部的子类,也就是wifiManagerLock,WifiManagerLock的作用是这样的,在普通的状态下,如果我们的wifi的状态处于闲置,那么网络的连通,将会暂时中断。但是如果我们把当前的网络状态锁上,那么wifi连通将会保持在一定状态,当然接触锁定之后,就会恢复常态

但是关于链接加密的wifi现在还没有成功……

首先附上一个工具类,有各种WIFI操作方法:

publicclassWifiAdmin{

//定义WifiManager对象

privateWifiManagermWifiManager;

//定义WifiInfo对象

privateWifiInfomWifiInfo;

//扫描出的网络连接列表

privateList<ScanResult>mWifiList;

//网络连接列表

privateList<WifiConfiguration>mWifiConfiguration;

//定义一个WifiLock

WifiLockmWifiLock;

//构造器

publicWifiAdmin(Contextcontext){

//取得WifiManager对象

mWifiManager=(WifiManager)context

.getSystemService(Context.WIFI_SERVICE);

//取得WifiInfo对象

mWifiInfo=mWifiManager.getConnectionInfo();

}

//打开WIFI

publicvoidopenWifi(){

if(!mWifiManager.isWifiEnabled()){

mWifiManager.setWifiEnabled(true);

}

}

//关闭WIFI

publicvoidcloseWifi(){

if(mWifiManager.isWifiEnabled()){

mWifiManager.setWifiEnabled(false);

}

}

//检查当前WIFI状态

publicintcheckState(){

returnmWifiManager.getWifiState();

}

//锁定WifiLock

publicvoidacquireWifiLock(){

mWifiLock.acquire();

}

//解锁WifiLock

publicvoidreleaseWifiLock(){

//判断时候锁定

if(mWifiLock.isHeld()){

mWifiLock.acquire();

}

}

//创建一个WifiLock

publicvoidcreatWifiLock(){

mWifiLock=mWifiManager.createWifiLock("Test");

}

//得到配置好的网络

publicList<WifiConfiguration>getConfiguration(){

returnmWifiConfiguration;

}

//指定配置好的网络进行连接

publicvoidconnectConfiguration(intindex){

//索引大于配置好的网络索引返回

if(index>mWifiConfiguration.size()){

return;

}

//连接配置好的指定ID的网络

mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,

true);

}

publicvoidstartScan(){

mWifiManager.startScan();

//得到扫描结果

mWifiList=mWifiManager.getScanResults();

//得到配置好的网络连接

mWifiConfiguration=mWifiManager.getConfiguredNetworks();

}

//得到网络列表

publicList<ScanResult>getWifiList(){

returnmWifiList;

}

//查看扫描结果

publicStringBuilderlookUpScan(){

StringBuilderstringBuilder=newStringBuilder();

for(inti=0;i<mWifiList.size();i++){

stringBuilder

.append("Index_"+newInteger(i+1).toString()
+":");

//将ScanResult信息转换成一个字符串包

//其中把包括:BSSID、SSID、capabilities、frequency、level

stringBuilder.append((mWifiList.get(i)).toString());

stringBuilder.append("/n");

}

returnstringBuilder;

}

//得到MAC地址

publicStringgetMacAddress(){

return(mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();

}

//得到接入点的BSSID

publicStringgetBSSID(){

return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();

}

//得到IP地址

publicintgetIPAddress(){

return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();

}

//得到连接的ID

publicintgetNetworkId(){

return(mWifiInfo==null)?0:mWifiInfo.getNetworkId();

}

//得到WifiInfo的所有信息包

publicStringgetWifiInfo(){

return(mWifiInfo==null)?"NULL":mWifiInfo.toString();

}

//添加一个网络并连接

publicvoidaddNetwork(WifiConfigurationwcg){

intwcgID=mWifiManager.addNetwork(wcg);

booleanb=mWifiManager.enableNetwork(wcgID,true);

System.out.println("a--"+wcgID);

System.out.println("b--"+b);

}

//断开指定ID的网络

publicvoiddisconnectWifi(intnetId){

mWifiManager.disableNetwork(netId);

mWifiManager.disconnect();

}

}

然后是一个实际应用方法,只验证过没有密码的情况:

WifiConfigurationCreateWifiInfo(StringSSID,StringPassword,intType)

{

WifiConfigurationconfig=newWifiConfiguration();

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;

}

returnconfig;

}

}

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

WifiManagerwifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);

booleanbRet1=wifiManager.setWifiEnabled(true);

//addnetwork

if(wifiManager.startScan())//扫描可用的无线网络

{

ListscanResultList=wifiManager.getScanResults();

for(inti=0;i<scanResultList.size();i++)

{

ScanResultscanRet=scanResultList.get(i);

if(scanRet.SSID.equalsIgnoreCase("TEST"))//找到TEST

{

WifiConfigurationconfig=newWifiConfiguration();

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;

intnetID=wifiManager.addNetwork(config);

booleanbRet=wifiManager.enableNetwork(netID,true);

}

}

}



<!--以下是使用wifi访问网络所需要的权限-->

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

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

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

android.permission.ACCESS_WIFI_STATE//访问wifi权
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: