Eth shield login HTML

Ciao,
volevo implementare una specie di login che mi abiliti o meno a accedere all' applicazione stessa che carico sul mio Arduino + ETH shield. Copiando uno sketch di un post precedente avevo pensato di fare questo:

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 0, 4 }; // ip in lan
byte gateway[] = { 192, 168, 0, 1 }; // ip in lan
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port

String readString; //string
boolean LED1ON = false; //LED1 status flag
boolean LED2ON = false; //LED2 status flag
boolean LED3ON = false; //LED3 status flag
boolean login=false;
 
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
Serial.begin(9600);
}
 
void loop(){
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c);
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
        if(readString.indexOf("Nome=pippo&Pwd=pluto") > 0) {
         login=true;
        } else {
         login=false;
        }
        if(login=true){
        if(readString.indexOf("L=1") > 0) {
          digitalWrite(6, HIGH); // set the LED on
          LED1ON = true;
          }else
          if(readString.indexOf("L=01") > 0) 
          {
          //led has to be turned OFF
          digitalWrite(6, LOW); // set the LED OFF
          LED1ON = false;
        }
        if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(7, HIGH); // set the LED on
          LED2ON = true;
          }else
          if(readString.indexOf("L=02") > 0)  
          {
          //led has to be turned OFF
          digitalWrite(7, LOW); // set the LED OFF
          LED2ON = false;
        }
        if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(8, HIGH); // set the LED on
          LED3ON = true;
          }else
          if(readString.indexOf("L=03") > 0)
          {
          //led has to be turned OFF
          digitalWrite(8, LOW); // set the LED OFF
          LED3ON = false;
        }
        } 
        // INIZIO DICHIARAZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        // Finestra di login
        client.print("<form action='http://192.168.0.4/'>");
        client.print("Nome");    
        client.print("utente: <input name='Nome' value=''>");
        client.print("Password: <input type='Password' name='Pwd' value=''>");
        client.print("<input type='submit' value=' OK '>");
        client.print("</form>");
       
        if (login=true) {
        //Primo led
        client.println("<hr />");
        client.println("<h1>LED1</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED1ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>");
        
        client.println("<hr />");
        
        //Secondo led
        client.println("<h1>LED2</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED2ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>");
        client.println("<hr />");
        
        //terzo led
         client.println("<h1>LED3</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED3ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>");
        } //chiude if login=true 
        client.println("</body></html>");
 
        //clearing string for next read
        readString="";
        //stopping client
        client.stop();
 
        } 
    } 
  } 
} 
}

Con la verifica del login (es.: ho messo nome utente:pippo, psw:pluto) pensavo di visualizzare il resto della pagina ma è come se il programma se ne fregasse altamente di come è settata la variabile e non filtra niente. Dove sbaglio? C' è eventualmente un modo migliore per avere un mini log-in?
Grazie.

Non ho letto il codice ma mi è balzato all'occhio

Dove specifichi il metodo di invio? post? get? boh?

Guglio:
Non ho letto il codice ma mi è balzato all'occhio

Dove specifichi il metodo di invio? post? get? boh?

detto da te mi sorprende :smiley:
lo sanno tutti che comunque il metodo predefinito è in GET :wink: e cmq tu mettilo per sicurezza e io come action lo imposterei a '' (vuoto) più che l'ip intero anche se nella rete è statico
poi non è che passi qualche altro parametro?

poi con l'eth shield non ho dimestichezza ma sicuro sia così il controllo sul GET?

Ho provato anche a modificarlo come hai detto:

client.print("");

