0

I have the attached script that reads data from a socket server (it is PHP at the server end).

My problem (I think) is that the readStringUntil() needs a test above it, so that it "reads up to \r" only if there is any data being received, otherwise it seems to keep trying to read forever, because when I DO send data, it is received with 1-2 seconds delay.

If I constantly send (properly \r delimited) data without any pause, then it seems to be received instantly (10-20ms or so).

I tried: if (client.available()) { String received_message = client.readStringUntil('\r'); } but it doesn't seem to be the right function, doesn't do anything.

This is ESP32 board, compiler mentioned it found two wifi libraries, one in arduino folder and one in ESP32, it used the second one. This might be relevant to what functions are available.

#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");

  // I assume this is where I need a test like "if any received data exists" >>>

  String received_message = client.readStringUntil('\r');
  Serial.println(received_message);
  

  // intentional delay doesn't seem to do much 
  // when it constantly tries to read for data that is not always there
  delay(100);

  // do I need to disconnect here ?!
  // client.stop();
}

EDIT: my PHP loop looks like this:

do{
    $accept = socket_accept($socket) or die("Could not accept incomming connection");

    // $message_to_send = 'hi there '.microtime(true)."\r";
    // OR 
    // get message from memcached variables
    
    if($message_to_send!=''){
        
        echo "\nsending: ".$message_to_send;
    
        socket_send($accept, $message_to_send, strlen($message_to_send), MSG_OOB);
    }
    
} while (true);
13
  • esp WiFi libraries close the connection when the last WiFiClient object which referenced it is destroyed. so here at the end of the loop(). – Juraj Jul 31 '20 at 16:49
  • does the server send data immediately after you connect to it? you send no request – Juraj Jul 31 '20 at 16:51
  • You mean that is when it closes it automatically or when I need to call the close ? Thanks. – adrianTNT Jul 31 '20 at 16:51
  • 1
    then you need project guidance and not an answer on a Q&A site. forum.arduino.cc – Juraj Jul 31 '20 at 18:17
  • 1
    I posted a topic exactly there under project guidance yesterday, nobody replied :/ – adrianTNT Jul 31 '20 at 19:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.