2017-02-07 18 views
9

IoT 장치 용 Android 앱을 프로그래밍하고 있습니다. 장치에 WiFi 사용자 이름과 암호를 부여해야하므로 안드로이드 앱을 사용하고 있습니다. 다음 코드가 있지만 네트워크 날씨에 항상 연결되어 있거나 올바른 암호가 제공되지 않은 것으로 보입니다.프로그래밍 방식으로 Android 테스트 Wi-Fi 연결을 사용합니다.

본인은 휴대 전화가 연결된 동일한 AP에서이를 테스트하고 있습니다.

원하는 동작은 현재 AP에서

끊기 인 -> 소정의 인증 정보를 사용하여 연결을 시도는 -> 원래 네트워크에 다시 연결.

wifi 네트워크 및 암호를 올바르게 확인하기 위해 수행해야 할 단계는 무엇입니까?

코드 : 사용 가능한 와이파이 네트워크를 검색 할 필요가 없습니다 수 있습니다

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

, 당신은 쉽게 다음과 같이 수행 할 수 있습니다

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; 

}