Però non funge uguale. I parametri che passo sono il nome utente e la password (http://192.168.0.4/?Nome=pippo&Pwd=pluto). Certo non è il massimo visto che sulla barra indirizzi del browser si legge distintamente nome e password quando invio il dato. Però questo sono riuscito a "fare" :sweat_smile:
Il problema è che volevo mascherare gli elementi sulla pagina a un utente che non è autorizzato.

trovato :slight_smile:

if (login=true)

e non aggiungo altro :grin:

Devo scrivere..
if (login) porca troia che scemo!!
e va bhe dai rudimenti del C e derivati li ho studiati almeno 10 anni fa :sweat_smile:
Comunque grazie!!!

oppure if (login == true)
altrimenti non fai un confronto ma un'assegnamento

Salve ragazzi, utilizzando il codice sopra riportato ho effettuato collegamenti x accensione delle luci esterne alla casa. ON luce accesa e OFF luce spenta. Fin qui tutto OK. Ma cosa dovrei modificare x poter comandare l' elettroserratura del cancello che ha bisogno di un semplice impulso? Certo il tutto funziona uguale, ON cancello si apre ma se ci si dimentica di cliccare su OFF l'elettroserratura rimane eccitata ( e non va tanto bene) . Poi potreste essere + espliciti su cosa si deve modificare al fine di rendere utilizzabile il LOGIN?
Grazie per eventuali aiuti.

Basta che dopo
digitalWrite(7, HIGH); // set the LED on

scrivei:
delay(1000);
digitalWrite(7, OFF); // set the LED on

E l'errore era che mancava il doppio uguale (==).

Grazie per la risposta. L'apertura cancello avviene seza pericoli che l'elettroserrattura rimanga eccitata. Devo sistemare l'estetica della pagina web perchè ora il pulsante OFF è da eliminare. Per quanto riguarda il login niente da fare ... posto il codice che uso (sicuramente caotico, frutto di vari copia e incolla )

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 177 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // ip in lan
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port

String readString; //string
boolean LED1ON = false; //LED1 status flag
boolean LED2ON = false; //LED2 status flag
boolean LED3ON = false; //LED3 status flag
boolean login=false;

/*termistore*/
float temp; // variabile da calcolare 
float tempPin = 5;   // pin analogico IN temperature sensor 
int ledPintemp = 4; // pin led termistore 
float tempreg = 20.5; // temperatura di controllo in celsius 
/*end termistore*/  
/*fotoresistore*/
int light; // variabile da calcolare 
int ledPinlux = 5; // pin led fotoresistenza 
int photoresistor = 2; // pin analogico IN fotoresistore 
/*end fotoresistore*/
 
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
Serial.begin(9600);
}
 
void loop(){
  /*inizio temp - (((x / 1023.0) * 5.00) - 2.7315) * 100.0*/  
temp =((5 * analogRead(tempPin) * 100.0 ) / 1024) * 0.210; // ULTIMO VALORE è 0.XXX    
/*fine temp*/  
/*inizio luce*/  
light = analogRead(photoresistor);   
light = constrain(light, 0, 1023); // limiti dei valori tra 0 e 100   
light = map(light, 0, 500, 900, 0);   /*fine luce*/ 

/*inizio client*/
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c);
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
        if(readString.indexOf("Nome=pippo&Pwd=pluto") > 0) {
         login=true;
        } else {
         login=false;
        }
        if(login=true){
        if(readString.indexOf("L=1") > 0) {
          digitalWrite(6, HIGH); // set the LED on
          LED1ON = true;
          }else
          if(readString.indexOf("L=01") > 0) 
          {
          //led has to be turned OFF
          digitalWrite(6, LOW); // set the LED OFF
          LED1ON = false;
        }
        if(readString.indexOf("L=2") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(7, HIGH); // set the LED on
          delay (500);
          digitalWrite(7, LOW);
          LED2ON = true;
          }else
          if(readString.indexOf("L=02") > 0)  
          {
          //led has to be turned OFF
          digitalWrite(7, LOW); // set the LED OFF
          LED2ON = false;
        }
        if(readString.indexOf("L=3") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(8, HIGH); // set the LED on
          LED3ON = true;
          }else
          if(readString.indexOf("L=03") > 0)
          {
          //led has to be turned OFF
          digitalWrite(8, LOW); // set the LED OFF
          LED3ON = false;
        }
        } 
        // INIZIO DICHIARAZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        // Finestra di login
        client.print("<form action='http://192.168.1.177/'>");
        client.print("Nome");    
        client.print("utente: <input name='Nome' value=''>");
        client.print("Password: <input type='Password' name='Pwd' value=''>");
        client.print("<input type='submit' value=' OK '>");
        client.print("</form>");
        
        client.println("<h1>STATUS SENSORI</h1><hr />");         //Scrive sul browser il valore del termistore         
