Web Page con password e inizio sketch

Salve, chiedo il vostro aiuto per capire come realizzare ( sempre se possibile)
uno codice generico ( che quindi possa andare bene più o meno a tutti indipendentemente
dal progetto che uno fa) da poter integrare al propio sketch in modo che dopo aver messo le giuste credenziali in una prima pagina web parta direttamente lo sketch stesso.

Ho provato a fare questo con “Web_Authentication.ino” ma non riesco ad
integrarlo al progetto, in pratica invece di far apparire sulla pagina web " Hello Admin"
non riesco a far partire lo sketch.

Sto provando con questo ottimo e semplice codice trovato in rete per comandare 2 relè da web.

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip[] = { 
  192, 168, 178, 92 }; // ip arduino internet in
byte gateway[] = { 
  192, 168, 178, 1 }; // internet access via router
byte subnet[] = { 
  255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

int outPin = 9; // pin attuatore
String readString; //string
boolean LEDON = false; // flag status attuatore

int outPin2 = 7; // pin attuatore2
boolean LEDON2 = false; // flag status attuatore


void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);
  pinMode(outPin, OUTPUT);
  pinMode (outPin2, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  /*inizio client*/
  EthernetClient client = server.available();
  if (client)
  {
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        readString.concat(c); //store characters to string
        //if HTTP request has ended
        if (c == '\n' && currentLineIsBlank)
        {
          Serial.print(readString);
          if(readString.indexOf("L=1") > 0) 
          {
            // il led sarà acceso
            digitalWrite(outPin, LOW); // accendo il led
            LEDON = true;
            Serial.print("ON pin ");
            Serial.println(outPin);
          }
          if(readString.indexOf("L=0") > 0)
          {
            //il led sarà spento
            digitalWrite(outPin, HIGH); //sengo il led
            LEDON = false;
            Serial.print("OFF pin ");
            Serial.println(outPin);
            Serial.print(readString);
          }  
          if(readString.indexOf("L=2") > 0) 
          {
            // il led sarà acceso
            digitalWrite(outPin2, LOW); // accendo il led
            LEDON2 = true;
            Serial.print("ON pin ");
            Serial.println(outPin2);
          }
          if(readString.indexOf("L=3") > 0)
          {
            //il led sarà spento
            digitalWrite(outPin2, HIGH); //sengo il led
            LEDON2 = false;
            Serial.print("OFF pin ");
            Serial.println(outPin2);
          }
          // COSTRUZIONE PAGINA HTML
          client.println("HTTP/1.1 200 OK.....");
          client.println("Content-Type: text/html");
          client.println();
          // inizializzo pagina (da togliere se uso ajax)
          client.print("<html><head><title>ARDUINO Controllo Led via WEB</title></head><body>");
          //inizai il body
          client.println("<div style='width:720px; height:1280px;'>"); //risoluzione

          client.println("<h1>CONTROLLO ATTUATORI via internet</h1>");
          client.println("<hr />");
          client.print("<h1>PIN control n. ");
          client.print(outPin);
          client.println("</h1>");
          client.println("
");
          //scrivo il LED status
          client.print("<font size='7'>PIN status: ");
          if (LEDON)
          {
            client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
          }
          else
          {
            client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.print("<h2><a href='/?L=1'>ACCENDI</a> | <a href='/?L=0'>SPEGNI</a></h2>");
          client.println("<hr />");
          client.print("<h1>PIN control n. ");
          client.print(outPin2);
          client.println("</h1>");
          client.println("
");
          //scrivo il LED status
          client.print("<font size='7'>PIN status: ");
          if (LEDON2)
          {
            client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
          }
          else
          {
            client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.print("<h2><a href='/?L=2'>ACCENDI</a> | <a href='/?L=3'>SPEGNI</a></h2>");
          client.println("<hr />");
          client.print("<h4>Created by: <a href='Simone' target='_blank' />Simone</a></h4>");
          client.println("<hr />");
          // chiudo il div
          client.println("</div>");
          // chiudo pagina da togliere se uso ajax
          client.println("</body></html>");
          // pulisco la stringa per la successiva lettura
          readString="";
          //fermo il client
          client.stop();
        } //if c == /n
      } // if client available
    } // while client connesso
  } // if client
} // fine loop

Vi ringrazio se potete aiutarmi.

Roby0303:
Salve, chiedo il vostro aiuto per capire come realizzare ( sempre se possibile)
uno codice generico ( che quindi possa andare bene più o meno a tutti indipendentemente
dal progetto che uno fa) da poter integrare al propio sketch in modo che dopo aver messo le giuste credenziali in una prima pagina web parta direttamente lo sketch stesso.

Ho provato a fare questo con “Web_Authentication.ino” ma non riesco ad
integrarlo al progetto, in pratica invece di far apparire sulla pagina web " Hello Admin"
non riesco a far partire lo sketch.

Sto provando con questo ottimo e semplice codice trovato in rete per comandare 2 relè da web.

#include <String.h>

#include <SPI.h>
#include <Ethernet.h>

byte mac = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip = {
  192, 168, 178, 92 }; // ip arduino internet in
byte gateway = {
  192, 168, 178, 1 }; // internet access via router
byte subnet = {
  255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

int outPin = 9; // pin attuatore
String readString; //string
boolean LEDON = false; // flag status attuatore

int outPin2 = 7; // pin attuatore2
boolean LEDON2 = false; // flag status attuatore

void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);
  pinMode(outPin, OUTPUT);
  pinMode (outPin2, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  /inizio client/
  EthernetClient client = server.available();
  if (client)
  {
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        readString.concat(c); //store characters to string
        //if HTTP request has ended
        if (c == ‘\n’ && currentLineIsBlank)
        {
          Serial.print(readString);
          if(readString.indexOf(“L=1”) > 0)
          {
            // il led sarà acceso
            digitalWrite(outPin, LOW); // accendo il led
            LEDON = true;
            Serial.print("ON pin ");
            Serial.println(outPin);
          }
          if(readString.indexOf(“L=0”) > 0)
          {
            //il led sarà spento
            digitalWrite(outPin, HIGH); //sengo il led
            LEDON = false;
            Serial.print("OFF pin ");
            Serial.println(outPin);
            Serial.print(readString);
          } 
          if(readString.indexOf(“L=2”) > 0)
          {
            // il led sarà acceso
            digitalWrite(outPin2, LOW); // accendo il led
            LEDON2 = true;
            Serial.print("ON pin ");
            Serial.println(outPin2);
          }
          if(readString.indexOf(“L=3”) > 0)
          {
            //il led sarà spento
            digitalWrite(outPin2, HIGH); //sengo il led
            LEDON2 = false;
            Serial.print(“OFF pin “);
            Serial.println(outPin2);
          }
          // COSTRUZIONE PAGINA HTML
          client.println(“HTTP/1.1 200 OK…”);
          client.println(“Content-Type: text/html”);
          client.println();
          // inizializzo pagina (da togliere se uso ajax)
          client.print(“ARDUINO Controllo Led via WEB”);
          //inizai il body
          client.println(”

”); //risoluzione

client.println(“

CONTROLLO ATTUATORI via internet

”);
          client.println("
");
          client.print(“

PIN control n. “);
          client.print(outPin);
          client.println(”

”);
          client.println("
“);
          //scrivo il LED status
          client.print(“PIN status: “);
          if (LEDON)
          {
            client.println(“ON
”);
          }
          else
          {
            client.println(“OFF”);
          }
          client.print(“

ACCENDI | SPEGNI

”);
          client.println(”
”);
          client.print(“

PIN control n. “);
          client.print(outPin2);
          client.println(”

”);
          client.println(”
“);
          //scrivo il LED status
          client.print(“PIN status: “);
          if (LEDON2)
          {
            client.println(“ON
”);
          }
          else
          {
            client.println(“OFF”);
          }
          client.print(“

ACCENDI | SPEGNI

”);
          client.println(”
”);
          client.print(“

Created by: Simone

”);
          client.println(”
");
          // chiudo il div
          client.println("
");
          // chiudo pagina da togliere se uso ajax
          client.println("");
          // pulisco la stringa per la successiva lettura
          readString="";
          //fermo il client
          client.stop();
        } //if c == /n
      } // if client available
    } // while client connesso
  } // if client
} // fine loop




Vi ringrazio se potete aiutarmi.

Io per avere un login ho installato apache e php sul pc, che uso come webserver e i comandi che impartisco ad arduino li mando tramite seriale utilizzando la classe php serial class. Un pò rognosetta, su windows non son riuscito a farla funzionare (cioè il comando lo invia, ma arduino lo interpreta in maniera scorretta), ma su linux si comporta veramente bene per ora.
Così hai il guadagno di avere una pagina di controllo graficamente bella e soprattutto veloce, e non saturare arduino.
Molto comodo!!! Pensaci!!! :slight_smile:

Grazie per la risposta,
ma vorrei fare qualcosa che stà tutta nell'arduino,
in modo da renderlo completamente indipendente.

Ho provato a fare questo con "Web_Authentication.ino"
...
in pratica invece di far apparire sulla pagina web " Hello Admin"
non riesco a far partire lo sketch.

noi non abbiamo "Web_Authentication.ino" e nemmeno è presente dentro ai file dell'ide, per cui se non fai riferimento a qualche link (con apposito tag) e specificare a quale ti riferisci, difficilmente qualcuno si mette a fare ricerche per te.

da poter integrare al propio sketch in modo che dopo aver messo le giuste credenziali in una prima pagina web parta direttamente lo sketch stesso

L'autenticazione non funziona così, lo sketch non resta bloccato e poi si mette a funzionare dopo che le credenziali sono state accettate, il programma gira sempre con la differenza che senza autorizzazione non vengono eseguite una serie di istruzioni da te decise.
Anche perchè io vorrei che il mio arduino reagisse alla pressione di un pulsante indifferentemente che da remoto qualcuno sia connesso o meno.

non riesco ad integrarlo al progetto

Quello sketch che hai evidenziato è legato all'uso della lib webduino (che ha molte cose ma non gestisce file su SD) perciò non dovrai prendere pezzi da quello sketch e adattarlo al tuo progetto, ma dovrai costruire il tuo progetto su quello sketch ampliandolo.

Carica questo, studialo e aggiungi le linee che vuoi vedere sul client

leggi attentamente anche questo articolo

ciao

Ciao Pablos, grazie davvero per per la risposta.

pablos:
noi non abbiamo "Web_Authentication.ino" e nemmeno è presente dentro ai file dell'ide, per cui se non fai riferimento a qualche link (con apposito tag) e specificare a quale ti riferisci, difficilmente qualcuno si mette a fare ricerche per te.

Mi scuso se non l’ho specificato ma "Web_Authentication.ino" l’ho trovato proprio seguendo il link che mi hai messo anche te , più precisamente nella cartella “Examples” di Github:

pablos:
L'autenticazione non funziona così, lo sketch non resta bloccato e poi si mette a funzionare dopo che le credenziali sono state accettate, il programma gira sempre con la differenza che senza autorizzazione non vengono eseguite una serie di istruzioni da te decise.
Anche perchè io vorrei che il mio arduino reagisse alla pressione di un pulsante indifferentemente che da remoto qualcuno sia connesso o meno.

Forse mi sono spiegato male, non vorrei mettere il programma in funzione dopo aver inserito le giuste credenziali di accesso , ma vorrei che venisse caricata la pagina html da cui gestisco il programma.

pablos:
Quello sketch che hai evidenziato è legato all'uso della lib webduino (che ha molte cose ma non gestisce file su SD) perciò non dovrai prendere pezzi da quello sketch e adattarlo al tuo progetto, ma dovrai costruire il tuo progetto su quello sketch ampliandolo.
Carica questo, studialo e aggiungi le linee che vuoi vedere sul client
http://www.logicaprogrammabile.it/utilizzare-la-libreria-webduino/
leggi attentamente anche questo articolo
http://www.logicaprogrammabile.it/webduino-scheda-rele-evitare-blocco-arduino/
Ciao

Sinceramente adattare il mio progetto a quella libreria è quello che avevo provato a fare ( a dire il vero ho provato anche a fare l’inverso), ma la mia scarsa conoscenza della parte “programmazione” di Arduino ( mi trovo molto meglio con la parte “Hardware”) non mi permette di ottenere risultati.
Continuerò a provare per cercare una soluzione, ti ringrazio comunque per gli spunti che mi hai dato e se mai avrai tempo e voglia di aiutarmi ti prego di considermi come un “bambino” che ha Arduino da una settimana. :smiley:

Ok, ti aiuto, anche se non conosco bene quella lib.
Hai installato webduino aggiungendo la cartella e librerie varie?
Hai provato un esempio base authentication con esito positivo?

Fino qui non è difficile, quando hai fatto dimmelo

Che Arduino hai?
Che versione di IDE stai usando?
Ciao

Si ho fatto il tutto ed ho provato lo sketch della libreria che mi da accesso alla web page

"Hello User" e "Hello Admin" a secondo se mi autentifico con "user:user" o "admin:admin".

Ho un Arduino "Uno" e l'ultima IDE 1.0.6

Ciao e Grazie

Prendendo come esempio lo sketch “web_authentication”
preso da qui

noterai che fatta l’autenticazione con admin admin il browser stamperà “Buongiorno Admin!” questa è la parte che apre l’operatività del tuo sketch

if (server.checkCredentials("YWRtaW46YWRtaW4="))
  {
    //in caso affermativo...
    server.httpSuccess();
    if (type != WebServer::HEAD)
    {
      invio al browser la pagina privata
      P(helloMsg) = "<h3>Buongiorno Admin!</h3>";
      server.printP(helloMsg);
             
      
      server.printP(strMsg);
      
    }
  }
  else
  {
    //creo una risposta http nel caso in cui si tenta un accesso non autorizzato
    server.httpUnauthorized();
  }
}

poi aggiungi il

 void Start(WebServer &server, WebServer::ConnectionType type, char *url_param, bool param_complete)
{

che riconosce la modalità di invio dei messaggi … POST, GET, ecc
con la tua pagina come mostrato qui

lo so non è facile facile

Ciao pablos, ho provato ad integrare il mio sketch con la parte di autenticazione che mi hai evidenziato, ma non ne cavo le gambe.

Quello che mi incasina di più è il fatto che mentre il mio sketch è fatto, credo, in modo classico
( Dichiartazioni/Setup/Loop) l'esempio del link ha quasi tutto il codice nelle "Dichiarazioni"
e qui vado "in palla".

Come avevo accennato sopra vorrei capire se è fattibile implementare
un codice per l'autenticazione della pagina web il più indipendente posssibile dalla parte "loop",
in modo da poterlo usare più facilmente con qualsiasi tipo di sketch.

Se puoi aiutami a capire con esempi semplici, altrimenti ti ringrazio lo stesso,
ma temo che per adesso dovrò lasciare "in chiaro" la mia pagina web :smiley: