ESP32:发送简单的 TCP 消息并接收响应

Elc*_*man 1 tcp arduino esp8266 arduino-esp8266 esp32

我想使用 ESP32 在我的计算机上执行与 netcat“nc” 命令相同的请求:

电脑:

$ nc tcpbin.com 4242
Test
Test
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的:

创建一个wifi客户端并听听答案:

  • 连接到 TCP 服务器
  • 写一个信息
  • 等待并阅读答案
#include <Arduino.h>
#include <WiFi.h>

WiFiClient localClient;

const char* ssid = "...";
const char* password = "...";

const uint port = 4242;
const char* ip = "45.79.112.203"; // tcpbin.com's ip


void setup() {
  Serial.begin(115200);
  Serial.println("Connect Wlan");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());
}

void loop() {
  sendRequest();
  delay(200);
}

void sendRequest() {
  if(!localClient.connected()) {
    if (localClient.connect(ip, port)) {
      Serial.println("localClient connected");
      localClient.write('A'); //Single char
      Serial.println("msg sent");
    }
  }

  if(localClient.connected()) {
    Serial.println("Start reading");
    if (localClient.available() > 0) {
      char c = localClient.read();
      Serial.print(c);
    }
    Serial.println("Stop reading");
  }
  
}

Run Code Online (Sandbox Code Playgroud)

我很确定我在实现过程中误解了 tcp 概念。然而,在尝试了各种方法并尝试其他代码片段之后,我无法找到解决方案。

先感谢您

问候莱昂

hch*_*ung 6

您的代码有几个问题。

如果您测试nc,您会注意到服务器在您按“返回”之前不会回复。您在代码中发送单个字节而没有终止,因此服务器正在等待后续数据。要终止数据,您需要发送 '\n',或者不使用client.write('A'),而是使用client.println('A')

网络响应需要时间,您当前的代码期望立即响应,而无需等待if (localClient.available() > 0)

这是可以工作的代码:

void sendRequest() {

  if (localClient.connect(ip, port)) {                 // Establish a connection

      if (localClient.connected()) {
        localClient.println('A');                      // send data
        Serial.println("[Tx] A");
      }

      while (!localClient.available());                // wait for response
      
      String str = localClient.readStringUntil('\n');  // read entire response
      Serial.print("[Rx] ");
      Serial.println(str);
 
  }
  
}
Run Code Online (Sandbox Code Playgroud)