2017-04-11 6 views
0

안드로이드를 실행하는 Raspberry Pi 3에서 2 개의 네트워크를 프로그래밍 방식으로 전환하는 데 문제가 있습니다 (단, 일반 Android를 실행하는 것과 동일해야 함).2 개의 Wifi 네트워크 사이를 전환하면 연결이 실패합니다.

첫 번째 네트워크는 장치 서버에서 액세스 포인트로 전송됩니다. 네트워크를 통해 액세스해야하는 FTP 서버를 실행합니다. 그것은 내가 알고있는 192.168.xxx.xxx 네트워크에 고정 IP 주소를 가지고 있으며 WPA2-PSK에 의해 보안됩니다. 나는 SSID와 passphrase를 알고있다. 이 장치는 자체 사설망에 있으며 자체적으로 외부 주소에 연결할 수 없습니다. 연결할 수있는 유일한 방법은 네트워크에 연결하고 정적 주소에 FTP로 연결하는 것입니다.

두 번째 네트워크는 SSID를 알고있는 개방형 네트워크입니다. 이 응용 프로그램은 다른 응용 프로그램에서 미리 구성되어 있으므로 응용 프로그램에서 구성을 업데이트 할 수 없습니다.

아래 코드는 내가 지금 가지고있는 코드입니다. DownloadFilesTask는 내 시작 화면의 onCreate에서 호출됩니다.

WifiManager에 구성을 추가하면 networkId가 -1로 반환되므로 모든 네트워크 연결을 끊고 끊기 전에 마지막 2 줄의 로그에서 볼 수있는 것처럼 첫 번째 네트워크의 구성이 실패한 것으로 보입니다.

11월 4일에서 11일까지 : 10 : 2 개 라인은 51.258 1332년에서 1349년까지/D는 rocks.androidthings.hellothings/접속 : 10 : 51.259 411-740/system_process의 I SSID1은

11월 4일부터 11일까지을 passphase/addOrUpdateNetwork : uid = 10026 SSID SSID1 nid = -1

이 후 java.net.socketException : 인수가 잘못되었거나 요청 된 주소를 할당 할 수 없습니다.

저는 지난 며칠 동안이 문제로 어려움을 겪었으므로 도움이 될 것입니다.

public String connectToNetwork1() { 
    try { 
     WifiManager wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 

     if (!wifiManager.getConnectionInfo().getSSID().equals("\"" + SSID1 + "\"")) { 

      WifiConfiguration conf = new WifiConfiguration(); 
      conf.SSID = "\"" + SSID1 + "\""; 

      conf.preSharedKey = "\"" + passphrase + "\""; 
      conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2 
      conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
      Log.d("connecting", conf.SSID + " " + conf.preSharedKey); 

      int networkId = wifiManager.addNetwork(conf); 

      Log.d("after connecting", conf.SSID + " " + conf.preSharedKey); 
      wifiManager.disconnect(); 
      Thread t = new Thread(() -> { 
       wifiManager.enableNetwork(networkId, true);     
      }); 
      t.start(); 
      t.join(); 
      wifiManager.reconnect(); 
      Log.d("re connecting", wifiManager.getConnectionInfo().getSSID()); 
      return wifiManager.getConnectionInfo().toString(); 
     } else { 
      Log.d("WIFI", "already connected to network1"); 
      return "already connected to network1"; 
     } 
    } catch (Exception ex) { 
     Log.d("ERROR", ex.toString()); 
    } 
    return "nougabollen"; 
} 

public String connectToNetwork2() { 
    try { 
     WifiManager wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
     if (!wifiManager.getConnectionInfo().getSSID().equals("\"" + SSID2 + "\"")) { 

      /*WifiConfiguration conf = new WifiConfiguration();    // 
      conf.SSID = "\"" + SSID2 + "\"";        // 
                      // 
      conf.status = WifiConfiguration.Status.ENABLED;     // 
      conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); // this block is useless since my application can't update this network 
                      // since network 2 is configured elsewhere 
      Log.d("connecting", conf.SSID);         // 
                      // 
      int networkId = wifiManager.addNetwork(conf);*/     // 
      int networkId = -2; 
      List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks(); 
      for(WifiConfiguration wc : configs){ 
       if(wc.SSID.equals("\"" + SSID2 + "\"")){ 
        networkId = wc.networkId; 
       } 
      } 
      int finalNetworkId = networkId; 
      wifiManager.disconnect(); 
      Thread t = new Thread(() -> { 
       wifiManager.enableNetwork(finalNetworkId, true); 
      }); 
      t.start(); 
      t.join(); 
      wifiManager.reconnect(); 
      Log.d("re connecting", wifiManager.getConnectionInfo().getSSID()); 
      return "tried networkId: " + networkId + " " + wifiManager.getConnectionInfo().toString(); 
     } else { 
      Log.d("WIFI", "already connected to network2"); 
      return "already connected to network2"; 
     } 
    } catch (Exception ex) { 
     Log.d("ERROR", ex.toString()); 
    } 
    return "smoutebollen"; 
} 

private class DownloadFilesTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... params) { 
     String text = ""; 
     text += " " + connectToNetwork1(); 
     text += " " + retrieveFile(); 
     text += " " + connectToNetwork2(); 
     Log.d("text", text); 
     return text; 
    } 

    protected void onPostExecute(String text) { 
     test.setText(text); 
    } 
} 

내가 파일을 검색하는 데 사용하는 코드입니다 (사용 apache.commons.net) : 나는에 연결되어 있지 않다 때문에 연결을 시도 할 때 예외를 제공