client.println("<p>TEMPERATURA = ");        
client.print(temp);        
client.println(" C 
</p>");       
if (temp < tempreg) {         // scrive sul web freddo se il valore del termistore è basso         
client.print("<p><strong>FREDDO</strong></p>");         }      
else {         // scrive sul web caldo se il valore del termistore è alto         
client.print(" <p><strong>CALDO</strong></p>");     }             //Scrive sul browser il valore della fotoresistenza            
client.println("<p>LUCE = ");             
client.print(analogRead(light));            
client.println("
</p>");       
if (light < 150) {           // scrive sul web luce se il valore della fotoresistenza è alto           
client.print("<p><strong>LUCE</strong></p>");         }      
else {           // scrive sul web buio se il valore della fotoresistenza è basso           
client.print(" <p><strong>BUIO</strong></p>");         }         // link per aggiornare pagina e valori         
client.print("<h2>AGGIORNA SENSORI: <a href=''>CHECK</a></h2><hr />");           
client.println("<h1>CONTROLLO ATTUATORI via internet</h1>");         
             
   
        if (login=true) {     
          //Primo led
        client.println("<hr />");
        client.println("<h1>Lampione</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED1ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>");
        
        client.println("<hr />");
        
        //Secondo led
        client.println("<h1>Cancello</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED2ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>");
        client.println("<hr />");
        
        //terzo led
         client.println("<h1>LED3</h1>");
        client.println("
");
        //printing LED status
        client.print("<span>STATO LED: </span>");
 
          if (LED3ON) {
              client.println("<span style='color:green'>ON</span>");
            }
            else
            {
              client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>");
        } //chiude if login=true 
        client.println("</body></html>");
 
        //clearing string for next read
        readString="";
        //stopping client
        client.stop();
 
        } 
    } 
  } 
} 
}

mi sapreste dire dove devo modificare o inserire "if (login==true)" ?
Un ulteriore aiuto: La pagina web visualizza correttamente la temperatura ambiente e il valore letto da una fotoresistenza. Devo inserire una parte di codice che mi permmette di comandare dei led/relè quando vengono superati determinati valori di controllo, da me impostati. Il codice è questo, funzionale preso singolarmente con la parte lettura sensori :

if (temp < tempreg) { // accende o spengo un led se la temperatura è più bassa di quella di controllo           
digitalWrite(ledPintemp, HIGH); //accendo           
Serial.print("ON pin "); //scrivo in console           
Serial.println(ledPintemp); //scrivo in console        
}   
 else 
{           
digitalWrite(ledPintemp, LOW); //spengo          
Serial.print("OFF pin "); //scrivo in console           
Serial.println(ledPintemp); //scrivo in console         }            
if (light > 500) { // accende o spengo un led se la c'è luce          
digitalWrite(ledPinlux, HIGH); // accendo          
Serial.print("ON pin "); //scrivo in console           
Serial.println(ledPinlux); //scrivo in console        
}         
else 
{           
digitalWrite(ledPinlux, LOW); //spengo           
Serial.print("OFF pin "); //scrivo in console           
Serial.println(ledPinlux); //scrivo in console       
  }   
} // fine loop 
}

Come o in che punto va inserito? Mi manca qualcosa? ho provato ad inserirlo in vari punti del codice principale ma se pur verificato correttamente non mi modifica lo stato dei pin al superamento delle soglie. Grazie a chi mi volesse esser d'aiuto.