2017-02-07 49 views
9

Programuję aplikację na Androida dla urządzenia IoT. Muszę nadać urządzeniu nazwę użytkownika i hasło WiFi, więc używam do tego aplikacji dla systemu Android. Mam następujący kod, ale wydaje się, że zawsze łączę się z pogodą sieciową, czy nie podano poprawnego hasła.Android test połączenia WiFi programowo

Testuję to na tym samym AP, do którego podłączony jest mój telefon.

pożądane działanie jest

odłączyć od aktualnego AP -> próba połączenia za pomocą poświadczenia podane -> Ponownie do pierwotnej sieci.

Jakie kroki należy podjąć, aby poprawnie zweryfikować sieć Wi-Fi i hasło?

Kod:

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

Czy to naprawić? Mam również do czynienia z tym problemem. Jeśli dodaję złe hasło, zwrócę również true. Więc czy możesz zasugerować pomysł rozwiązania tego problemu? – AngelJanniee

Odpowiedz

0

Być może nie trzeba do skanowania dostępnych sieci WiFi, można łatwo zrobić tak: postępuj

public static void connectToWifi(Activity activity, String ssid, String password) { 
     WifiConfiguration wifiConfig = new WifiConfiguration(); 

     wifiConfig.SSID = String.format("\"%s\"", ssid); 
     wifiConfig.preSharedKey = String.format("\"%s\"", password); 

     WifiManager wifiManager = (WifiManager) activity.getSystemService(WIFI_SERVICE); 
     wifiManager.setWifiEnabled(true); 
     int netId = wifiManager.addNetwork(wifiConfig); 
     wifiManager.disconnect(); 
     wifiManager.enableNetwork(netId, true); 
     wifiManager.reconnect(); 
    } 
+0

Skąd mam wiedzieć, czy połączenie z siecią powiodło się lub się nie powiodło? – Reid

+0

wifiManager.reconnect(); zwróci wynikową wartość boolowską. Niezależnie od tego, czy jesteś podłączony czy nie –

+0

, jeśli dodaję złe hasło, zwracam tę samą wartość. Czy możesz zaproponować rozwiązanie – AngelJanniee

4

Należy zarejestrować się NETWORK_STATE_CHANGED_ACTION.

Za pomocą tego można uzyskać stan sieci WI-FI i sprawdzić, czy osiągnął stan połączenia. Jeśli urządzenie nie osiągnęło połączenia po pewnym czasie oczekiwania, można założyć, że połączenie nie powiodło się.

innym pomocnym odbiorcą może być 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; 
       } 
      } 
0

tylko sprawdzić jak to jest tym

public static boolean isConnectingToInternet(Context context){ 
    try { 
     ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) { 
      NetworkInfo info[] = connectivity.getAllNetworkInfo(); 
      if (info != null) { 
       for (int i = 0; i < info.length; i++) 

        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 

      } 
     } 
    }catch (Exception e){} 
    return false; 

}