Как сделать автоматическое переподключение этого кода сокета Android NodeMCU TCP? - PullRequest
0 голосов
/ 02 июня 2018

Вариант использования: NodeMCU подключается к Android через сокет TCP, затем Android воспроизводит звук, когда пользователь нажимает кнопку, которая подключена к NodeMCU.

Я не смог найти способ (в который я мог бы поверитькак надежный) иметь AndroidSercket Server, чтобы замечать сброс из клиентского сокета NodeMCU, сразу же, когда сокет NodeMCU отключен, или пытается повторно подключиться.также с помощью этого форума.Я постарался сделать его максимально коротким при публикации здесь, сохранив только соответствующие части, но если вам нужно, я могу просто отбросить весь код, поэтому, пожалуйста, дайте мне знать на всякий случай.

Пожалуйста, предложите мне способ.Любые другие комментарии, которые помогут мне понять больше сокетов, очень приветствуются.

Хотелось бы наконец узнать, что такое сокеты!

public class MainActivity extends AppCompatActivity {
ServerSocket serverSocket;
Thread socketServerThread = null;

protected void onCreate(Bundle savedInstanceState) {
    //...
    Globals.snd = MediaPlayer.create(this, R.raw.bike_horn);// Globals - static class
    //...
    socketServerThread = new Thread(new SocketServerThread());
    socketServerThread.start();
}
protected void onDestroy() {
    if (serverSocket != null) {...//try close it}
}
private class SocketServerThread extends Thread {
    //...
    static final int SocketServerPORT = 8080;
    public void run() {
        Socket socket = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        BufferedReader input = null;
        try {
            serverSocket = new ServerSocket();
            serverSocket.setReuseAddress(true);
            serverSocket.bind(new InetSocketAddress(SocketServerPORT));
            while (true) {
                socket = serverSocket.accept();
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                while(socket.isConnected()){
                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    message = input.readLine();
                    if(message == null) break;
                    int x = Integer.valueOf(message);
                    if(x == 1) Globals.snd.start();
                }
            }
        }catch (IOException e) {// print error stack
        }finally{//close socket, dataInputStream, dataOutputStream
        }

Код NodeMCU:

#include <ESP8266WiFi.h>
//...variables defined
void setup() {
    //...connect to wifi
    client.connect(host, port);
}
void loop() {
    if(!client.connected()){
        if (!client.connect(host, port)) {
            return;
        }
    }

    while(digitalRead(beepBtnPin) == LOW && client.connected()){
        client.println("2");
        client.flush();
        delay(500);
    }
}

1 Ответ

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

Вы должны поместить весь код после

socket = serverSocket.accept();

в так называемый клиентский поток.Обычно это делается для одновременной обработки большего количества клиентов.

Затем сервер немедленно ожидает подключения следующего клиента.

...