我目前正在尝试使用Android设备通过wifi与覆盆子pi进行通信。我使用覆盆子pi作为WAP,它也托管它自己的烧瓶服务器。手动,我能够使用UI访问网页,但从程序上来说,我一直在ENETUNREACH(网络无法访问)。如果他们都在同一个网络上并且pi没有充当WAP,那么我能够更早地实现这一目标。我能够连接到wifi,但由于没有互联网,它显示一个感叹号。但我无法以编程方式访问Web服务器。这是我连接到wifi并在未配置时设置新配置的地方:
/**
* Connect to a specific network
*/
private void connectToWifi(){
if(lastDevice == null){
Log.i("WifiRunner", "LastDevice is null");
connectStatus = ConnectStatus.WAITING_FOR_USER;
sendIntent("status");
return;
}
String networkSSID = lastDevice.getHostName();
String networkPass = lastDevice.getPassWord();
Boolean exists = false;
Log.i("WifiRunner", "connectToWifi: hostName: " + lastDevice.getHostName() + ", password: " + lastDevice.getPassWord());
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
Log.i("WifiRunner", "In configured networks!! " + i.SSID);
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
connectStatus = ConnectStatus.CONNECTED;
sendIntent("status");
exists = true;
break;
}
}
if(!exists) {
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"" + networkSSID + "\"";
wc.preSharedKey = "\"" + networkPass + "\"";
wc.hiddenSSID = true;
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);
int res = wifiManager.addNetwork(wc);
Log.i("WifiRunner", "add Network returned " + res);
boolean b = wifiManager.enableNetwork(res, true);
Log.i("WifiRunner", "enableNetwork returned " + b);
Log.i("WifiRunner", "connectToWifi: Reconnect: " + wifiManager.reconnect());
}
}
我有一大堆代码试图访问URL:
Log.i("WifiRunner", "WAITING FOR RESPONSE!");
url = new URL("http://192.168.5.1:5000/connected/" + lastDevice.getPassWord());
client = (HttpURLConnection) url.openConnection();
client.setRequestMethod("GET");
client.setConnectTimeout(1000);
Log.i("WifiRunner", client.getURL().toString());
int responseCode = 404;
try {
responseCode = client.getResponseCode();
} catch (Exception e) {
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
e.printStackTrace( printWriter );
printWriter.flush();
String stackTrace = writer.toString();
Log.i("WifiRunner", e.getLocalizedMessage());
Log.i("WifiRunner", stackTrace);
sendIntent("failure");
lastDevice = null;
}
这是我得到的日志:
09-11 14:35:01.980 I/WifiRunner(19995): connectToWifi: hostName: Beanster, password: beanster1
09-11 14:35:02.014 I/WifiRunner(19995): In configured networks!! "Beanster"
09-11 14:35:02.171 I/WifiRunner(19995): WAITING FOR RESPONSE!
09-11 14:35:02.190 I/WifiRunner(19995): http://192.168.5.1:5000/connected/beanster1
09-11 14:35:02.281 I/WifiRunner(19995): failed to connect to /192.168.5.1 (port 5000) after 1000ms: connect failed: ENETUNREACH (Network is unreachable)
09-11 14:35:02.281 I/WifiRunner(19995): java.net.ConnectException: failed to connect to /192.168.5.1 (port 5000) after 1000ms: connect failed: ENETUNREACH (Network is unreachable)
09-11 14:35:02.281 I/WifiRunner(19995): at libcore.io.IoBridge.connect(IoBridge.java:124)
09-11 14:35:02.281 I/WifiRunner(19995): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
09-11 14:35:02.281 I/WifiRunner(19995): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
09-11 14:35:02.281 I/WifiRunner(19995): at java.net.Socket.connect(Socket.java:882)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.internal.Platform.connectSocket(Platform.java:212)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.Connection.connect(Connection.java:163)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:323)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:238)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:364)
09-11 14:35:02.281 I/WifiRunner(19995): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:562)
09-11 14:35:02.281 I/WifiRunner(19995): at com.example.ndonaldson.beanster.WifiRunner.run(WifiRunner.java:192)
09-11 14:35:02.281 I/WifiRunner(19995): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
09-11 14:35:02.281 I/WifiRunner(19995): at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:279)
09-11 14:35:02.281 I/WifiRunner(19995): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:152)
09-11 14:35:02.281 I/WifiRunner(19995): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266)
09-11 14:35:02.281 I/WifiRunner(19995): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-11 14:35:02.281 I/WifiRunner(19995): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-11 14:35:02.281 I/WifiRunner(19995): at java.lang.Thread.run(Thread.java:818)
09-11 14:35:02.281 I/WifiRunner(19995): Caused by: android.system.ErrnoException: connect failed: ENETUNREACH (Network is unreachable)
09-11 14:35:02.281 I/WifiRunner(19995): at libcore.io.Posix.connect(Native Method)
09-11 14:35:02.281 I/WifiRunner(19995): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
09-11 14:35:02.281 I/WifiRunner(19995): at libcore.io.IoBridge.connectErrno(IoBridge.java:154)
09-11 14:35:02.281 I/WifiRunner(19995): at libcore.io.IoBridge.connect(IoBridge.java:122)
09-11 14:35:02.281 I/WifiRunner(19995): ... 18 more
09-11 14:35:02.281 I/WifiRunner(19995): responseCode:404
09-11 14:35:02.281 I/WifiRunner(19995): Failed to connect
我正在使用与HttpRequest完全相同的地址,但没有运气。我已经在这一段时间了。有人可以帮忙吗?
我找到了答案。显然即使enableNetwork返回true,网络还没有完全连接。为了解决这个问题,我在连接后等了大约5秒钟:
Log.i("WifiRunner", "In configured networks!! " + i.SSID);
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
我想,网址连接速度太快了。