android4.0 WIFI實現網絡連接

jopen 11年前發布 | 97K 次閱讀 Android Android開發 移動開發

         android4.0上打開wifi后,自動掃描附近所有的wifi熱點,連接指定的wifi名稱和密碼,DHCP動態獲取IP后,最后使用Ping命令對連網進行測試。

1.注冊wifi的廣播接收器:

          監聽WifiManager.WIFI_STATE_CHANGED_ACTION消息,并實時處理wifi狀態的變化。

    wifi的消息一共有五種:

    WifiManager.WIFI_STATE_DISABLED: //wifi不可用

    WifiManager.WIFI_STATE_DISABLING://wifi 正在關閉或者斷開

    WifiManager.WIFI_STATE_ENABLED://wifi可用

    WifiManager.WIFI_STATE_ENABLING://wifi正在打開或者連接

    WifiManager.WIFI_STATE_UNKNOWN://未知消息

    僅在wifi狀態為WIFI_STATE_ENABLED的時候,才表示wifi已經連接成功。因此我們在此可以進行連通測試,若想成功獲取ip,最好等待3s再去獲取ip信息。在測試過程中,發現wifi連網成功后,立馬去進行ping命令測試的話,其實際的ip信息還沒有來得及設置。

    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;
                }
            }
        }
    };

2.構造一個wifi 的工具類:

    提供打開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;
    }
}

3.打開wifi并掃描附近熱點:

    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();


4.連接指定的wifi名稱[SSID]:

    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));

5.獲取wifi連接成功后的ip信息:

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;
}

6.ping命令測試wifi的連通:

     使用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

7.添加網絡控制權限以及wifi的權限:

    <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" />

來自:http://my.oschina.net/hiliusl/blog/175605

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!