Elc*_*man 1 tcp arduino esp8266 arduino-esp8266 esp32
我想使用 ESP32 在我的计算机上执行与 netcat“nc” 命令相同的请求:
电脑:
$ nc tcpbin.com 4242
Test
Test
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
#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 概念。然而,在尝试了各种方法并尝试其他代码片段之后,我无法找到解决方案。
先感谢您
问候莱昂
您的代码有几个问题。
如果您测试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)