2017-04-11 44 views
0

遇到麻烦2个网络之间进行切换编程上的覆盆子裨3运行Android事(但它应该是相同的运行正常的Android)。2个WiFi网络之间切换时,连接失败

第一网络是从一个设备服务器作为接入点的到来。它运行我需要通过网络访问的FTP服务器。它在我知道的192.168.xxx.xxx网络中有一个静态IP地址,并由WPA2-PSK保护。我知道SSID和密码是正确的。该设备位于它自己的专用网络中,并且无法到达外部地址。连接到它的唯一方法是连接到它的网络并FTP'ing它的静态地址。

第二个网络是一个开放的网络,其中我也知道SSID。这是另一个应用程序预先配置的,所以我的应用程序无法更新配置。

下面的代码是我的时刻。 DownloadFilesTask在我的startscreen的onCreate中被调用。

第一网络的配置似乎失败,因为增加了WifiManager返回-1作为NETWORKID,因为我可以在日志中的最后两行断开并失去了所有的记录之前看到的配置。的2行是:

一十一月4日至11日:10:51.258 1332年至1349年/ rocks.androidthings.hellothings d /连接:SSID1 passphase

一十一月4日至11日:10:51.259 411-740/system_process我/ 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

PLease添加堆栈跟踪。 192.168是本地网络。如果连接到192.168.1.1(或192.168.0.1,无论路由器地址是什么),这意味着你将访问网络上的路由器,而不是特定的路由器。如果要连接到任一网络上的特定脚本,则必须找到外部IP(使用诸如whatsmyip.com之类的站点)。 – Zoe

+0

如果您的主机位于169.254范围内,则有关您的网络设置的问题无法解决,因此主机不应使用该范围。无法从DHCP服务器获取IP的设备获取这些地址。 – kaderud

+0

这是我的错误,如果我连接到LAN网络中的设备,它会返回169.254地址,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"; 
} 
相关问题