public static String getDummyFile(){ 
    FTPClient client = new FTPClient(); 
    Log.d("ftp","client created"); 
    InetAddress ip = null; 
    try { 
     ip = InetAddress.getByName("192.168.242.129"); // this is the address of the device creating the first network 
    } 
    catch (Exception e){ 
     Log.d("inetaddres",e.toString()); 
    } 
    try { 
     Log.d("inet", ip.getHostAddress()); 
     int reply = -1; //response 


     client.connect(ip); 
     Log.d("ftp","client connected"); 
     reply = client.getReplyCode(); 
     Log.d("ftp",""+reply); 
     client.enterLocalPassiveMode(); 
     Log.d("ftp","passive mode"); 

     //check if login is accepted 
     /*if (!client.login("anonymous", "")) { 
      Log.d("FTP", "error logging in"); 
     }*/ 

     //check if bad reponse code 
     /*if (!FTPReply.isPositiveCompletion(reply)) { 
      client.disconnect(); 
      Log.d("FTP", "connection refused"); 
     }*/ 

     //set file type to binary and enter passive mode, active not supported on android 
     client.setFileType(FTP.BINARY_FILE_TYPE); 
     Log.d("ftp", "set type to binary"); 
     client.changeWorkingDirectory("/files"); 
     Log.d("ftp","changed dir"); 
     String[] names = client.listNames(); 
     Log.d("FTP", names[1].toString()); 
     Log.d("FTP", client.printWorkingDirectory() + "/" + names[1].toString()); 
     mapFiles(client,"/files","",0); 
     return client.printWorkingDirectory() + "/" + names[1].toString(); 

    } catch (Exception e) { 
     Log.d("ftp",e.toString()); 
     text = e.toString(); 
    } 
    finally { 
     try { 
      client.disconnect(); 
     } 
     catch (Exception e){ 

     } 
    } 
    return text; 
} 

회로망.

+0

stacktrace를 추가하십시오. 192.168은 로컬 네트워크입니다. 192.168.1.1 (또는 192.168.0.1, 라우터 주소가 무엇이든)에 연결하면 특정 라우터가 아닌 네트워크의 라우터로 연결됩니다. 어느 네트워크에서나 특정 스크립트에 연결하려면 외부 IP (whatsmyip.com과 같은 사이트 사용)를 찾아야합니다. – Zoe

+0

169.254 범위의 호스트가있는 경우 네트워크 설정이 작동하지 않습니다. 호스트가 해당 범위를 사용하면 안됩니다. DHCP 서버에서 IP를 가져올 수없는 장치는 이러한 주소를 얻습니다. – kaderud

+0

그게 내 부분에 오류가 있었다면, 내가 169.254 주소를 되돌려주는 LAN 네트워크의 장치에 연결하면, WLAN에 192.168 네트워크의 주소가있다. ftp에 필요한 192.168 네트워크의 주소이다. . 혼란에 대한 사과. – SJoos

답변

0

그래서 나는 그것을 작동시킬 수 있었고, 다음은 제 작업 코드입니다. 주요 차이점은 WPA를 프로토콜로 설정하고 네트워크를 활성화 한 후 해당 스레드에 3 초 동안 절전 모드를 연결하게하는 것입니다.

public String connectToXs() { 
    try { 
     WifiManager wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 

     if (!wifiManager.getConnectionInfo().getSSID().equals("\"ssid\"")) { 

      WifiConfiguration wc = new WifiConfiguration(); 
      wc.SSID = "\"ssid\""; 

      wc.preSharedKey = "\"key\""; 
      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); 
      wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
      int res = wifiManager.addNetwork(wc); 
      Log.d("WifiPreference", "add Network returned " + res); 
      final boolean[] b = new boolean[1]; 
      Thread t = new Thread(() -> { 
       b[0] = wifiManager.enableNetwork(res, true); 
       wifiManager.setWifiEnabled(true); 
       try { 
        Thread.sleep(3000); 
       } 
       catch (Exception e){ 
        Log.d("ERROR",e.toString()); 
       } 
      }); 
      t.start(); 
      t.join(); 
      Log.d("WifiPreference", "enableNetwork returned " + b[0]); 

      return wifiManager.getConnectionInfo().toString(); 
     } else { 
      Log.d("WIFI", "already connected"); 
      return "already connected"; 
     } 
    } catch (Exception ex) { 
     Log.d("ERROR", ex.toString()); 
    } 
    return "nougabollen"; 
} 

public String connectToGuest() { 
    try { 
     WifiManager wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); 
     if (!wifiManager.getConnectionInfo().getSSID().equals("\"" + "ssid2" + "\"")) { 

      //int networkId = wifiManager.addNetwork(conf); 
      int networkId = -2; 
      List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks(); 
      for(WifiConfiguration wc : configs){ 
       if(wc.SSID.equals("\"SSID2\"")){ 
        networkId = wc.networkId; 
       } 
      } 
      int finalNetworkId = networkId; 
      wifiManager.disconnect(); 
      Thread t = new Thread(() -> { 
       wifiManager.enableNetwork(finalNetworkId, true); 
       try { 
        Thread.sleep(3000); 
       } 
       catch (Exception e){ 
        Log.d("ERROR",e.toString()); 
       } 
      }); 
      t.start(); 
      t.join(); 
      wifiManager.reconnect(); 
      Log.d("re connecting", wifiManager.getConnectionInfo().getSSID()); 
      return "tried networkId: " + networkId + " " + wifiManager.getConnectionInfo().toString(); 
     } else { 
      Log.d("WIFI", "already connected"); 
      return "already connected"; 
     } 
    } catch (Exception ex) { 
     Log.d("ERROR", ex.toString()); 
    } 
    return "smoutebollen"; 
}