Arduino MKR1010 - Leggere dati inseriti su pagina HTML

Ciao a tutti , mi scuso in anticipo se ancora non ho effettuato nessuna presentazione , appena avrò un attimo , vi farò vedere anche i vari progetti creati negli anni passati.

Da qualche giorno sto lavorando ad un nuovo progetto :

Arduino MKR1010 crea una rete WIFI temporanea per la configurazione , un pò come si può fare con l’esp8266 ed il firmware TZAPU.

non posso usare questa soluzione perchè valida solo per l’utilizzo di un esp8266 in modalità STANDALONE.

Nella pagina di configurazione dovrò inserire SSID - Password - hubIP(un indirizzo ip che mi servirà successivamente).
Dopo aver inserito i dati , cliccando sul tasto invio , arduino mi salverà i dati nelle rispettive variabili , chiuderà la rete Wifi temporanea e si connetterà ad una rete esistente per il normale svolgimento del programma.

Il risultato finale dovrebbe essere la pagina di configurazione come quella di tutti i dispositivi stile Router , Switch, extender.

Problema : Sono riuscito a creare una pagina HTML con le 3 textbox ed il tasto invio. Non riesco a leggere i dati inseriti e salvarli nelle 3 variabili.

Ecco il codice :

#include <SPI.h>
#include <WiFiNINA.h>
char ssid[] = "SSID";      
char pass[] = "";    
int keyIndex = 0;               

int status = WL_IDLE_STATUS;
WiFiServer server(80);

boolean readingNetwork = false;
boolean readingPassword = false;
boolean readinghubIP = false;
String password = "";
String network = "";
String hubIP = "";
boolean needCredentials = true;

char *strToChar(String str) {
  int len = str.length() + 1;
  char c[len];
  str.toCharArray(c, len);
  return c;
}
void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect.
  }

  Serial.println("Access Point Web Server");


  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < "1.0.0") {
    Serial.println("Please upgrade the firmware");
  }

  // by default the local IP address of will be 192.168.4.1
  // you can override it with the following:
  // WiFi.config(IPAddress(10, 0, 0, 1));

  // print the network name (SSID);
  Serial.print("Creating access point named: ");
  Serial.println(ssid);

  // Create open network. Change this line if you want to create an WEP network:
  status = WiFi.beginAP(ssid, pass);
  if (status != WL_AP_LISTENING) {
    Serial.println("Creating access point failed");
    // don't continue
    while (true);
  }

  delay(1000);

  // start the web server on port 80
  server.begin();

  // you're connected now, so print out the status
  printWiFiStatus();
}


void loop() {
  // compare the previous status to the current status
  if (status != WiFi.status()) {
    // it has changed update the variable
    status = WiFi.status();

    if (status == WL_AP_CONNECTED) {
      // a device has connected to the AP
      Serial.println("Device connected to AP");
    } else {
      // a device has disconnected from the AP, and we are back in listening mode
      Serial.println("Device disconnected from AP");
    }
  }
  if (needCredentials) {
  getCredentials();
}
}

