android 同ESP32进行基于TCP/IP的wifi通信示例

以下是一个在 Java 中直接与 ESP32 进行局域网通信的示例代码:

 

import java.io.*;
import java.net.*;

public class WifiCommunication {

    public static void main(String[] args) throws IOException {
        String esp32IpAddress = "192.168.4.1"; // ESP32 的 IP 地址
        int esp32Port = 80; // ESP32 的端口号

        // 创建客户端套接字并连接到 ESP32
        Socket clientSocket = new Socket(esp32IpAddress, esp32Port);

        // 获取输入输出流
        OutputStream outputStream = clientSocket.getOutputStream();
        InputStream inputStream = clientSocket.getInputStream();

        // 发送一条消息到 ESP32
        String message = "Hello, ESP32!";
        outputStream.write(message.getBytes("UTF-8"));

        // 接收来自 ESP32 的响应
        byte[] buffer = new byte[1024];
        int length = inputStream.read(buffer);
        String response = new String(buffer, 0, length, "UTF-8");
        System.out.println("Response from ESP32: " + response);

        // 关闭连接
        clientSocket.close();
    }

}




在这个示例中,我们使用 `Socket` 类创建了一个客户端套接字,然后连接到 ESP32 的 IP 地址和端口号。我们使用获取套接字的输入输出流来发送和接收数据。最后,我们关闭连接。请注意将 `esp32IpAddress` 更改为 ESP32 的实际 IP 地址,并将 `esp32Port` 更改为适当的 ESP32 端口号。

以下是一个简单的 ESP32 代码示例,用于在 WiFi 局域网中接收来自 Java 客户端发送的数据:

 

#include 

const char* ssid = "your_SSID";        // 填入 WiFi 名称
const char* password = "your_PASSWORD";    // 填入 WiFi 密码

// 创建 TCP 服务器并监听来自客户端的连接
WiFiServer server(80);

void setup() {
  Serial.begin(115200);

  // 连接到 WiFi 网络
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi.");

  // 启动服务器
  server.begin();
  Serial.println("Server started.");
}

void loop() {
  // 等待客户端连接
  WiFiClient client = server.available();
  if (client) {
    Serial.println("Client connected.");

    // 接收来自客户端的消息
    while (client.connected()) {
      if (client.available()) {
        String message = client.readStringUntil('\r');
        Serial.print("Received message: ");
        Serial.println(message);

        // 发送响应到客户端
        client.println("Message received.");
        break;
      }
    }

    // 关闭连接
    client.stop();
    Serial.println("Client disconnected.");
  }
}




在这个示例中,我们使用 `WiFiServer` 类创建了一个服务器,并在 WiFi 局域网上监听来自客户端(Java 程序)的连接。当有客户端连接到服务器时,ESP32 会接收从客户端发送的消息,并向客户端发送响应。注意在代码中将 `ssid` 和 `password` 分别替换为您的 WiFi 网络名称和密码。

请注意,该示例中默认使用端口号 `80`,如果您的 Java 客户端使用不同的端口号来连接 ESP32,则需要在 ESP32 代码中相应地更改端口号。

以下是一个简单的安卓代码示例,用于连接到指定 IP 地址的 ESP32 设备,并在通信界面上可以发送和接收消息。

首先是主界面的布局文件 `activity_main.xml`:

```xml





    



    

```

这个布局文件包含一个 `EditText` 和一个 `Button`,用于输入 ESP32 的 IP 地址并连接到它。接下来是与该布局文件相关联的 `MainActivity.java` 代码:

```java

import androidx.appcompat.app.AppCompatActivity;



import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;



import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import java.net.Socket;

import java.nio.charset.StandardCharsets;



public class MainActivity extends AppCompatActivity {



    private EditText mEditTextIpAddress;

    private Button mButtonConnect;



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        // 获取 UI 控件

        mEditTextIpAddress = findViewById(R.id.editText_ipAddress);

        mButtonConnect = findViewById(R.id.button_connect);



        // 设置 Connect 按钮的点击事件

        mButtonConnect.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                String ipAddress = mEditTextIpAddress.getText().toString();

                if (ipAddress.isEmpty()) {

                    Toast.makeText(MainActivity.this, R.string.toast_empty_ip_address, Toast.LENGTH_SHORT).show();

                    return;

                }

                Intent intent = new Intent(MainActivity.this, CommunicationActivity.class);

                intent.putExtra("IP_ADDRESS", ipAddress);

                startActivity(intent);

            }

        });

    }

}

```

这个 `MainActivity.java` 中主要是处理连接到 ESP32 的 IP 地址,并在 Connect 按钮上添加了一个点击事件,当用户单击按钮时,应用程序将跳转到 `CommunicationActivity.java` 中进行通信。

接下来是 `CommunicationActivity.java` 的布局文件和代码:

```xml





    



    



        

    



    



    

```

这个布局文件包含一个用于显示接收到的消息的 `TextView`、一个用于输入要发送的消息的 `EditText`、以及一个用于发送消息的 `Button`。 接下来是 `CommunicationActivity.java` 代码:

