android4.0上打開wifi後,自動掃描附近全部的wifi熱點,鏈接指定的wifi名稱和密碼,DHCP動態獲取IP後,最後使用Ping命令對連網進行測試。 java
監聽WifiManager.WIFI_STATE_CHANGED_ACTION消息,並實時處理wifi狀態的變化。 android
wifi的消息一共有五種: 網絡
WifiManager.WIFI_STATE_DISABLED: //wifi不可用 app
WifiManager.WIFI_STATE_DISABLING://wifi 正在關閉或者斷開 ide
WifiManager.WIFI_STATE_ENABLED://wifi可用 工具
WifiManager.WIFI_STATE_ENABLING://wifi正在打開或者鏈接 測試
WifiManager.WIFI_STATE_UNKNOWN://未知消息 ui
僅在wifi狀態爲WIFI_STATE_ENABLED的時候,才表示wifi已經鏈接成功。所以咱們在此能夠進行連通測試,若想成功獲取ip,最好等待3s再去獲取ip信息。在測試過程當中,發現wifi連網成功後,立馬去進行ping命令測試的話,其實際的ip信息尚未來得及設置。 this
private void registerWIFI() { IntentFilter mWifiFilter = new IntentFilter(); mWifiFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); registerReceiver(mWifiConnectReceiver, mWifiFilter); } private BroadcastReceiver mWifiConnectReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Wifi onReceive action = " + intent.getAction()); if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { int message = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1); Log.d(TAG, "liusl wifi onReceive msg=" + message); switch (message) { case WifiManager.WIFI_STATE_DISABLED: Log.d(TAG, "WIFI_STATE_DISABLED"); break; case WifiManager.WIFI_STATE_DISABLING: Log.d(TAG, "WIFI_STATE_DISABLING"); break; case WifiManager.WIFI_STATE_ENABLED: Log.d(TAG, "WIFI_STATE_ENABLED"); threadSleep(10000); pingWifiGateway(EthUtils.getWifiGateWay()); break; case WifiManager.WIFI_STATE_ENABLING: Log.d(TAG, "WIFI_STATE_ENABLING"); break; case WifiManager.WIFI_STATE_UNKNOWN: Log.d(TAG, "WIFI_STATE_UNKNOWN"); break; default: break; } } } };
提供打開wifi,關閉wifi,掃描WIFI熱點,鏈接wifi熱點,獲取IP信息,以及一些wifi熱點信息的獲取。 加密
import java.util.List; import android.content.Context; import android.net.DhcpInfo; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.WifiLock; import android.util.Log; public class WifiAdmin { private static final String TAG = "[WifiAdmin]"; private WifiManager mWifiManager; private WifiInfo mWifiInfo; private List<ScanResult> mWifiList = null; private List<WifiConfiguration> mWifiConfiguration; private WifiLock mWifiLock; private DhcpInfo dhcpInfo; public WifiAdmin(Context context) { mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mWifiInfo = mWifiManager.getConnectionInfo(); } public boolean openWifi() {//打開wifi if (!mWifiManager.isWifiEnabled()) { Log.i(TAG, "setWifiEnabled....."); mWifiManager.setWifiEnabled(true); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.i(TAG, "setWifiEnabled.....end"); } return mWifiManager.isWifiEnabled(); } public void closeWifi() { if (mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(false); } } public int checkState() { return mWifiManager.getWifiState(); } public void acquireWifiLock() {//鎖定wifiLock mWifiLock.acquire(); } public void releaseWifiLock() {//解鎖wifiLock if (mWifiLock.isHeld()) { mWifiLock.acquire(); } } public void creatWifiLock() { mWifiLock = mWifiManager.createWifiLock("Test"); } public List<WifiConfiguration> getConfiguration() { return mWifiConfiguration; } public void connectConfiguration(int index) {//指定配置好的網絡進行鏈接 if (index > mWifiConfiguration.size()) { return; } mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true); } public void startScan() {//wifi掃描 boolean scan = mWifiManager.startScan(); Log.i(TAG, "startScan result:" + scan); mWifiList = mWifiManager.getScanResults(); mWifiConfiguration = mWifiManager.getConfiguredNetworks(); if (mWifiList != null) { Log.i(TAG, "startScan result:" + mWifiList.size()); for (int i = 0; i < mWifiList.size(); i++) { ScanResult result = mWifiList.get(i); Log.i(TAG, "startScan result[" + i + "]" + result.SSID + "," + result.BSSID); } Log.i(TAG, "startScan result end."); } else { Log.i(TAG, "startScan result is null."); } } 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() + ":"); stringBuilder.append((mWifiList.get(i)).toString()); stringBuilder.append("/n"); } return stringBuilder; } public String getMacAddress() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); } public String getBSSID() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); } public DhcpInfo getDhcpInfo() { return dhcpInfo = mWifiManager.getDhcpInfo(); } public int getIPAddress() { return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); } public int getNetworkId() { return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); } public WifiInfo getWifiInfo() { mWifiInfo = mWifiManager.getConnectionInfo(); return mWifiInfo; } public void addNetwork(WifiConfiguration wcg) { // 添加一個網絡配置並鏈接 int wcgID = mWifiManager.addNetwork(wcg); boolean b = mWifiManager.enableNetwork(wcgID, true); System.out.println("addNetwork--" + wcgID); System.out.println("enableNetwork--" + b); } public void disconnectWifi(int netId) { mWifiManager.disableNetwork(netId); mWifiManager.disconnect(); } public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { Log.i(TAG, "SSID:" + SSID + ",password:" + Password); 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); } else { Log.i(TAG, "IsExsits is null."); } if (Type == 1) // WIFICIPHER_NOPASS { Log.i(TAG, "Type =1."); config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } if (Type == 2) // WIFICIPHER_WEP { Log.i(TAG, "Type =2."); 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 { Log.i(TAG, "Type =3."); 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; } private WifiConfiguration IsExsits(String SSID) { // 查看之前是否已經配置過該SSID List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { return existingConfig; } } return null; } }
wifi打開後,能夠經過WifiManager進行wifi熱點的掃描。
EthernetManager mEthManager = null; WifiManager mWifiManager = null; connectivityManager mConnectivityManager = null; WifiAdmin wifiAdmin = null; mEthManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); wifiAdmin = new WifiAdmin(context); mEthManager.setEthernetEnabled(false); boolean open = wifiAdmin.openWifi(); Log.i(TAG, "wifi open:" + open); wifiAdmin.startScan(); connectWifi();
TP-LINK_liusl,密碼爲:liusl2222
WIFI的鏈接類型分爲:
1.沒有密碼:WIFICIPHER_NOPASS
2.用wep加密:WIFICIPHER_WEP
3.用wpa加密:WIFICIPHER_WPA
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(「TP-LINK_liusl」, "liusl2222", 3));
public static String getWifiGateWay() { DhcpInfo dhcpInfo = wifiAdmin.getDhcpInfo(); Log.v(" wifi ipAddress", Formatter.formatIpAddress(dhcpInfo.ipAddress) + ""); Log.v("wifi gateway", Formatter.formatIpAddress(dhcpInfo.gateway) + ""); Log.v("wifi dns1", Formatter.formatIpAddress(dhcpInfo.dns1) + ""); Log.v("wifi dns2", Formatter.formatIpAddress(dhcpInfo.dns2) + ""); wifi_gateway = Formatter.formatIpAddress(dhcpInfo.gateway); return wifi_gateway; }
使用Root權限,經過JNI封裝成一個系統庫,調用exe command進行ping -c 4 -w 100 192.168.1.1測試。代碼將不詳細貼出。
執行結果:
I/SystemTestingJNI( 1836): executeCommand ret=0, result=PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=6.54 ms
I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.316 ms
I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.194 ms
I/SystemTestingJNI( 1836): 64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.255 ms
I/SystemTestingJNI( 1836):
I/SystemTestingJNI( 1836): --- 192.168.1.1 ping statistics ---
I/SystemTestingJNI( 1836): 4 packets transmitted, 4 received, 0% packet loss, time 3001ms
I/SystemTestingJNI( 1836): rtt min/avg/max/mdev = 0.194/1.826/6.542/2.723 ms
--還有一種方法,使用Runtime去ping,可是須要注意權限問題,以及輸入輸出流得本身處理。 exec執行時阻塞、非阻塞,返回結果問題
Process p= Runtime.getRuntime().exec(cmd);//String cmd
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />