我有两个 esp32,我试图通过路由器 wifi 网络在它们之间发送数据。它们彼此相距太远而无法直接通信,因此需要通过附近的路由器网络进行通信。我的代码一直有效,直到客户端 esp32 尝试连接到服务器 esp32。出于匿名目的,我使用 xxx 进行路由器登录,但在我这边,两台设备都正确连接到 wifi。我的客户端设备的代码是:
#include <WiFi.h>
#define serverPort 4080
char* ssid = "xxxxx";
const char* password = "xxxxx";
IPAddress serverAddress(192,168,0,180); // CHANGE TO ESP32#2'S IP ADDRESS
WiFiClient TCPclient;
void setup() {
Serial.begin(115200);
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
if (!TCPclient.connected()) {
Serial.println("Connection is disconnected");
TCPclient.stop();
// reconnect to TCP server (Arduino #2)
if (TCPclient.connect(serverAddress, serverPort)) {
Serial.println("Reconnected to TCP server");
} else {
Serial.println("Failed to reconnect to TCP server");
}
}
}
我的服务器端代码:
#include <WiFi.h>
#define SERVER_PORT 4080
char* ssid = "xxxx"; // CHANGE TO YOUR WIFI SSID
const char* password = "xxxx"; // CHANGE TO YOUR WIFI PASSWORD
IPAddress ip(192,168,0,180);
WiFiServer TCPserver(SERVER_PORT);
WiFiClient client;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP_STA);
WiFi.config(ip);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Print your local IP address:
Serial.print("ESP32 #2: TCP Server IP address: ");
Serial.println(WiFi.localIP());
// Start listening for a TCP client (from ESP32 #1)
TCPserver.begin();
if(TCPserver) {
Serial.println("Server created");
}
void loop() {
// Wait for a TCP client from ESP32 #1:
while(!client.connected()) {
client = TCPserver.available();
delay(1000);
Serial.println("Connecting to a client...");
}
Serial.print("Connected to client");
}
两台设备都正确连接到 WiFi。服务器已正确创建。在服务器端,串行监视器只是不断提示:“正在连接到客户端...”。在客户端,它只是一直提示:“连接已断开。无法重新连接到服务器”。我尝试过更改 IP 和服务器端口,但结果仍然相同。
WiFiClient 对象包装了一个 TCP 套接字。普通的 TCP 套接字连接到 IP 地址和端口。 WiFiServer 在端口上启动侦听套接字。如果远程客户端套接字联系监听套接字上的服务器,它会在空闲端口上创建与远程客户端套接字连接的本地套接字,并返回包装该套接字的 WiFiClient 对象。您写入或打印到 WiFiClient 的所有内容都会发送到该远程套接字。
如果您的客户端板创建了一个 WiFiClient 并将其连接到“服务器”板上 WiFiServer 的 IP 地址和端口,那么您可以从 server.available() 获得一个 WiFiClient,并且这两个 WiFiClient 对象已连接。您在一侧写入/打印的内容只能从另一侧的 WiFiClient 对象中读取。
客户端套接字
if (client.connect(serverIP, PORT)) {
client.print("request\n");
String response = client.readStringUntil('\n');
Serial.println(response);
client.stop();
}
服务器端
WiFiClient client = server.accept();
if (client && client.connected()) {
String request = client.readStringUntil('\n');
Serial.println(request);
client.print("response\n");
client.stop();
}