Question

I am developing an application which should automarically and periodically enable wifi, scan for networks, filter out networks that are open (no pass needed), create a wifiConfiguration object and use it to connect to that network.

I read the wifiConfiguration API on android developers. And based on it I have written a sample of code which does enable the wifi, scans for networks and saves the result in a list which looks like that:

11-25 16:05:44.191: I/WIFISCAN(12955): List of networks: [SSID: airlive_w, BSSID: 00:4f:62:2c:96:18, capabilities: [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS], level: -71, frequency: 2432, SSID: Mikynet, BSSID: 00:1e:2a:ed:62:4e, capabilities: [WPA2-PSK-CCMP], level: -72, frequency: 2427, SSID: TP-LINK_Vectra, BSSID: 74:ea:3a:ab:eb:b0, capabilities: [WPA2-PSK-TKIP+CCMP][WPS], level: -73, frequency: 2462, SSID: Nasza Siec- ryby, BSSID: d8:5d:4c:df:60:74, capabilities: [WPA2-PSK-TKIP+CCMP-preauth], level: -88, frequency: 2437, SSID: lanzarote, BSSID: 00:27:19:f7:05:9c, capabilities: [WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP-preauth], level: -89, frequency: 2437, SSID: Alicja, BSSID: 94:44:52:a7:17:02, capabilities: [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS], level: -89, frequency: 2442, SSID: orangebox, BSSID: 00:1f:f3:f8:ea:0f, capabilities: [WPA2-PSK-CCMP], level: -89, frequency: 2462]

Having that result how am I going to know which of them is open (pass free)? And how do I create the wifiConfiguration for an open one?

Here is a sample wifiConfiguration for a WPA-PSK:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
// This is must be quoted according to the documentation 
// http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html#SSID
wc.SSID = "\"SSIDName\"";
wc.preSharedKey  = "\"password\"";
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;        
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifi.addNetwork(wc);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = wifi.enableNetwork(res, true);        
Log.d("WifiPreference", "enableNetwork returned " + b );

Any guidance will be highly apreciated! :)

Was it helpful?

Solution

From what I can tell, you might have to try adding an open configuration to the Wifi service. If adding an open network fails, it probably requires some kind of auth protocol.

WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "some ssid from the list";
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
int networkId = wifi.addNetwork(wc);
if (networkId == -1) {
    // probably not open
} else {
    // likely open
}

You could also use this in conjunction with the getConfiguredNetworks method to see if any nearby networks a) have been previously connected to and b) are open.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top