Http-запрос, отправленный OkHttp, не получен на сервере micropython - PullRequest
0 голосов
/ 05 мая 2019

В настоящее время я пытаюсь написать приложение для Android для настройки и управления ESP8266, на котором работает микропифон.
На сервере micropython я инициализирую веб-сокет следующим образом:

    def __init__(self, task_manager, setup_mode):
        address = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
        self._socket = socket.socket()
        self._socket.bind(address)
        self._socket.listen(1)
        self._socket.setblocking(False)
        self._socket.settimeout(5)

        self._task_manager = task_manager

        self._setup_mode = setup_mode

        print('New Socket is listening on: ', address)

А затем просто прослушайте входящие соединения, как это, и затем реагируйте на входящие сообщения. Также список зациклен, чтобы позволить логике микроконтроллера обновляться каждые 5 секунд.

client, address = self._socket.accept()
print("New request from:", address)

Все работает нормально, когда я отправляю тестовый запрос с помощью python с моего компьютера. Например, простой запрос будет выглядеть примерно так:

data = json.dumps({'load': {'type': "is_lighthub", 'data': {}}})
response = requests.post(ip, json=data)

Однако, когда я пытаюсь сделать тот же пост-запрос, используя OkHttp из приложения для Android, входящее соединение в ESP отсутствует.
Вот код Java для Android:

private void addIfLighthub(final InetAddress address) {
        try {
            RequestBody body = RequestBody.create(JSON, "{\"load\": {\"type\": \"is_lighthub_server\", \"data\": {}}");
            Request request = new Request.Builder()
                    .url("http://" + address.getHostAddress())
                    .post(body)
                    .build();
            try (Response response = client.newCall(request).execute()) {
                final JSONObject myResponse = new JSONObject(response.body().string());
                if((boolean)myResponse.get("is_lighthub")) {
                    onlineDeviceList.add(address);
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        } catch (JSONException jsonException) {
            System.out.println(jsonException.getMessage());
        }
    }

Странно, однако, что этот пример кода, если он предоставлен, например, с адресом моего маршрутизатора, получает html-сайт по умолчанию для маршрутизаторов ...

Итак, я что-то упустил? Я довольно плохо знаком с сетью, но простой почтовый запрос с телефона должен быть таким же, как и из примера кода Python, верно?
Или есть ошибка в моей функции Java?

Заранее спасибо, ребята, за помощь!

1 Ответ

0 голосов
/ 09 мая 2019

Если починить сам!Ошибка состояла в том, что тестовый клиент python отправил json отдельно, а клиент okhttp отправил оба в одном куске.Это привело к тайм-ауту сервера во время ожидания второго сообщения ...

...