目錄[-]
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
|
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 ; <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
|
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() {<span></span> if (mWifiManager.isWifiEnabled())
{ mWifiManager.setWifiEnabled( false ); } } p<span></span>ublic 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 ; } }<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
= 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
1
|
wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(“TP-LINK_liusl”, "liusl2222" , 3 )); |
5.獲取wifi連接成功後的ip信息:
1
2
3
4
5
6
7
8
9
10
|
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" />