以下是一个在 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 编码消息。