```java

import androidx.appcompat.app.AppCompatActivity;



import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ScrollView;

import android.widget.TextView;

import android.widget.Toast;



import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import java.net.Socket;

import java.nio.charset.StandardCharsets;



public class CommunicationActivity extends AppCompatActivity {



    private String mIpAddress;

    private Socket mClientSocket;

    private InputStream mInputStream;

    private OutputStream mOutputStream;



    private TextView mTextViewReceivedMessages;

    private EditText mEditTextMessageToSend;

    private Button mButtonSendMessage;



    private boolean mIsConnected = false;



    private Handler mHandler = new Handler(Looper.getMainLooper());



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_communication);



        // 获取 IP 地址

        mIpAddress = getIntent().getStringExtra("IP_ADDRESS");



        // 获取 UI 控件

        mTextViewReceivedMessages = findViewById(R.id.textView_receivedMessages);

        mEditTextMessageToSend = findViewById(R.id.editText_messageToSend);

        mButtonSendMessage = findViewById(R.id.button_sendMessage);



        // 连接到 ESP32

        connectToEsp32();



        // 设置 Send 按钮的点击事件

        mButtonSendMessage.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                if (!mIsConnected) {

                    Toast.makeText(CommunicationActivity.this, R.string.toast_not_connected, Toast.LENGTH_SHORT).show();

                    return;

                }

                String messageToSend = mEditTextMessageToSend.getText().toString();

                if (messageToSend.isEmpty()) {

                    Toast.makeText(CommunicationActivity.this, R.string.toast_empty_message, Toast.LENGTH_SHORT).show();

                    return;

                }

                sendMessage(messageToSend);

            }

        });

    }



    @Override

    protected void onDestroy() {

        super.onDestroy();

        // 断开与 ESP32 的连接

        disconnectFromEsp32();

    }



    private void connectToEsp32() {

        try {

            // 创建 Socket 并连接到 ESP32

            mClientSocket = new Socket();

            mClientSocket.connect(new InetSocketAddress(mIpAddress, 80), 5000);

            mInputStream = mClientSocket.getInputStream();

            mOutputStream = mClientSocket.getOutputStream();



            // 启动接收消息的线程

            startMessageReceiverThread();



            mIsConnected = true;

            showToastOnUiThread(R.string.toast_connected_to_esp32);

        } catch (IOException e) {

            e.printStackTrace();

            showToastOnUiThread(R.string.toast_connection_failed);

        }

    }



    private void disconnectFromEsp32() {

        try {

            if (mIsConnected) {

                mClientSocket.close();

                mIsConnected = false;

                showToastOnUiThread(R.string.toast_disconnected_from_esp32);

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }



    private void startMessageReceiverThread() {

        Thread messageReceiverThread = new Thread(new Runnable() {

            @Override

            public void run() {

                byte[] buffer = new byte[1024];

                int length;

                while (mIsConnected) {

                    try {

                        length = mInputStream.read(buffer);

                        if (length > 0) {

                            final String receivedMessage = new String(buffer, 0, length, StandardCharsets.UTF_8);

                            mHandler.post(new Runnable() {

                                @Override

                                public void run() {

                                    appendMessageToTextView(receivedMessage);

                                }

                            });

                        }

                    } catch (IOException e) {

                        e.printStackTrace();

                        showToastOnUiThread(R.string.toast_connection_lost);

                        mIsConnected = false;

                    }

                }

            }

        });

        messageReceiverThread.start();

    }



    private void sendMessage(String message) {

        try {

            byte[] buffer = message.getBytes(StandardCharsets.UTF_8);

            mOutputStream.write(buffer);



            // 清空消息输入框

            mEditTextMessageToSend.getText().clear();

        } catch (IOException e) {

            e.printStackTrace();

            showToastOnUiThread(R.string.toast_failed_to_send_message);

        }

    }



    private void appendMessageToTextView(String message) {

        if (mTextViewReceivedMessages.getText().length() > 0) {

            mTextViewReceivedMessages.append("\n");

        }

        mTextViewReceivedMessages.append(message);

        // 自动滚动到底部

        final ScrollView scrollView = findViewById(R.id.scrollView_receivedMessages);

        scrollView.post(new Runnable() {

            @Override

            public void run() {

                scrollView.fullScroll(View.FOCUS_DOWN);

            }

        });

    }



    private void showToastOnUiThread(final int messageId) {

        mHandler.post(new Runnable() {

            @Override

            public void run() {

                Toast.makeText(CommunicationActivity.this, messageId, Toast.LENGTH_SHORT).show();

            }

        });

    }

}

```

这个 `CommunicationActivity.java` 中主要实现了连接到 ESP32 并发送和接收消息的逻辑。在 `onCreate` 方法中,我们获取传递给活动的 IP 地址,并调用 `connectToEsp32()` 方法进行连接。

当用户单击 Send 按钮时,我们将调用 `sendMessage()` 方法来发送消息。我们还使用 `startMessageReceiverThread()` 方法启动一个线程,以便能够接收从 ESP32 发送的消息。

最后,我们还添加了一些帮助程序方法,例如 `appendMessageToTextView()` 方法,用于向接收到的消息文本视图中添加接收到的消息。请注意,在 `sendMessage()` 和 `appendMessageToTextView()` 方法中,我们都使用 `StandardCharsets.UTF_8` 将字符串编码为字节以支持包含中文字符的 UTF-8 编码消息。

你可能感兴趣的:(android,tcp/ip,java)