应粉丝需要特别做了一期,本教程将详细讲解如何实现两个ESP32开发板之间的无线通信,主机作为TCP客户端,从机作为TCP服务器。提供完整代码及逐行解析。
一、通信方案选择
1.1 方案对比
通信方式 | 传输距离 | 速率 | 复杂度 | 功耗 |
---|---|---|---|---|
Wi-Fi | 50-100m | 高 | 中 | 中 |
蓝牙BLE | 10-50m | 中 | 高 | 低 |
SPI | <1m | 极高 | 中 | 低 |
I2C | <1m | 中 | 低 | 低 |
本教程选用Wi-Fi TCP通信方案,适合大多数物联网场景。
二、开发环境准备
-
Arduino IDE 2.3.2+
-
安装ESP32开发包(通过Arduino Boards Manager)
-
USB数据线*2
-
路由器(或使用ESP32 SoftAP模式)
三、从机(TCP服务器)配置
3.1 硬件连接
-
通过USB连接电脑
-
无额外硬件要求
3.2 完整代码
#include <WiFi.h>
// 网络配置
const char* ssid = "Your_SSID"; // 路由器SSID
const char* password = "Your_PASS"; // 路由器密码
const int port = 3333; // 端口号
WiFiServer server(port);
void setup() {
Serial.begin(115200);
// 连接Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// 启动TCP服务器
server.begin();
}
void loop() {
WiFiClient client = server.available();
if (client) {
Serial.println("New Client Connected");
while (client.connected()) {
if (client.available()) {
String message = client.readStringUntil('\n');
Serial.print("Received: ");
Serial.println(message);
// 发送响应
client.print("ACK: ");
client.println(message);
}
}
client.stop();
Serial.println("Client Disconnected");
}
}
3.3 关键代码解析
-
WiFiServer server(port)
:创建TCP服务器实例 -
server.available()
:检测客户端连接 -
readStringUntil('\n')
:读取直到换行符 -
client.print()
:发送数据到客户端
四、主机(TCP客户端)配置
4.1 硬件连接
-
通过USB连接电脑
-
确保与从机在同一网络
4.2 完整代码
#include <WiFi.h>
// 网络配置
const char* ssid = "Your_SSID"; // 与从机相同
const char* password = "Your_PASS";
const char* host = "192.168.1.100"; // 从机IP地址
const int port = 3333;
WiFiClient client;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
}
void loop() {
if (!client.connected()) {
Serial.println("Attempting connection...");
if (client.connect(host, port)) {
Serial.println("Connected to server");
} else {
Serial.println("Connection failed");
delay(5000);
return;
}
}
// 发送数据
static unsigned long timer = 0;
if (millis() - timer > 3000) {
String data = "Hello_" + String(millis());
client.println(data); // 注意使用println自动添加\n
// 接收响应
String response = client.readStringUntil('\n');
Serial.print("Server response: ");
Serial.println(response);
timer = millis();
}
}
4.3 关键代码解析
-
client.connect()
:连接到指定IP和端口 -
client.println()
:带换行符发送 -
readStringUntil('\n')
:同步读取响应
五、部署与测试流程
5.1 操作步骤
-
将从机代码中的
Your_SSID
和Your_PASS
改为实际值 -
上传从机代码,记录打印的IP地址
-
修改主机代码中的
host
值为从机IP -
上传主机代码
5.2 预期输出
从机串口:
WiFi connected
IP Address: 192.168.1.100
New Client Connected
Received: Hello_12345
Client Disconnected
主机串口:
Connected to WiFi
Server response: ACK: Hello_12345
六、进阶优化建议
6.1 稳定性增强
// 增加超时机制
client.setTimeout(5000);
// 添加心跳包检测
if (millis() - lastHeartbeat > 15000) {
client.println("HB");
lastHeartbeat = millis();
}
6.2 数据加密
建议使用SSL/TLS:
#include <WiFiClientSecure.h>
WiFiClientSecure client;
client.setCACert(root_ca); // 添加证书
6.3 SoftAP模式
从机可设置为AP:
WiFi.softAP("ESP32_AP", "12345678");
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP());
七、常见问题排查
Q1: 连接超时
-
确认IP地址正确
-
检查防火墙设置
-
验证端口未被占用
Q2: 数据不完整
-
确保使用
println
添加终止符 -
增加数据校验:
client.print(data.length());
client.print(":");
client.println(data);
Q3: 频繁断开
-
添加重连机制:
void reconnect() {
while (!client.connected()) {
if (client.connect(host, port)) {
// 重连后初始化操作
}
}
}
本教程提供完整的ESP32主从机通信解决方案,可根据实际需求扩展更多功能。建议使用PlatformIO进行项目管理,获得更好的开发体验。