Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android test wifi connection programmatically

I am programming an Android app for an IoT device. I have to give the device the WiFi username and password, so I am using an android app to do this. I have the following code, but it seems to always connect to the network weather or not the correct password is given.

This I am testing this on the same AP that my phone is connected to.

The desired action is

Disconnect from current AP -> Attempt to connect using credentials given -> Reconnect to original network.

What steps do I need to take to correctly verify a wifi network and password?

code :

WifiConfiguration conf = new WifiConfiguration();
    conf.SSID = "\"" + ssid + "\"";
    for(ScanResult sr: wifiList){
        if(sr.SSID.equals(ssid)){
            if(sr.capabilities.contains("WEP")){
                if(isNumeric(pass)){
                    conf.wepKeys[0] =  pass ;
                }else{
                    conf.wepKeys[0] = "\"" + pass + "\"";
                }
                conf.wepTxKeyIndex = 0;
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
            }else if(sr.capabilities.contains("PSK")){
                conf.preSharedKey = "\""+ pass +"\"";
            }else if(sr.capabilities.contains("EAP")){
                wifiName.setError("EAP networks not supported");
                //todo support EAP
            }else{
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            }

            WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
            wifiManager.addNetwork(conf);

            List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
            for( WifiConfiguration i : list ) {
                if(i.equals(conf)) {
                    wifiManager.disconnect();
                    if(!wifiManager.enableNetwork(i.networkId, true)){
                        wifiPassword.setError("Incorrect Password");
                        wifiManager.reconnect();
                        return;
                    }else{
                        wifiManager.reconnect();
                        addUser(deviceSN, ssid, pass);
                    }
                }
            }

            break;
        }
    }
like image 593
Reid Avatar asked Feb 07 '17 21:02

Reid


1 Answers

You should register to NETWORK_STATE_CHANGED_ACTION.

Using this, you can get the WI-FI network state and you need to check that it reached the connected state. If the device did not reach connected after some timeout, you can assume that the connection has failed.

another helpful receiver might be SUPPLICANT_STATE_CHANGED_ACTION.

public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {

            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

            switch (info.getState()) {
                case CONNECTING:
                    break;
                case CONNECTED:
                    break;
                case DISCONNECTING:
                    break;
                case DISCONNECTED:
                    break;
                case SUSPENDED:
                    break;
                }
            }
like image 74
Ilan.b Avatar answered Sep 27 '22 19:09

Ilan.b