arduino平台esp32主从板tcp通信
时间: 2025-06-12 14:05:23 浏览: 22
<think>我们正在Arduino平台上实现ESP32主从板之间的TCP通信。根据引用内容,我们知道可以通过WiFi建立TCP连接,其中一方作为服务器(TCPServer),另一方作为客户端(TCPClient)。引用[1]和[3]提到了TCPServer/Client的编程实践。步骤:1.配置WiFi网络:确保两个ESP32连接到同一个WiFi网络(或一个ESP32作为AP,另一个作为STA连接至该AP)。2.选择通信模式:一个ESP32作为TCP服务器(Server),另一个作为TCP客户端(Client)。3.编写代码:服务器等待客户端连接,客户端连接到服务器后即可互相发送数据。我们将提供两个示例代码:一个用于服务器(从机),一个用于客户端(主机)。注意事项:-服务器需要设置一个固定的IP地址,或者客户端通过服务器的热点名称(如果服务器作为AP)进行连接。但更常见的做法是两者都连接到同一个路由器,服务器使用固定IP或者通过mDNS(如使用hostname)进行连接,或者通过广播服务器IP。-这里我们假设两者都连接到同一个路由器,服务器使用固定本地IP(例如192.168.1.100)或动态获取IP(客户端可以通过服务器的主机名连接,但Arduino中需要实现MDNS,或者通过广播发现,为简化,我们使用固定IP)。但是,在Arduino的WiFi库中,我们可以设置静态IP,但需要确保该IP在路由器中未被使用,或者使用DHCP并打印出服务器的IP,然后客户端使用该IP连接。我们这里先采用动态IP,并在服务器启动后打印IP地址,然后客户端代码中手动填入该IP。另一种方法是使用AP模式:让一个ESP32(服务器)作为AP,另一个作为STA连接到这个AP。这样服务器的IP地址固定(通常为192.168.4.1),客户端连接至该AP后直接连接这个IP即可。我们将分别提供两种方式的代码(同一路由器下的动态IP和AP模式)。但用户要求是主从板之间的TCP通信,这里我们以同一路由器下的动态IP为例,并且提供AP模式作为备选。###方案一:同一路由器下(动态IP,需要串口打印服务器IP)-服务器(TCPServer):1.连接到WiFi(STA模式)。2.启动TCP服务器,监听端口(例如12345)。3.打印服务器的IP地址,以便客户端使用。-客户端(TCPClient):1.连接到同一WiFi(STA模式)。2.根据服务器打印的IP地址,连接服务器的TCP端口(12345)。###方案二:AP模式(服务器作为AP)-服务器(AP):1.设置ESP32为AP模式,创建热点(如SSID:ESP32_AP,密码:12345678)。2.启动TCP服务器,监听端口(12345),服务器IP固定为192.168.4.1。-客户端(STA):1.连接至AP(SSID:ESP32_AP,密码:12345678)。2.连接服务器IP(192.168.4.1)的端口12345。我们根据用户需求选择方案一(同一路由器下),因为更常见。如果用户没有路由器,也可以选择方案二(AP模式),我们将提供两个方案的示例。这里我们以方案一为基础编写代码。注意:需要在客户端代码中手动填入服务器IP(从串口监视器获取)。###服务器代码(TCPServer)```arduino#include<WiFi.h>constchar*ssid="your_SSID";//替换为你的WiFi名称constchar*password="your_PASSWORD";//替换为你的WiFi密码WiFiServerserver(12345);//端口号12345voidsetup(){Serial.begin(115200);//连接WiFiWiFi.begin(ssid,password);while(WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("\nWiFiconnected.");//启动TCP服务器server.begin();Serial.println("TCPserverstarted.");//打印服务器的IP地址Serial.print("ServerIPaddress:");Serial.println(WiFi.localIP());}voidloop(){//等待客户端连接WiFiClientclient=server.available();if(client){Serial.println("Newclientconnected.");//与客户端通信while(client.connected()){//如果有数据可读if(client.available()>0){charc=client.read();Serial.print(c);//回显给客户端client.write(c);}}client.stop();Serial.println("Clientdisconnected.");}}```###客户端代码(TCPClient)```arduino#include<WiFi.h>constchar*ssid="your_SSID";//替换为你的WiFi名称constchar*password="your_PASSWORD";//替换为你的WiFi密码constchar*server_ip="192.168.1.100";//替换为服务器打印的IP地址constintserver_port=12345;WiFiClientclient;voidsetup(){Serial.begin(115200);//连接WiFiWiFi.begin(ssid,password);while(WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("\nWiFiconnected.");//连接TCP服务器if(client.connect(server_ip,server_port)){Serial.println("Connectedtoserver.");client.write("HelloServer!");//发送一条消息}else{Serial.println("Connectionfailed.");}}voidloop(){//如果连接成功,接收服务器返回的数据并打印if(client.connected()&&client.available()){charc=client.read();Serial.print(c);}//定期发送数据(例如每5秒)staticunsignedlonglast_time=0;if(millis()-last_time>=5000){last_time=millis();if(client.connected()){client.write("Pingfromclient.");Serial.println("Sent:Pingfromclient.");}}}```###使用步骤:1.将服务器代码上传到作为服务器的ESP32(从机)上。2.打开串口监视器,记录服务器的IP地址。3.修改客户端代码中的`server_ip`为刚刚记录的IP地址。4.将客户端代码上传到作为客户端的ESP32(主机)上。5.打开两个串口监视器(分别对应服务器和客户端),观察通信情况。说明:-服务器在收到客户端的数据后会回显(echo)相同的数据给客户端。-客户端在启动时发送"HelloServer!",然后每隔5秒发送"Pingfromclient."。-服务器会打印收到的数据,同时回显给客户端,客户端打印收到的回显数据。###方案二(AP模式)的调整:如果需要使用AP模式(服务器作为热点),修改服务器代码:在服务器代码的setup()中,将连接WiFi的部分改为启动AP模式:```arduino//删除连接WiFi的代码,改为:WiFi.softAP("ESP32_AP","12345678");//设置热点名称和密码Serial.print("APIPaddress:");Serial.println(WiFi.softAPIP());//打印AP的IP地址(通常是192.168.4.1)```客户端代码中:-修改连接的SSID和密码为热点的SSID和密码(即ESP32_AP和12345678)。-修改server_ip为"192.168.4.1"。###注意事项:1.确保两个代码中使用的端口一致(这里都是12345)。2.同一路由器下,如果路由器开启了防火墙,可能需要配置允许该端口。3.实际应用中,应加入错误处理和重连机制。###相关问题:1.如何实现多个客户端连接?上面的服务器一次只能连接一个客户端,如需多个,需要使用多个WiFiClient对象并采用非阻塞方式,或者使用多任务(FreeRTOS)。2.如何加密通信?考虑使用TLS(SSL)加密传输。3.如何实现更复杂的协议(如HTTP)?</think>
在Arduino平台上实现两个ESP32板之间的TCP通信,可参考以下配置方案和示例代码。根据引用内容,建议采用主从结构(主机作为TCP客户端,从机作为TCP服务器),并使用WiFi通信模式[^1][^3]。
### 一、硬件配置方案
```mermaid
graph LR
A[主机ESP32] -->|WiFi TCP| B[从机ESP32]
B -->|AP模式| C[路由器/热点]
A -->|STA模式| C
```
**关键参数说明:**
- 通信方式:WiFi TCP/IP
- 传输距离:50-100米
- 主机角色:TCP客户端(发起连接)
- 从机角色:TCP服务器(监听端口)
- 建议端口:333(可自定义3000-50000)
---
### 二、从机代码(TCP服务器)
```arduino
#include <WiFi.h>
const char* ssid = "Your_AP_SSID"; // 修改为热点名称
const char* password = "Your_AP_PASS"; // 修改为热点密码
WiFiServer server(333); // 监听端口333
void setup() {
Serial.begin(115200);
// 连接WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.print("Server IP: ");
Serial.println(WiFi.localIP()); // 打印从机IP(需告知主机)
server.begin(); // 启动TCP服务器
}
void loop() {
WiFiClient client = server.available();
if (client) {
Serial.println("Client connected");
while (client.connected()) {
if (client.available()) {
String data = client.readStringUntil('\n');
Serial.print("Received: ");
Serial.println(data);
// 回传响应(可选)
client.print("ACK: " + data + "\n");
}
}
client.stop();
Serial.println("Client disconnected");
}
}
```
---
### 三、主机代码(TCP客户端)
```arduino
#include <WiFi.h>
const char* ssid = "Your_AP_SSID"; // 与从机相同的热点
const char* password = "Your_AP_PASS";
const char* server_ip = "192.168.1.100"; // 修改为从机实际IP
const int server_port = 333; // 与从机端口一致
WiFiClient client;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
// 连接TCP服务器
if (client.connect(server_ip, server_port)) {
Serial.println("Connected to server");
} else {
Serial.println("Connection failed!");
}
}
void loop() {
if (client.connected()) {
// 发送数据(示例)
client.print("Hello from Host!\n");
// 接收响应(可选)
if (client.available()) {
String response = client.readStringUntil('\n');
Serial.println("Server: " + response);
}
}
delay(2000); // 每2秒发送一次
}
```
---
### 四、配置步骤
1. **硬件准备**:
- 两个ESP32开发板(如ESP32-DevKitC)
- 共用同一个WiFi热点(路由器或手机热点)
2. **参数配置**:
- 修改代码中的热点名称(`Your_AP_SSID`)和密码(`Your_AP_PASS`)
- 在从机串口监视器查看并记录IP地址(格式如`192.168.1.100`)
- 将IP填入主机代码的`server_ip`变量
3. **上传顺序**:
```mermaid
sequenceDiagram
参与者 从机->>从机: 上传服务器代码
从机->>串口监视器: 显示IP地址
参与者 主机->>主机: 填入从机IP后上传客户端代码
```
4. **测试流程**:
- 打开两个串口监视器(波特率115200)
- 主机每2秒发送消息,从机接收并打印
- 成功标志:主机显示`Connected to server`,从机显示`Client connected`
---
### 五、常见问题解决
1. **连接失败**:
- 检查热点信号强度(RSSI > -70dBm)
- 确认防火墙未拦截端口333
- 重启路由器释放IP冲突
2. **数据丢失**:
- 添加数据分隔符(如`\n`)
- 减少发送频率(参考代码中的`delay(2000)`)
- 增加重发机制:
```arduino
// 在主机发送代码后添加
if (!client.connected()) {
client.connect(server_ip, server_port); // 自动重连
}
```
3. **AP模式优化**:
若使用ESP32自建热点(替代路由器):
```arduino
// 在从机setup()中添加
WiFi.softAP("ESP32_AP", "12345678"); // 创建热点
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP()); // 默认IP 192.168.4.1
```
---
### 六、进阶应用
1. **多从机扩展**:采用端口复用或IP广播实现1对N通信[^2]
2. **数据加密**:添加TLS/SSL层(需使用`WiFiClientSecure`)
3. **低功耗优化**:在`loop()`中添加`esp_sleep_enable_timer_wakeup()`实现间歇唤醒
阅读全文
相关推荐


















