TCP-клиент readStringUntil только при наличии данных
У меня есть прикрепленный скрипт, который считывает данные с сокет-сервера (это PHP на стороне сервера).
Моя проблема (я думаю) заключается в том, что readStringUntil()
нуждается в тестировании над ним, чтобы он "считывал до \ r" только в том случае, если получены какие-либо данные, в противном случае он, похоже, продолжает пытаться читать вечно, потому что, когда я отправляю данные, они принимаются за 1-2 секунды задержка.
Если я постоянно отправляю (с правильными разделителями \ r) данные без какой-либо паузы, то, похоже, они принимаются мгновенно (10-20 мс или около того).
Я попробовал: if (client.available()) { String received_message = client.readStringUntil('\r'); }
но, похоже, это неправильная функция, ничего не делает.
Это плата ESP32, компилятор упомянул, что он нашел две библиотеки wifi, одну в папке arduino и одну в ESP32, она использовала вторую. Это может иметь отношение к тому, какие функции доступны.
#include <WiFi.h>
const char* ssid = "MyWiFi";
const char* password = "1234";
const uint16_t port = 8080;
const char * host = "myserver.example.com";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("...");
}
Serial.print("wifi connected with IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection to host failed");
delay(500);
return;
}
Serial.println("connected to server");
// Я предполагаю, что именно здесь мне нужен тест типа "существуют ли какие-либо полученные данные" >>>
String received_message = client.readStringUntil('\r');
Serial.println(received_message);
// преднамеренная задержка, похоже, мало что дает
// когда он постоянно пытается прочитать данные, которые не всегда есть
delay(100);
// нужно ли мне отключаться здесь ?!
// клиент.стоп();
}
ОТРЕДАКТИРОВАНО: мой цикл PHP выглядит следующим образом:
do{
$accept = socket_accept($socket) or die("Could not accept incomming connection");
// $message_to_send = 'hi there '.microtime(true)."\r";
// ИЛИ
// получить сообщение из переменных memcached
if($message_to_send!=''){
echo "\nsending: ".$message_to_send;
socket_send($accept, $message_to_send, strlen($message_to_send), MSG_OOB);
}
} while (true);
@adrianTNT, 👍1
Обсуждение0
- Веб-сервер ESP8266 недоступен через 2 минуты после сброса
- Несколько подключений WiFi клиент/сервер
- Как отобразить информацию о шине CAN на веб-сервере EPS32?
- Как сделать два (или более) PIN доступными по URL-адресу сервера?
- Несколько клиентских серверов через Wi-Fi
- WebSocketsServer.h: No such file or directory
- Как разрешить междоменные запросы на ESP8266 WebServer
- ESP8266 TCP-соединение WiFiClient проблема
библиотеки esp WiFi закрывают соединение, когда уничтожается последний объект WiFiClient, который ссылался на него. итак, здесь, в конце цикла()., @Juraj
отправляет ли сервер данные сразу после того, как вы подключаетесь к нему? вы не отправляете никакого запроса, @Juraj
Вы имеете в виду, что это происходит, когда он закрывает его автоматически или когда мне нужно вызвать закрытие? Спасибо., @adrianTNT
Сервер немедленно отправляет данные, если я ему прикажу, он находится внутри бесконечного цикла, где я заставляю его проверять наличие новых данных и отправлять их, если они найдены. Задержка появляется, когда он зацикливается, не имея данных для отправки, а затем начинает что-то отправлять., @adrianTNT
Если цикл постоянно отправляет данные с правильными разделителями в каждом цикле (например, `привет".microtime (true)."\ r")", то задержки нет., @adrianTNT
ваш клиент подключается и отключается в каждом цикле (). сделайте WiFiClient глобальным, подключайте его обратно только тогда, когда он отключается. и тогда будет работать
if (client.available())
, @JurajВы имеете в виду, что "client.connect" в верхней части цикла вызывает задержку? Я не думаю, что это потому, что если я закомментирую
client.readStringUntil()
, то цикл будет намного быстрее., @adrianTNTДолжен ли я переместить
WiFiClient
прямо надloop(){}
, чтобы сделать его глобальным? И я не знаю, как подключить его обратно, когда он отключится :/, @adrianTNTclient.readStringUntil()
секунду ожидает получения данных. если сервер отправляет данные сразу после установления соединения с клиентом, то readStringUntil перехватит их. если он отправляет данные позже, значит, соединение уже закрыто.если (!подключено) подключиться
, @JurajЯ не знаю, как использовать "подключенный" код, о котором вы упомянули., @adrianTNT
тогда вам нужно руководство по проекту, а не ответ на сайте вопросов и ответов. https://forum.arduino.cc/, @Juraj
Вчера я разместил тему именно там под руководством проекта, никто не ответил :/, @adrianTNT
Я этого там не вижу., @Juraj