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.
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:
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.
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.