android4.0 WIFI實現網絡連接

目錄[-]

  • 1.註冊wifi的廣播接收器:
  • 2.構造一個wifi 的工具類:
  • 3.打開wifi並掃描附近熱點:
  • 4.連接指定的wifi名稱[SSID]:
  • 5.獲取wifi連接成功後的ip信息:
  • 6.ping命令測試wifi的連通:
  • 7.添加網絡控制權限以及wifi的權限:
  •          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信息還沒有來得及設置。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
        privatevoid registerWIFI() {
            IntentFilter mWifiFilter = newIntentFilter();
            mWifiFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
            registerReceiver(mWifiConnectReceiver, mWifiFilter);
        }
     
        privateBroadcastReceiver mWifiConnectReceiver = newBroadcastReceiver() {
     
        @Override
        publicvoid onReceive(Context context, Intent intent) {
                Log.d(TAG,"Wifi onReceive action = " + intent.getAction());
                if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
                    intmessage = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
                    Log.d(TAG,"liusl wifi onReceive msg=" + message);
            switch(message) {
            caseWifiManager.WIFI_STATE_DISABLED:
                Log.d(TAG,"WIFI_STATE_DISABLED");
            break;
            caseWifiManager.WIFI_STATE_DISABLING:
                Log.d(TAG,"WIFI_STATE_DISABLING");
            break;
            caseWifiManager.WIFI_STATE_ENABLED:
                Log.d(TAG,"WIFI_STATE_ENABLED");
                threadSleep(10000);
                pingWifiGateway(EthUtils.getWifiGateWay());
            break;
            caseWifiManager.WIFI_STATE_ENABLING:
                Log.d(TAG,"WIFI_STATE_ENABLING");
            break;
            caseWifiManager.WIFI_STATE_UNKNOWN:
                Log.d(TAG,"WIFI_STATE_UNKNOWN");
            break;
            default:
                    break;
                    <span></span>}
                }
            }
        };

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

        提供打開wifi,關閉wifi,掃描WIFI熱點,連接wifi熱點,獲取IP信息,以及一些wifi熱點信息的獲取。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    importjava.util.List;
     
    importandroid.content.Context;
    importandroid.net.DhcpInfo;
    importandroid.net.wifi.ScanResult;
    importandroid.net.wifi.WifiConfiguration;
    importandroid.net.wifi.WifiInfo;
    importandroid.net.wifi.WifiManager;
    importandroid.net.wifi.WifiManager.WifiLock;
    importandroid.util.Log;
     
    publicclass WifiAdmin {
     
        privatestatic final String TAG = "[WifiAdmin]";
        privateWifiManager mWifiManager;
        privateWifiInfo mWifiInfo;
        privateList<ScanResult> mWifiList = null;
        privateList<WifiConfiguration> mWifiConfiguration;
        privateWifiLock mWifiLock;
        privateDhcpInfo dhcpInfo;
     
        publicWifiAdmin(Context context) {
            mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            mWifiInfo = mWifiManager.getConnectionInfo();
        }
     
        publicboolean 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");
            }
            returnmWifiManager.isWifiEnabled();
        }
     
        publicvoid closeWifi() {<span></span> if(mWifiManager.isWifiEnabled()) {
                mWifiManager.setWifiEnabled(false);
            }
        }
     
        p<span></span>ublicintcheckState() {
            returnmWifiManager.getWifiState();
        }
     
        publicvoid acquireWifiLock() {//鎖定wifiLock
            mWifiLock.acquire();
        }
     
        publicvoid releaseWifiLock() {//解鎖wifiLock
            if(mWifiLock.isHeld()) {
                mWifiLock.acquire();
            }
        }
     
        publicvoid creatWifiLock() {
            mWifiLock = mWifiManager.createWifiLock("Test");
        }
     
        publicList<WifiConfiguration> getConfiguration() {
            returnmWifiConfiguration;
        }
     
        publicvoid connectConfiguration(intindex) {//指定配置好的網絡進行連接
            if(index > mWifiConfiguration.size()) {
                return;
            }
            mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);
        }
     
        publicvoid startScan() {//wifi掃描
            booleanscan = 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(inti = 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.");
            }
     
        }
     
        publicList<ScanResult> getWifiList() {
            returnmWifiList;
        }
     
        publicStringBuilder lookUpScan() {// 查看掃描結果   
            StringBuilder stringBuilder = newStringBuilder();
            for(inti = 0; i < mWifiList.size(); i++) {
                stringBuilder.append("Index_"+ newInteger(i + 1).toString() + ":");
                stringBuilder.append((mWifiList.get(i)).toString());
                stringBuilder.append("/n");
            }
            returnstringBuilder;
        }
     
        publicString getMacAddress() {
            return(mWifiInfo == null) ? "NULL": mWifiInfo.getMacAddress();
        }
     
        publicString getBSSID() {
            return(mWifiInfo == null) ? "NULL": mWifiInfo.getBSSID();
        }
     
        publicDhcpInfo getDhcpInfo() {
            returndhcpInfo = mWifiManager.getDhcpInfo();
        }
     
        publicint getIPAddress() {
            return(mWifiInfo == null) ? 0: mWifiInfo.getIpAddress();
        }
     
        publicint getNetworkId() {
            return(mWifiInfo == null) ? 0: mWifiInfo.getNetworkId();
        }
     
        publicWifiInfo getWifiInfo() {
            mWifiInfo = mWifiManager.getConnectionInfo();
            returnmWifiInfo;
        }
     
        publicvoid addNetwork(WifiConfiguration wcg) { // 添加一個網絡配置並連接  
            intwcgID = mWifiManager.addNetwork(wcg);
            booleanb = mWifiManager.enableNetwork(wcgID, true);
            System.out.println("addNetwork--"+ wcgID);
            System.out.println("enableNetwork--"+ b);
        }
     
        publicvoid disconnectWifi(intnetId) {
            mWifiManager.disableNetwork(netId);
            mWifiManager.disconnect();
        }
     
        publicWifiConfiguration CreateWifiInfo(String SSID, String Password, intType) {
            Log.i(TAG,"SSID:"+ SSID + ",password:"+ Password);
            WifiConfiguration config = newWifiConfiguration();
            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;
            }
            returnconfig;
        }
     
        privateWifiConfiguration IsExsits(String SSID) { // 查看以前是否已經配置過該SSID  
            List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
            for(WifiConfiguration existingConfig : existingConfigs) {
                if(existingConfig.SSID.equals("\""+ SSID + "\"")) {
                    returnexistingConfig;
                }
            }
            returnnull;
        }
    }<span></span>

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

        wifi打開後,可以通過WifiManager進行wifi熱點的掃描。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        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 = newWifiAdmin(context);
        mEthManager.setEthernetEnabled(false);
        booleanopen = 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    

    ?
    1
    wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(“TP-LINK_liusl”,"liusl2222",3));

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

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    publicstatic 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);
        returnwifi_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" />

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章