2017-02-07 3 views
9

Я программирую приложение для Android для устройства IoT. Я должен предоставить устройству WiFi имя пользователя и пароль, поэтому я использую приложение для Android для этого. У меня есть следующий код, но он, кажется, всегда подключается к сетевой погоде или не соответствует правильному паролю.Android-тестирование wifi-соединения программно

Это я тестирую это на той же точке доступа, к которой подключен мой телефон.

Желаемое действие

Отключение от текущей точки доступа -> Попытка подключиться, используя учетные данные, данные -> Подключитесь к исходной сети.

Какие шаги необходимо предпринять для правильной проверки сети Wi-Fi и пароля?

код:

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

ли вы это исправить? Я также сталкиваюсь с проблемой. Если я добавлю неверный пароль, верните true. Итак, можете ли вы предложить идею решить эту проблему? – AngelJanniee

ответ

0

Вы можете не нужно сканировать доступную сеть Wi-Fi, вы можете легко сделать так: следовать

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

Как я могу сказать, удалось ли сбой в сети или не удалось? – Reid

+0

wifiManager.reconnect(); вернет результирующее логическое значение .. подключен ли вы или нет –

+0

, если я добавлю неверный пароль, также возвращающий то же значение. Можете ли вы предложить решение – AngelJanniee

4

Вы должны зарегистрироваться, чтобы NETWORK_STATE_CHANGED_ACTION.

Используя это, вы можете получить состояние сети WI-FI, и вам нужно проверить, что он достиг состояния подключения. Если устройство не подключилось к сети через некоторое время, вы можете предположить, что соединение не выполнено.

другой полезный приемник может быть 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

Только Проверьте это нравится, что

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; 

} 
Смежные вопросы