Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在2个Wifi网络之间切换,连接失败_Java_Android_Ftp_Wifi_Android Things - Fatal编程技术网

Java 在2个Wifi网络之间切换,连接失败

Java 在2个Wifi网络之间切换,连接失败,java,android,ftp,wifi,android-things,Java,Android,Ftp,Wifi,Android Things,在运行Android things的Raspberry Pi 3上,我很难通过编程在两个网络之间切换(但它应该与运行普通Android相同) 第一个网络来自作为接入点的设备服务器。它运行一个FTP服务器,我需要通过它的网络访问它。据我所知,它在192.168.xxx.xxx网络中有一个静态IP地址,由WPA2-PSK保护。我知道SSID和密码是正确的。该设备位于自己的专用网络中,无法通过外部地址访问。连接到它的唯一方法是连接到它的网络并通过FTP发送到它的静态地址 第二个网络是一个开放的网络,我

在运行Android things的Raspberry Pi 3上,我很难通过编程在两个网络之间切换(但它应该与运行普通Android相同)

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

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

下面的代码是我目前拥有的代码。DownloadFilesTask在我的startscreen的onCreate中调用

第一个网络的配置似乎失败了,因为将配置添加到WifiManager会返回-1作为networkId,正如我在断开和丢失所有日志之前在最后两行的日志中看到的那样。这两条线是:

04-11 11:10:51.258 1332-1349岩石、岩石、岩石、岩石、岩石、岩石

04-11:10:51.259 411-740/系统\进程I/地址更新网络: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);
    }
}

在尝试连接时出现异常,因为我没有连接到网络。

因此我设法让它工作,以下是我的工作代码。主要区别在于将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";
}
公共字符串connectToXs(){
试一试{
WifiManager WifiManager=(WifiManager)this.getApplicationContext().getSystemService(Context.WIFI_服务);
如果(!wifiManager.getConnectionInfo().getSSID().equals(“\”ssid\”)){
WifiConfiguration wc=新的WifiConfiguration();
wc.SSID=“\”SSID\”;
wc.preSharedKey=“\”key\”;
wc.status=WifiConfiguration.status.ENABLED;
AlloweGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
AlloweGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(wificonfig.keymanagement.WPA\u PSK);
wc.allowedPairwisecipher.set(WifiConfiguration.Pairwiseciper.TKIP);
wc.allowedPairwisecipher.set(WifiConfiguration.Pairwiseciper.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
int res=wifiManager.addNetwork(wc);
Log.d(“WifiPreference”,“添加返回的网络”+res);
最终布尔值[]b=新布尔值[1];
线程t=新线程(()->{
b[0]=wifiManager.enableNetwork(res,true);
wifiManager.setWifiEnabled(true);
试一试{
睡眠(3000);
}
捕获(例外e){
Log.d(“错误”,例如toString());
}
});
t、 start();
t、 join();
Log.d(“WifiPreference”,“enableNetwork返回”+b[0]);
返回wifiManager.getConnectionInfo().toString();
}否则{
日志d(“WIFI”,“已连接”);
返回“已连接”;
}
}捕获(例外情况除外){
Log.d(“错误”,例如toString());
}
返回“努加蓬”;
}
公共字符串connectToGuest(){
试一试{
WifiManager WifiManager=(WifiManager)this.getApplicationContext().getSystemService(Context.WIFI_服务);
如果(!wifiManager.getConnectionInfo().getSSID().equals(“\”+“ssid2”+“\”)){
//int networkId=wifiManager.addNetwork(conf);
int networkId=-2;
List configs=wifiManager.getConfiguredNetworks();
用于(无线配置wc:configs){
如果(wc.SSID.equals(“\”SSID2\”){
networkId=wc.networkId;
}
}
int finalNetworkId=networkId;
wifiManager.disconnect();
线程t=新线程(()->{
wifiManager.enableNetwork(finalNetworkId,true);
试一试{
睡眠(3000);
}
捕获(例外e){
Log.d(“错误”,例如toString());
}
});
t、 start();
t、 join();
wifiManager.reconnect();
Log.d(“重新连接”,wifiManager.getConnectionInfo().getSSID());
返回“已尝试的网络ID:+networkId+”+wifiManager.getConnectionInfo().toString();
}否则{
日志d(“WIFI”,“已连接”);
返回“已连接”;
}
}捕获(例外情况除外){
Log.d(“错误”,例如toString());
}
返回“smoutebollen”;
}

请添加堆栈跟踪。192.168是本地网络。这意味着,如果您连接到192.168.1.1(或192.168.0.1,无论路由器地址是什么),您将访问网络上的路由器,而不是特定的路由器。如果要连接到任一网络上的特定脚本,则必须找到外部ip(使用whatsmyip.com之类的网站)。如果您的主机位于169.254范围内,则您的网络设置不起作用,任何主机都不应使用该范围。无法从DHCP服务器获取IP的设备将获取这些地址。这是我的一个错误,如果我连接到LAN网络中的设备,它将返回169.254地址,在WLAN中,它在1中有一个地址
    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";
}