android中的WIFI开发

最近上班,写了一个很长很长的WIFI模块设置模块,就像是所有系统都自带的WIFI设置模块一样(难道又做无用功?)。。。

关于参考:参考了很多的大神的WIFI编程,但是基本都是转发的别人的(转了又转。。。转了又转),所以我就不注明哪里看的了,应为我也不知道谁是原创。

之所以别人都有,为什么还做这篇笔记呢。。。关键是大神们都是挑自己认为是重点的写。。。所以。。。找的我好辛苦啊。。。


切入主题,WiFi设置模块,首先我们打开以后,当然会搜索到附近的热点了。。。如何得到呢?

首先我们要先获取wifiManager对象。。。获取方式如下

WifiManager wifiManager =(WifiManager)SetWifi.this.getSystemService(Context.WIFI_SERVICE);
然后就能获取WIFI热点的对象的链表了。。。
List<ScanResult> list = wifiManager.getScanResults();
很简单吧。。。。最后
scanResult.SSID;//这个是热点的SSID
scanResult.level;//这个是热点的信号强度

最后你用你想要的方式把这些WIFI热点表现出来就好了。。。


接下来该链接这些热点了

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.allowedGroupCiphers.clear();
		config.allowedPairwiseCiphers.clear();
		config.SSID = "\"" + SSID + "\"";
		if (Type == WIFICIPHER_NOPASS) {
			config.wepKeys[0] = "";
			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
			config.wepTxKeyIndex = 0;
		}
		if (Type == 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 == WIFICIPHER_WPA) {
			Log.v("my_tag", "开始配置WPA热点");
			config.preSharedKey = "\"" + Password + "\"";
			config.hiddenSSID = true;
			config.status = WifiConfiguration.Status.ENABLED;
			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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
			config.allowedPairwiseCiphers
					.set(WifiConfiguration.PairwiseCipher.CCMP);
			config.allowedPairwiseCiphers
					.set(WifiConfiguration.PairwiseCipher.TKIP);
			config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
			config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

		}
		return config;
	}
这是一个初始化WifiConfiguration的接口,你把SSID,密码,还有该热点的加密类型传进来就OK了,这里抱歉下 只有WPA加密方式和没有密码的通过了验证。。。(我参考的都是只有无密码验证过哦,WEP我附近没有这样的热点。。。还有TYPE的宏是自己定义的哦) 

接下来就连接这个WIFI热点

wifiManager.addNetwork(wifiConfiguration);
记得连接到WIFI热点以后要上WIFI锁,什么是WIFI锁自己度娘吧

/**创建一个WIFILOCK*/
	public void createWifiLock (){
		mywifiLock = myWifiManager.createWifiLock("bohua");
	}
	
	/**锁定一个WIFILOCK*/
	public void acquireWifiLock (){
		mywifiLock.acquire();
	}
	
	/**解锁一个wifilock,这个要在断开连接时调用*/
	public void releaseWifiLock()
	{
		if(mywifiLock != null){
		if(mywifiLock.isHeld()){
			mywifiLock.acquire();
		}}
	}
那我们该怎么断开连接呢?

public int getNetworkId(){
		return (myWifiInfo == null ) ? 0 : myWifiInfo.getNetworkId();
	}

int id = getNetworkId();
wifiManager.disableNetwork(id);
wifiManager.disconnect();

...这样,我们就能看到周围的热点,连接它,然后再断开它。


然后我们就再想想WIFI设置还有什么其他的功能?

首先人家能打开和关闭WIFI模块。

/*用于打开WIFI*/
	public void openWifi(){
		if(!wifiManager.isWifiEnabled() && 
				wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLING)
		{
			wifiManager.setWifiEnabled(true);
		}
	}
	/*关闭WIFI*/
	public void closeWifi(){
		if(wifiManager.isWifiEnabled() &&
				wifiManager.getWifiState() != WifiManager.WIFI_STATE_DISABLING)
		{
<span style="white-space:pre">			</span>//如果加了WIFI锁记得解锁哦
			wifiManager.setWifiEnabled(false);
			
		}
	}


然后人家能自动连接。。。

这个我们实现的方法是把热点信息储存到SharedPreferences?文件?数据库?,然后。。。检测?。。。连接?

最后人家能有各种连接的信息。。。。

WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int id = wifiInfo.getNetworkId();
		String BSSID = wifiInfo.getBSSID();
		boolean ifSSIDHidden = wifiInfo.getHiddenSSID();//判断SSID是否被隐藏
		int ipaddress = wifiInfo.getIpAddress();
		int linkspeed = wifiInfo.getLinkSpeed();
		String macaddr  = wifiInfo.getMacAddress();
		int rssi = wifiInfo.getRssi();
		String ssidhehe = wifiInfo.getSSID();

这样就获得了这些连接的数据,至于这些数据怎么用。。。别人有写。。。不多赘述。。。

        但是这样写出了代码真的好用吗。。。其实就不能用。。。在写这些代码的时候有些需要注意的地方。。。再这先写出来。。。因为我是新手所以有什么更犀利的做法请大神指出。。。。

android.net.NetworkInfo.State state;//表示当前WIFI网络的连接状态
state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
while(state != android.net.NetworkInfo.State.CONNECTED){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}		
			};
上面是连接到WIFI热点的“润滑剂”,如果连接到WIFI之后要执行网络的操作的话,这个是必须要等待的

while (wifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLED)
						;
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e2) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
上面则是对WIFI模块的检测。。。。他有5个状态 。。 不一一赘述了。。。


加上上面这些就可以用了。。。。但是如何写的好久请大神指点了







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值