http.getString() vuota

salve a tutti
sto usando due esp32, uno come tx ed un come rx (in wifi) per poter dialogare e fare in modo che il tx invii, con get, una stringa che poi deve essere visualizzata su un display montato su rx.
(quasi) tutto funziona senza problemi ed il codice di ritorno da rx a tx è 200.
Se però chiedo al tx di darmi il famoso payload ( cioè http.getString() ), quello che arriva è una stringa vuota.
La stessa libreria, se invio un get sul mio server, mi restituisce il payload pieno e visibile, quindi non credo sia un bug della libreria stessa.
Credo a questo punto di sbagliare qualcosa quando scrivo il codice client.etc-etc
La libreria httpclient che uso è version=1.2, contenuta nella cartella di default
\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\HTTPClient\src

Il modulo rx lo faccio rispondere con questo codice

client.println("HTTP/1.1 200 OK");
client.println("Connection: close");

ho provato anche questo :

client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");

ma il risultato del getString, sul tx, non cambia : ho solo il 200 restituito da http.GET();

Gradirei un consiglio/input/aiuto per capire dove sto sbagliando, visto che in giro ho trovato solo info su esp8266 ed in ogni caso con librerie differenti da quella da me usata

Il metodo GET non prevede alcun payload, ma viene tutto passato come parametro nella richiesta HTTP.

GET /myendpoint?param1=150&param2=HelloWolrd

Se devi mandare del testo però alcuni caratteri (come lo spazio) non possono essere usati nel url, ma devi usare il corrispondente codice HTML

Ciao e grazie per la risposta.
Forse mi sono spiegato male. Quello che dici tu già lo faccio.
Col get, in uscita dal tx, uso una stringa tipo la tua.
Viene presa dall'rx e rielaborata senza problemi.
A questo punto rx risponde con client.println("HTTP/1.1 200 OK") e il tx riceve 200.
e fin qui ok
Solo che tx non riceve nulla come getString(). Con lo stesso codice su esposto, su chiamate verso un server esterno, la stringa ricevuta è piena ma su chiamata su esp32 la stringa ricevuta risulta vuota.
Cosa manca a rx per fare in modo che invii un qualcosa che riempia getString() in lettura del tx ?

p.s. eventualmente posto il codice, anche se ho usato quello trito e ritrito di esempi qui e li. Può essere che sbaglio qualcosa

Sarebbe il caso perché facciamo prima.

Eccolo
Si presuppone che ci siano le connessioni al router, che ho evitato di inserire
Con questo codice payload risulta sempre vuoto anche se httpResponseCode_RX mi dà 200

TX

// ESP32 TX

#include <HTTPClient.h>
String IP_String   = "192.168.1.88";
String serverPath = "";
int BatteryWatt = 0;

void setup() 
{
   BatteryWatt = 70;
   serverPath = "http://" + IP_String + 
                               "/RX" +                                      
                               ","  + String(BatteryWatt) + 
                               "," ;  

}

void loop() 
{
   HTTPClient http;
   http.begin(serverPath.c_str()); 
   delay(50);
   int httpResponseCode_RX = http.GET();
   delay(50);
   if (httpResponseCode_RX == 200)
   {
      Serial.println ("RX ha risposto");
      String payload = http.getString();
      Serial.println(payload);
   }  
   http.end();
}

RX

// ESP32 RX

#include <HTTPClient.h>
WiFiServer server_rx(80);
WiFiClient client;
String header = "";
String currentLine = ""; 

void setup() 
{
  server_rx.begin();
}

void loop() 
{
     WiFiClient client = server_rx.available();   // Listen for incoming clients
     if (client)                                  // If a new client connects,
     {  
       if (client.available())                    // if there's bytes to read from the client,
       {               
         char c = client.read();                 // read a byte, then
         header += c;                            // header contiene tutto quello che arriva  
         if (c == '\n')                          // if the byte is a newline character
         { 
           if (currentLine.length() == 0) 
           {
             // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
             // and a content-type so the client knows what's coming, then a blank line:
             client.println("HTTP/1.1 200 OK");
             client.println("Connection: close");
             client.println();           
           }  
         }
       } 
       client.stop();
     }
}

