HttpRequest локальный флеш-сервер на Raspberry Pi с WAP и без интернета - PullRequest
0 голосов
/ 12 сентября 2018

В настоящее время я пытаюсь связаться с Raspberry Pi по Wi-Fi с помощью устройства Android. Я использую Raspberry Pi в качестве WAP, и он также размещает свой собственный флеш-сервер. Вручную, я могу получить доступ к веб-странице с помощью пользовательского интерфейса, но программно я продолжаю получать ENETUNREACH (сеть недоступна). Я смог достичь этого раньше, если бы они оба были в одной сети, а пи не действовали как WAP. Я могу подключиться к Wi-Fi, но он показывает восклицательный знак из-за отсутствия интернета. Но я не могу получить доступ к веб-серверу программно. Вот где я подключаюсь к Wi-Fi и настраиваю новый конфиг, если не настроен:

/**
     * 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, но не повезло. Я был в этом некоторое время. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 17 сентября 2018

Я нашел ответ.Очевидно, что хотя 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();
                }

URL-соединения проходили слишком быстро, я думаю.

...