Webserver non riesco ad aggiornare la pagina

void loop() {
 server.handleClient();
 
  if(mod == 1){//ci entra sempre, richiamo prima del loop una funzione che mi fa selezionare il valore di mod
    //Serial.println("richiamo handle client");
    
    testoInserito = "";
    msg_rx = sms(testoInserito);
    
    if (messageCount < MAX_MESSAGES) {
      if(msg_rx != ""){
        
        Serial.println("RX: " + msg_rx);
        messages[messageCount] = msg_rx;
        messageCount++;
        msg_rx = "";
        Serial.println("aggiorna pagina");
        handleRoot();
      }
    }else{
      for (int i = 0; i < MAX_MESSAGES - 1; ++i) {
        messages[i] = messages[i + 1];
      }
      messages[MAX_MESSAGES - 1] = msg_rx;
      //handleRoot();
    }

   

}
delay(10);
}


void handleRoot() {




  Serial.println("handleroot");
  String html = "<html>" \
                "<head>" \
                "<meta name='viewport' content='width=device-width, initial-scale=1.5'>" \
                "</head>" \
                "<body>" \
                "<form action='/submit' method='post'>" \
                "<input type='text' name='testo' id='testo'><input type='submit' value='Invia'></form>" \
                "<ul>"; // Inizia elenco non ordinato per i messaggi

  // Aggiungi i messaggi memorizzati all'HTML
  for (int i = 0; i < messageCount; ++i) {
    html += "<li>" + messages[i] + "</li>";
  }

  html += "</ul><script>document.getElementById('testo').focus();</script></body></html>";

  // Invia la risposta con l'HTML contenente i messaggi
  server.send(200, "text/html", html);
}





void handleSubmit() {
Serial.println("handesubmit");

  if (server.hasArg("testo")) {
    String nuovoMessaggio = server.arg("testo");

    // Aggiungi il nuovo messaggio all'array
    if (messageCount < MAX_MESSAGES) {
      messages[messageCount] = nuovoMessaggio;
      messageCount++;
    } else {
      // Se il numero massimo di messaggi è stato raggiunto, sovrascrivi il messaggio più vecchio
      for (int i = 0; i < MAX_MESSAGES - 1; ++i) {
        messages[i] = messages[i + 1];
      }
      messages[MAX_MESSAGES - 1] = nuovoMessaggio;
    }

    Serial.println("Testo inserito: " + nuovoMessaggio);

    // Ricarica la pagina per mostrare il nuovo messaggio
    server.send(200, "text/html", "<p>Testo salvato!</p><script>window.location.replace('/');</script>");
    Serial.println("Richiamo sms");

    msg_rx = sms(nuovoMessaggio);//richiamo la funzione sms che serve a gestire anche la stampa sullo schermo

  } else {
    server.send(400, "text/plain", "Errore: nessun testo ricevuto!");
  }
}

posto questo parziale di codice dal mio progetto, praticamente nel loop, quando verifico che la nuova stringa ricevuta dalla funzione sms non e vuota la inserisco in un array di stringhe. fin qui tutto ok, poi quando mando la funzione handleroot() che si occupa dell'aggiornamento della pagina, essa non si aggiorna.

nel codice si vede anche la funzione handlesubmit che gestiche l'inserimento di testo in una casella e alla pressione del bottone invio il testo viene inserito in sequenza nell'array di stringhe. in sostanza e una sorta di chat via radio, ma cio non importa.

il problema è che premendo il bottone e richiamando poi handleroot la pagina si aggiorna, se richiamo io invece via software handleroot() la pagina non si aggiorna.

cosa vi viene in mente ?

Quelli che vuoi fare tu, non puoi farlo in questo modo.

Il protocollo HTTP prevede solo una modalità di funzionamento: il client chiede e il server risponde.

Tu invece vuoi fare che il server notifica un cambiamento senza che il client ne abbia fatto richiesta e questo è impossibile.

Devi usare altre tecniche ed altri protocolli web se vuoi una comunicazione bidirezionale (ad esempio websocket).

Esattamente. Oppure, se è accettabile per l'OP, semplicemente fare in modo che la pagina faccia un refresh automatico ad esempio ogni 30 secondi in modo che facendo il browser una nuova richiesta possa aggiornare il dato.

Basterebbe aggiungere nella pagina questo tag in <head>:

<meta http-equiv="refresh" content="30">

ok grazie mi avete dato una grossa dritta, difatti non ne uscivo fuori, aggiornare la pagina in automatico ogni 30 secondi potrebbe essere già una soluzione, non bellissima ma se va, funziona
mi documento anche su websocket e vi aggiorno

non posso simulare l'invio di una richiesta client via codice quindi? come se premessi aggiorna pagina

Se non vuoi usare un websocket puoi fare delle chiamate AJAX temporizzate in modo da aggiornare solo il dato variabile e non tutta la pagina intera, cosa che concordo con te essere decisamente bruttina.

Se cerchi online trovi decine di esempi anche se non tiri ottimi...

Non hai specificato di quale MCU si tratta, ma ad esempio questa potrebbe essere una buona base di partenza

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