arduino invio post e lettura risultato

Ciao a tutti, sto realizzando un progetto basato su arduino come client (arduino + ethernet shield + sensori) e un'applicazione java che funge da server (spring - rest services).

Attualmente riesco a inviare in POST delle stringhe contenenti la rappresentazione json di alcuni valori letti.

Il mio problema è che vorrei che una volta che ha finito l'invio dei dati in post arduino si metta in ascolto per leggere la risposta, mentre tutti gli esempi che vedo mettonono la lettura nel loop().

Esiste un modo per farlo ?

grazie

la post prevede una risposta da parte del server, anche se non so se la REST la usa (nel caso lo faccia, è identica ad una get). Nel caso non la usi, basta che fai una get.

ciao, si i miei servizi rest mi ritornano una risposta json con il risultato della post (1 se inserimento andato a buon fine, 0 altrimenti).

quello che riesco a fare è inviare la post e leggere la risposta nel loop(). quello che non riesco a fare è inviare la post e leggere subito la risposta dal server... avrei bisogno di un esempio...

se json ritorna solo 0 e 1, o lo gli fai ritornare i valori che ti servono, o fai una pavina a parte che interroghi con una get

Ciao, cerco di spiegarti meglio l'idea del mio progetto (ieri ti ho scritto dal cellulare e sono stato un po troppo veloce)

L'idea è di automatizzar alcune funzioni di casa e ho due attori principali per il mio progetto:

  1. dei servizi rest scritti in java
  2. arduino + ethernet shield + dislay I2C + sensore temperatura e umidità I2C + scheda due relay

Il sistema deve prelevare i dati di temperatura e umidità e inviarli a intervalli regolari ai servizi rest in POST. se per qualche motivo non va a buon fine l'operazione e ritorna 0 i dati non vengono persi ma scritti nella scheda SD e reinviati successivamente. (Ho inoltre previsto un servizio di importazione a cui viene dato in pasto il file con i log).

Per l'attivazione dei relay invece faccio delle chiamate in GET che mi riotrnano 1 o 0 a seconda che il relay corrispondente deve essere aperto o chiuso.

Per come sono riuscito a implementare le chiamate tramite EthernetClient riesco a inviare correttamente la post ma non capisco come rimanere i ascolto in attesa dei dati di risposta.

if (client.connect("192.168.254.123", 8080)) {                                                 
    client.println("POST /domotic/json/temperature/1 HTTP/1.1");                    
    client.println("Host: 192.168.254.177");
    client.println("Content-Type: application/json");
    client.println("Connection: close");
    client.println("User-Agent: Arduino/1.0");
    client.print("Content-Length: ");
    client.println(postJsonString.length());
    client.println();
    client.print(postJsonString);
    client.println();        
  } else {
    Serial.println("Cannot connect to Server");            
    logTemperatureDataError(temperature, sensorId);   
  }

dopo l'ultima

client.println();

resta in ascolto perqualche tempo di una risposta dal server (potrebbe anche non arrivare se il server è ingolfato), un sistema "sporco" ma veloce è di apsettare un paio di secondi e poi leggere. Leggerai un bel pò di dati, stapateli a video e capirai subito come funziona il gioco, se nopostali qui che lo analizzaizmo assieme.

PS. puoi simulare le richeiste arduino usando il telnet, cerca su internetcome funziona, ma occio che non puoi cancellare; preparati le richieste su blocco note e poi fai copia incolla.

Ciao alla fine dopo un po di prove ho fatto così:

   // leggo risposta dal servizio rest invocato
    while(client.connected() && !client.available()) {
      delay(1); 
    }
    while (client.available()) {
      char c = client.read();
      response = response + c;
      //Serial.print(c);
    }
    
    int contentBodyIndex = response.lastIndexOf('\r\n\r\n');
    if (contentBodyIndex > 0) {
      // response contiene il corso della risposta
      response = response.substring(contentBodyIndex + 1);
      //Serial.println(response);
    }
    
    client.stop();
    client.flush();

Lo sto testando da ieri sera e tutto sembra girare alla perfezione. L’unica cosa che mi lascia un attimo dubbioso è come recupero il contenuto della risposta. Ora cerco “\r\n\r\n” e prendo dal carattere successivo. Secondo te esiste un modo migliore ??

no, è il metodo da seguire, certo, non è detto che sia /r/n ma solo /n, se non erro, ma vabè..

Però il problema grosso è che u leggi tutta la risposta, qusto probabilmente ingolfa la RAM. Dovresti fare così: una variabile a 0, poi il ciclo per leggere il caratter; quando leggi il carattere, se var = 4 memorizza la risposta nella stringa altrimenti se la var è 0 o 2 e il carattere è \n, o se var è 1 o 3 e il carattere \r, fai var +1, se è un qualsiasi altro carattere azzeri var.

che ne dici? così eviti di memorizzare tutta la parte header, che è molto pesante, e leggi solo il tuo dato (1 byte, se non erro), vedi quanta RAM risparmiata?