Non credo che questa url sia valida.
Il metodo getString() si aspetta qualcosa come la stringa che ho scritto nel post precedente

?param=xxxxx&param2=yyyyyy

per capire quale effettivamente sia il payload ovvero tutto quello dopo il carattere ? (anche se con GET è improprio definirlo cosi perché il metodo non prevede l'invio di altri dati oltre a url e headers.)

la url è giusta, perchè come, detto funziona tutto :woozy_face:
lo stesso comando, inviato presso il mio server su aruba (naturalmente modficando l'indirizzo), mi risponde con frasi che io metto in un php (es. ok1 ok2 passato_di_qua) e che nulla hanno a che vedere con l'invio del GET da parte del TX.

Che funzioni poco vuol dire ... le HTTP GET hanno la sintassi che ha detto cotestatnt, ovvero i vari parametri si passano con il ?, il nome del parametro, il segno = ed il valore.

Che altri server accettino formati NON standard ci può stare, ma che la getString(), molto probabilmente, si aspetti un qualche cosa conforme algli standard anche :wink:

Guglielmo

La mia risposta è un po' fuori tema perché non avevo posto molto attenzione al codice dell'RX (che davo per scontato essere simile a quello del TX).

Ma è normale che non ricevi nulla lato TX perché non stai inviando nulla.
Il payload è tutto quello che c'è dopo gli headers (che finiscono con il println() vuoto) ovvero nulla in questo caso

quindi questo significa che se io nel get di invio metto la sintassi giusta, il getstring si riempie anche con info che nulla hanno a che vedere con la richiesta, cioè con frasi che io posso mettere nel client.println.
e questo significa quindi che il 200 è solo un ok di avvenuta ricezione e basta ...
ok provo ad inserire un get con appropriata sintassi e vediamo che succede ...

Per la sintassi prova a guardare QUI

SI

Guglielmo

il fatto è che ho provato anche a fare una cosa del genere

          client.println("HTTP/1.1 200 OK");
          client.println("comando pippo789");
          client.println("Connection: close");
          client.println();

ma il payload è sempre vuoto

nota : rileggendo bene il tuo post, debbo provare così ?

          client.println("HTTP/1.1 200 OK");
          client.println("Connection: close");
          client.println();
          client.println("comando pippo789");

oltre che a provare i comandi del link di guglielmo ...

Si, una richiesta/risposta HTTP prevede una sintassi ben definita .
Nel tuo caso, lato RX stai rispondendo ad una richiesta di tipo GET anche se fuori standard.

La prima riga dice al client che la comunicazione seguirà lo standard HTTP 1.1 e richiesta è stata ricevuta con successo (codice HTTP di risposta 200).
La seconda riga che il client può chiudere immediatamente la connessione una volta che ha ricevuto tutto quello che serve.
La terza riga indica che gli headers sono finiti e tutto quello che verrà dopo è il cosiddetto payload che tradotto letteralmente significa "carico utile": può essere del semplice testo senza una formattazione particolare, una pagina web, un file json, un file binario etc etc.

Il tipo di payload che stai per inviare lo dovresti indicare con l'apposito header "Content-type: xxxx". Esempio:

          client.println("HTTP/1.1 200 OK");
          client.println("Content-type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("Questo è il payload");

si ... così funziona
ero convinto che il "payload" dovesse stare prima di client.println("Connection: close"); come a dire "prendi quello che arriva prima di chiudere la connessione".
quindi problema risolto
con l'occasione mi salvo il link di guglielmo, utile per ripassare la questione.
il fatto è che io uso raramente le chiamate wifi e quindi mi dimentico come fare certe cose trite e ritrite
grazie