无法通过服务器/客户端方式使两个 ESP32 相互连接意味着使用 WiFi.h

问题描述 投票:0回答:1

我有两个 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 和服务器端口,但结果仍然相同。

server arduino network-programming wifi esp32
1个回答
0
投票

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();
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.