сокет сервера не читает esp8266, почему? - PullRequest
0 голосов
/ 31 мая 2018

Мое доказательство концепции простого гнезда между Android и esp8266 работает только на 50%.Я отправляю одно сообщение от Android до esp8266, которое принимается нормально, но от esp8266 на android нет, и заканчивается наличием java.io.EOFException на стороне андроида и Timeout (как видно из кода ниже) для стороны esp8266,Я предоставляю соответствующую часть кода, чтобы быть кратким, при необходимости я опубликую все.

Android:

                while (true) {
                socket = serverSocket.accept();
                dataInputStream = new DataInputStream(
                        socket.getInputStream());
                dataOutputStream = new DataOutputStream(
                        socket.getOutputStream());

                String msgReply = "Android server is alive!";
                dataOutputStream.writeUTF(msgReply);
                dataOutputStream.flush();

                message = dataInputStream.readUTF();
                MainActivity.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        msg.setText(message);
                    }
                });
            }

ESP8266 сторона:

String cmd = "Hello from NodeMCU";  
Serial.print("send to server: ");
Serial.println(cmd);
client.print(cmd);
client.flush();
unsigned long timeout = millis();
  while (client.available() == 0) {
      if (millis() - timeout > 5000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
  }

    while(client.available()){
    String line = client.readStringUntil('!');
    Serial.print(line);
   }

Я пробовал все, что приходило мне в голову, переходил на написание char, используя client.write('h') и т. Д., И ничего не работает.Пожалуйста, укажите мне какое-то рабочее направление.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы должны либо использовать readUTF() и writeUTF() на обоих концах или , не использовать их вообще: использовать read() и write() или readLine() иprintln() и т. Д. Вы не можете смешивать их вот так.

0 голосов
/ 31 мая 2018

dataOutputStream.writeUTF (msgReply);

message = dataInputStream.readUTF ();

Не использовать функции UTF.

Лучше использовать обычные write () и read ();

В дальнейшем вы могли бы гораздо лучше написать строки для чтения.(«\ n» как конец строки / сообщения. Не «!»).

На стороне Android вы можете использовать функции writeLine () и readLine (), что значительно облегчает жизнь.

Далее: сервер сначала отправляет сообщение, а затем пытается прочитать ответ.Но клиент также сначала отправляет сообщение, а затем пытается прочитать ответ.Это никогда не может работать.Вы должны решить, кто из вас отправит сообщение первым.

...