void getCredentials() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c=='?') readingNetwork = true;
        if (readingNetwork) {
          if (c=='!') {
            readingPassword = true;
            readingNetwork = false;
          }
          else if (c!='?') {
            network += c;  
          }
        }
        if (readingPassword) {
          if (c=='*') {
            readinghubIP = true;
            readingPassword = false; 
          }
          else if (c!='!') {
            password += c;
          }
        }
        if (readinghubIP) {
          if (c==',') {
            Serial.println();
            Serial.print("Network Name: ");
            Serial.println(network);
            Serial.print("Password: ");
            Serial.println(password);
            Serial.print("hubIP: ");
            Serial.println(hubIP);
            Serial.println();
            client.stop();
            WiFi.end();
            readinghubIP = false;
            needCredentials = false;
            //needWiFi = true;  
          }
          else if (c!='*') {
            hubIP += c;
          }
        }
        
        if (c == '\n') { // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          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("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
          //  client.print("Click <a href=\"/H\">here</a> turn the LED on
");
          //  client.print("Click <a href=\"/L\">here</a> turn the LED off
");
            client.println("<h2>CONFIGURATOR</h2>");
            client.print("NETWORK NAME: ");
            client.print("<input id=\"network\"/>
");
            client.print("PASSWORD: ");
            client.print("<input id=\"password\"/>
");
            client.print("hubIP: ");
            client.print("<input id=\"hubIP\"/>
");

            client.print("<button type=\"button\" onclick=\"SendText()\">Invio</button>");
            client.println("</body>");
            client.println("<script>");
            client.println("var network = document.querySelector('#network');");
            client.println("var password = document.querySelector('#password');");
            client.println("var hubIP = document.querySelector('#hubIP');");
           
            client.println("function SendText() {");
            client.println("nocache=\"&nocache=\" + Math.random() * 1000000;");
            client.println("var request =new XMLHttpRequest();");
            client.println("netText = \"&txt=\" + \"?\" + network.value + \"!\" + password.value + \"*\" + hubIP.value + \",&end=end\";");
            client.println("request.open(\"GET\", \"ajax_inputs\" + netText + nocache, true);");
            client.println("request.send(null)");
            client.println("network.value=''");
            client.println("password.value=''");
            client.println("hubIP.value=''");
            client.println("</script>");
            client.println("</html>");
            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } 
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);

}

Allego la pagina web che ottengo e ciò che mi restituisce il seriale al momento

Non ho mai usato prima d’ora pagine html , spero possiate aiutarmi per risolvere il problema.

Grazie

Pagina Web.JPG

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie. Qui una serie di link utili, non inerenti al tuo problema: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

dicubo:
Ciao a tutti , mi scuso in anticipo se ancora non ho effettuato nessuna presentazione , appena avrò un attimo , vi farò vedere anche i vari progetti creati negli anni passati.

Da qualche giorno sto lavorando ad un nuovo progetto …

Giusto per sapere il codice html che hai scritto invia effettivamente quando provi a fare get ?
Non ho mai utilizzato quel modo però in html per fare una richiesta non è difficile ci son vagonate di codice da cui puoi copiare per fare semplici invii in get o post!

>Triko93: Quando quoti, puoi quotare solo un pezzo per far capire a quale discussioni ti riferisci, senza quotare TUTTO il post. Gli utenti da dispositivi mobili ti ringrazieranno per la cortesia. :slight_smile:
Inoltre, prima di rispondere, attendi che l’utente abbia assolto a quanto richiesto dal regolamento (es. presentazione) - gpb01

Triko93: Giusto per sapere il codice html che hai scritto invia effettivamente quando provi a fare get ?

Sinceramente non credo perché non ricevo nulla sul seriale , del testo immesso , guarda la pic allegata.

Triko93: Non ho mai utilizzato quel modo però in html per fare una richiesta non è difficile ci son vagonate di codice da cui puoi copiare per fare semplici invii in get o post!

Potresti scrivermi un esempio che mi restituisce il testo che scrivi in una text box ?

Ti andrebbe di provare la versione in sviluppo di Webbino? Permette facilmente di fare quello che ti serve, ma non sono sicuro che funzioni in maniera affidabile su MKR1010. Inizia a provare gli esempi eventualmente.

Potresti postare anche il codice html?

Lollo82: Potresti postare anche il codice html?

Lo trovi nel codice , nella void getCredentials.

dicubo: Potresti scrivermi un esempio che mi restituisce il testo che scrivi in una text box ?

Do un occhiata al volo se trovo qualcosa! @dicubo eccoti il link, qui trovi 80% di quel che ti serve!

Triko93: Do un occhiata al volo se trovo qualcosa! @dicubo eccoti il link, qui trovi 80% di quel che ti serve!

Grazie! Ho capito la differenza tra Get e Post.. purtroppo sono ancora troppo imbranato ad implementare le richieste in arduino .. mi potresti creare uno sketch di esempio dove crei una pagina con 3 text box e le salvi in 3 variabili ?

dicubo:
Grazie! Ho capito la differenza tra Get e Post… purtroppo sono ancora troppo imbranato ad implementare le richieste in arduino … mi potresti creare uno sketch di esempio dove crei una pagina con 3 text box e le salvi in 3 variabili ?

su quel sito c è il codice prova a copiarlo da là prima oppure come ti ho detto prova a cercare google “examples send string using get or post”. DI sicuro trovi qualcosa!!!

dicubo:
Lo trovi nel codice , nella void getCredentials.

Ciao, scusami ma perchè al posto di utilizzare javascript non provi a creare un classicissimo form che alla pressione dell’invio manda la query get alla pagina che indichi. Nel tuo caso sarà 192.168.4.1
Così facendo recupererai tutta la stringa dall’header con arduino e assegnerai ogni valore alla variabile giusta.

<form method="GET" action="192.168.4.1">
...
</form>