Я хочу сделать тот же запрос, что и с командой netcat «nc» на моем компьютере с ESP32:
Компьютер:
$ nc tcpbin.com 4242
Test
Test
Что я пробовал до сих пор:
#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");
}
}
Я почти уверен, что неправильно понял что-то из концепции 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);
}
}
@Juraj, запусти команду nc самостоятельно на основе адреса OP и посмотри. Для этого я действительно тестирую код перед публикацией.
Да, "nc" - хитрая маленькая программа. Меня уже кусали, если предположить, как это работает :)
@hcheung спасибо! Это работает, и я узнал кое-что новое! Спасибо!
используйте
while (localClient.connected()) {
иwhile (localClient.available() > 0) {