从Android TCP客户端应用程序到ESP8266模块的数据传输问题,反之亦然

问题描述 投票:1回答:0

我正在尝试编写一个可以通过WiFi与ESP8266模块进行通信的Android应用程序,并交换一些简单的基本文本数据。 我的问题是我无法进行任何沟通。 我不确定我的问题是Android代码还是ESP上的一些糟糕的网络配置。

在Android方面,我使用来自此线程的标准TCPclient类代码来传输数据。 在这个应用程序中,我可以使用WiFi工作,并使用SSID和密码授权连接ESP模块。

这就是我的应用程序的样子。 在此输入图像描述


这是我使用的TCPclient.java类代码。

package com.example.wexfo.wifi_com;

import ...

public class TCPclient {

    private String serverMessage;
    public static final String SERVER_IP = "192.168.0.102";
    public static final int SERVER_PORT = 4444;
    private OnMessageReceived messageListener = null;
    private boolean run = false;

    public static final String LOG_TAG = "TCP";


    PrintWriter out;
    BufferedReader in;


    public TCPclient(OnMessageReceived listener) {

        messageListener = listener;
    }


    public void sendMessage(String message) {

        if (out != null && !out.checkError()) {
            out.println(message);
            out.flush();
        }
    }


    public void stopClient() {

        run = false;

        if (out != null) {
            out.flush();
            out.close();
        }

        messageListener = null;
        in = null;
        out = null;
        serverMessage = null;
    }


    public void run() {

        run = true;

        try {
            InetAddress serverAddress = InetAddress.getByName(SERVER_IP);

            Log.e(LOG_TAG, "C: Connecting...");

            Socket socket = new Socket(serverAddress, SERVER_PORT);

            try {
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                Log.e(LOG_TAG, "C: Sent.");
                Log.e(LOG_TAG, "C: Done.");

                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                while (run) {
                    serverMessage = in.readLine();

                    if (serverMessage != null && messageListener != null) {
                        messageListener.messageReceived(serverMessage);
                    }
                    //serverMessage = null;
                }
                Log.e(LOG_TAG, "S: Received message: '" + serverMessage + "'.");
            }
            catch (Exception e) {
                Log.e(LOG_TAG, "S: Error", e);
            }
            finally {
                socket.close();
            }
        }
        catch (Exception e) {
            Log.e(LOG_TAG, "C: Error", e);
        }
    }


    public interface OnMessageReceived {
        void messageReceived(String message);
    }
}


下面是MainActivity.java代码。

package com.example.wexfo.wifi_com;

import ...

public class MainActivity extends AppCompatActivity {

    // Labels and edits
    private TextView connectionText;
    private EditText messageText;
    private TextView chatText;

    // Buttons
    private ToggleButton connectButton;
    private Button sendButton;

    // Wifi connection
    private static final String NET_SSID = "AI-THINKER";
    private static final String NET_PASSWD = "aiTHINKERwifi";
    private WifiConfiguration wifiConfig;
    private WifiManager wifiManager;

    // Other
    private TCPclient tcpClient;


    private void printChatLine(String text) {
        chatText.append("\n>> " + text);
    }

    private void printChatLine(String who, String text) {
        chatText.append("\n" + who + ": " + text);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        connectionText = (TextView) findViewById(R.id.connectionText);
        messageText = (EditText) findViewById(R.id.messageText);

        chatText = (TextView) findViewById(R.id.chatText);
        chatText.setMovementMethod(new ScrollingMovementMethod());
        printChatLine("chat test");


        // WiFi setup (authorization hard-coded for now)

        wifiConfig = new WifiConfiguration();
        wifiConfig.SSID = "\"" + NET_SSID + "\"";
        wifiConfig.preSharedKey = "\"" + NET_PASSWD + "\"";

        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiManager.addNetwork(wifiConfig);


        connectButton = (ToggleButton) findViewById(R.id.connectButton);
        connectButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (connectButton.isChecked()) {

                    connectionText.setText("Disconnect WiFi");

                    if (!wifiManager.isWifiEnabled())
                        wifiManager.setWifiEnabled(true);

                    List<WifiConfiguration> netList = wifiManager.getConfiguredNetworks();
                    for (WifiConfiguration net : netList) {
                        if (net.SSID != null && net.SSID.equals("\"" + NET_SSID + "\"")) {
                            wifiManager.disconnect();
                            wifiManager.enableNetwork(net.networkId, true);
                            wifiManager.reconnect();

                            break;
                        }
                    }

                    // Start server connection thread
                    new ConnectTask().execute("");
                }

                else {

                    connectionText.setText("Connect WiFi");

                    if (wifiManager.isWifiEnabled())
                        wifiManager.setWifiEnabled(false);

                    // Stop server connection thread
                    if (tcpClient != null)
                        tcpClient.stopClient();
                }
            }
        });


        sendButton = (Button) findViewById(R.id.sendButton);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = messageText.getText().toString();

                printChatLine("ME", message);
                messageText.setText("");

                // Send message to ESP
                if (tcpClient != null)
                    tcpClient.sendMessage(message);

            }
        });
    }


    public class ConnectTask extends AsyncTask<String,String,TCPclient> {

        @Override
        protected TCPclient doInBackground(String... message) {
            tcpClient = new TCPclient(new TCPclient.OnMessageReceived() {
                @Override
                public void messageReceived(String message) {
                    publishProgress(message);
                }
            });

            tcpClient.run();

            return null;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);

            // Received message from ESP
            printChatLine("ES", values[0]);
        }
    }
}


现在ESP8266已设置为SoftAP

AT+CWMODE?
+CWMODE:3

OK

然后我为多个连接进行基本设置并启动一个新服务器。

AT+CIPSTA="192.168.0.102"

OK
AT+CIPMUX=1

OK
AT+CIPSERVER=1,4444

OK

这是我的IP数据。

AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"1a:fe:34:8e:81:58"
+CIFSR:STAIP,"192.168.0.102"
+CIFSR:STAMAC,"18:fe:34:8e:81:58"

OK

现在,当我运行我的应用程序时,我可以确认我已连接到ESP的接入点。

AT+CWLIF
192.168.4.2,00:27:15:77:82:02

OK

但是,ESP上没有打开连接的迹象,单击“ SEND按钮不会进行任何数据传输。 当我尝试通过ESP连接时,我收到了ERROR

AT+CIPSTART=0,"TCP","192.168.4.2",4444
0,CLOSED

ERROR

我的感觉是应用程序工作正常,但我在ESP方面做了一些可怕的错误,我无法弄清楚它是什么。 也许我对整个设置有错误的想法?

java android android-wifi at-command esp8266
© www.soinside.com 2019 - 2024. All rights reserved.