android中的WIFI开发

来源:互联网 发布:windows日志怎么看sql 编辑:程序博客网 时间:2024/05/21 14:07

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

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

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


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

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

WifiManager wifiManager =(WifiManager)SetWifi.this.getSystemService(Context.WIFI_SERVICE);
然后就能获取WIFI热点的对象的链表了。。。
List<ScanResult> list = wifiManager.getScanResults();
很简单吧。。。。最后
scanResult.SSID;//这个是热点的SSIDscanResult.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 blocke.printStackTrace();}};
上面是连接到WIFI热点的“润滑剂”,如果连接到WIFI之后要执行网络的操作的话,这个是必须要等待的

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


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







0 0
原创粉丝点击