ArduinoHttpClient richiesta in post

Ciao a tutti,

ho un Arduino wifi r4 sul quale ho montato un lettore rfid. L'id della lettura lo passo ad una richiesta http in post. Il server in ascolto è scritto in php (laravel) ed è deployato in un container.
L' arduino ed il server sono sulla stessa network. Adesso iniziano i problemi. La chiamata in post girata al mio pc (windows + docker desktop) funziona, la stessa chiamata girata ad un altro server (linux ubuntu+ docker engine) non va. La cosa che mi sembra strana è la sequenza delle istruzioni che vedo arrivare da Arduino.
il mio codice è il seguente :

void sendData(String codiceRFID){
    Serial.println("making POST request with RFID:" + codiceRFID);
  
/*
  Serial.println("making POST request");
  String contentType = "application/json";
  String postData = "{ \"codicerfid\": \"" + codiceRFID + "\", \"tipo\": \"" + "I" + "\" }";
  client.post("/api/accessrfid", contentType, postData);
  Serial.println();
*/
  
  //String postData = "{\"codicerfid\":\"" +codiceRFID+"\",\"tipo\":\""+"I"+"\"}";
  String postData = "codicerfid=93226a19&Tipo=I";
  Serial.println("making POST to server: " + server.toString() +" path: " + path  + " body: " + postData);
  
  String contentType = "application/x-www-form-urlencoded";
  

  client.post("/api/accessrfid", contentType, postData);



  // read the status code and body of the response
  int statusCode = client.responseStatusCode();
  String response = client.responseBody();

  Serial.print("Status code: ");
  Serial.println(statusCode);
  Serial.print("Response: ");
  Serial.println(response);
  
  if (statusCode==201){    
    ok();
    verde();    
  }else{
    rosso();
    ko();
  }  
  
  delay(5000);
  inizia();

}

quello che mi risulta strano è che se sniffo la chiamata vedo un connection close che non mi aspetto che però da fastidio solo sulla configurazione ubuntu + docker:

[server] event: connection (socket#1)
[socket#1] event: resume
[socket#1] event: data
--> POST
[socket#1] event: data
-->
[socket#1] event: data
--> /api/accessrfid HTTP/1.1
--> User-Agent: Arduino/2.2.0
--> Connection:
[socket#1] event: data
--> close
[socket#1] event: data
-->
-->
[socket#1] event: data
--> Content-Type
[socket#1] event: data
--> :
[socket#1] event: data
--> application/x-www-form-urlencoded
[socket#1] event: data
-->
-->
[socket#1] event: data
--> Content-Length: 26
-->
--> codicerfid=93226a19&Tipo=I
[socket#1] event: prefinish
[socket#1] event: finish

So che è contorto, vorrei solo capire se qualcuno ha avuto problemi di questo tipo con le chiamate in post.

Grazie

Potrei sbagliare, ma vista così e solo con queste informazioni a me suona più di un problema di configurazione di Ubuntu che rifiuta le connessioni (firewall? Selinux?) che altro.
Hai provato a fare una chiamata dal tuo PC ad Ubuntu? Potresti anche farlo manualmente usando solo putty o MobaXterm, e vedere se la connessione resta in piedi e che succede mandando la request con POST (che magari ti prepari prima e la incolli sul terminale per evitare timeout)?

Ciao,
io ho pensato la stessa cosa ma la cosa sospetta è che ho provato con postman dal mio pc verso il server ubuntu e funziona.
Ho fatto varie comparazioni usando la post in tutti i modi che ho trovato nei vari esempi ma il risultato finale è stato sempre lo stesso con arduino non va con postman si.
Di seguito riporto uno dei test che ho fatto con postman:

[server] event: connection (socket#1)
[socket#1] event: resume
[socket#1] event: data
--> POST /api/accessrfid HTTP/1.1
--> Accept: application/json
--> Content-Type: application/json
--> User-Agent: PostmanRuntime/7.37.0
--> Cache-Control: no-cache
--> Postman-Token: 029bedde-6d4c-4144-971d-995631dbd7c2
--> Host: 192.168.20.128:10000
--> Accept-Encoding: gzip, deflate, br
--> Connection: keep-alive
--> Content-Length: 42
-->
-->  { "codicerfid": "93226a18", "tipo": "I" }
[socket#1] event: prefinish
[socket#1] event: finish
[socket#1] event: readable
[socket#1] event: end
[socket#1] event: close

e come si può vedere la gestione della post è leggermente differente a meno di quel connection close che con postam non c'è.

Puoi chiaramente vedere che le intestazioni della request ci sono tutte con postman:

[socket#1] event: data
--> POST /api/accessrfid HTTP/1.1
--> Accept: application/json
--> Content-Type: application/json
--> User-Agent: PostmanRuntime/7.37.0
--> Cache-Control: no-cache
--> Postman-Token: 029bedde-6d4c-4144-971d-995631dbd7c2
--> Host: 192.168.20.128:10000
--> Accept-Encoding: gzip, deflate, br
--> Connection: keep-alive
--> Content-Length: 42
-->

mentre con Arduino si interrompono dopo "Connection:":

[socket#1] event: data
--> /api/accessrfid HTTP/1.1
--> User-Agent: Arduino/2.2.0
--> Connection:
[socket#1] event: data
--> close

In qualche modo sospetto, forse per questioni di sicurezza, che ad Ubuntu non piaccia quello user agent che forse non "conosce", visto che la connessione viene chiusa dopo "User-Agent". Dovresti vedere i log lato Ubuntu per capire se qualche impostazione impedisce a User Agent non "certificati" di fare request.

Oppure, per restare almeno on topic, provare ad impostare Arduino per mandare lo stesso User-Agent di postman (oppure uno "classico" es. " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"). Se così funziona, allora devi controllare su Ubuntu cos'è che blocca in base allo User-Agent e disabilitare questo controllo o, meglio, aggiungere "Arduino/2.2.0".

Se non funziona neanche così allora dovrai verificare lato Ubuntu/Docker, ma in tal caso saremmo off-topic (devi scrivere la domanda nei forum Ubuntu). Facci sapere.

Ciao a tutti,

alla fine facendo varie prove e con l'aiuto di un collega, abbiamo trovato una soluzione.
In pratica nello sketch utilizzavo una libreria wifi di tipo WiFiS3, cambiandola in WiFi il tutto ha funzionato correttamente.

Grazie per la collaborazione

Non ho capito cosa c'entri la libreria WiFi (che non avendo postato l'intero sketch non era cosa evidente), comunque se hai risolto meglio così... :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.