안드로이드를 실행하는 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;
}
회로망.
stacktrace를 추가하십시오. 192.168은 로컬 네트워크입니다. 192.168.1.1 (또는 192.168.0.1, 라우터 주소가 무엇이든)에 연결하면 특정 라우터가 아닌 네트워크의 라우터로 연결됩니다. 어느 네트워크에서나 특정 스크립트에 연결하려면 외부 IP (whatsmyip.com과 같은 사이트 사용)를 찾아야합니다. – Zoe
169.254 범위의 호스트가있는 경우 네트워크 설정이 작동하지 않습니다. 호스트가 해당 범위를 사용하면 안됩니다. DHCP 서버에서 IP를 가져올 수없는 장치는 이러한 주소를 얻습니다. – kaderud
그게 내 부분에 오류가 있었다면, 내가 169.254 주소를 되돌려주는 LAN 네트워크의 장치에 연결하면, WLAN에 192.168 네트워크의 주소가있다. ftp에 필요한 192.168 네트워크의 주소이다. . 혼란에 대한 사과. – SJoos