Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #15 on: December 22, 2012, 11:23:40 am » |
Il problema è che ogni volta che si fa una richiesta avviene il controllo dell'user e password e non trovandola viene messa false. Ecco perché torna alla pagina di login. Ho messo i parametri della mia rete... dovresti modificarli per la tua. #include <String.h> #include <SPI.h> #include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address byte ip[] = { 192, 168, 40, 220 }; // ip in lan byte gateway[] = { 192, 168, 40, 254 }; // ip in lan byte subnet[] = { 255, 255, 255, 0 }; //subnet mask EthernetServer 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(){ delay(2000);
pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); Serial.print("Serial Start! at "); Serial.print(millis()); Serial.println(" millisecond.");
Ethernet.begin(mac, ip, gateway, gateway, subnet); delay(1000);
Serial.println("Ethernet configured"); Serial.print("Local IP: "); Serial.println(Ethernet.localIP()); Serial.print("SubnetMask: "); Serial.println(Ethernet.subnetMask()); Serial.print("Gateway: "); Serial.println(Ethernet.gatewayIP()); Serial.print("DNS Server: "); Serial.println(Ethernet.dnsServerIP());
Serial.println("Wait client..."); }
void loop(){ EthernetClient client = server.available(); if (client) { Serial.println("Client connect"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); readString.concat(c); // Serial.print("readString: "); // Serial.println(readString); if (c == '\n' && currentLineIsBlank){ Serial.print("--> "); Serial.println(readString); WebPage(client); //clearing string for next read readString=""; //stopping client client.stop(); } } } Serial.println("Client disconnect"); } }
void WebPage (EthernetClient &client){
// Check Login if(readString.indexOf("Nome=user&Pwd=pass") > 0) { login=true; Serial.println("Login OK "); } else { login=false; Serial.println("No Login"); }
// Check Led if(login==true){ if(readString.indexOf("L=1") > 0) { digitalWrite(3, HIGH); // set the LED on LED1ON = true; }
if(readString.indexOf("L=01") > 0) { //led has to be turned OFF digitalWrite(3, 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(5, HIGH); // set the LED on LED2ON = true; }
if(readString.indexOf("L=02") > 0) { //led has to be turned OFF digitalWrite(5, 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(6, HIGH); // set the LED on LED3ON = true; }
if(readString.indexOf("L=03") > 0) { //led has to be turned OFF digitalWrite(6, LOW); // set the LED OFF LED3ON = false; } }
// INIZIO DICHIARAZIONE PAGINA HTML client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/html")); client.println(); client.print(F("<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 if (login==false) { // client.print(F("<form action='http://192.168.40.220/'>")); client.print(F("<form>")); client.print(F("Nome")); client.print(F("utente: <input name='Nome' value=''>")); client.print(F("Password: <input type='Password' name='Pwd' value=''>")); client.print(F("<input type='submit' value=' OK '>")); client.print(F("</form>")); }
// Login OK if (login==true) { //Primo led client.println(F("<hr />")); client.println(F("<h1>LED1</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED1ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>")); client.println(F("<hr />"));
//Secondo led client.println(F("<h1>LED2</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED2ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>")); client.println(F("<hr />"));
//terzo led client.println(F("<h1>LED3</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED3ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>")); } //chiude if login=true client.println(F("</body></html>")); }
potresti togliere questa parte else { login=false; Serial.println("No Login"); } ma in questo modo una volta fatto il login la variabile non diventerebbe mai "false".
|
|
|
|
« Last Edit: December 22, 2012, 11:27:05 am by PaoloP »
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #16 on: December 22, 2012, 11:31:15 am » |
a me continua a non funzionare, sempre la stessa cosa dopo il login clicco su ON oppure OFF e torna alla pagina di login
Serial Start! at 1999 millisecond. Ethernet configured Local IP: 192.168.1.220 SubnetMask: 255.255.255.0 Gateway: 192.168.1.200 DNS Server: 192.168.1.200 Wait client... Client connect --> GET / HTTP/1.1
No Login Client disconnect Client connect --> GET /?Nome=user&Pwd=pass HTTP/1.1
Login OK Client disconnect Client connect --> GET /?L=1 HTTP/1.1
No Login Client disconnect
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #17 on: December 22, 2012, 11:35:58 am » |
Si, lo so che non funziona.... ho tirato fuori il mio Arduino R3 + Ethernet shield e sto provando "con mano" il codice. Il problema come ti ho detto nel messaggio precedente è che ogni volta che invii un comando all'Arduino lui fa il check della login. Bisognerebbe aggiungere una variabile firstlogin in modo da discriminare se il login è stato già fatto. Adesso ci lavoro un po' su. 
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #18 on: December 22, 2012, 12:08:27 pm » |
Ho rivisto la logica del login. Ho aggiunto un timeout impostatile (adesso è 60 secondi) e un pulsante Exit. #include <String.h> #include <SPI.h> #include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address byte ip[] = { 192, 168, 40, 220 }; // ip in lan byte gateway[] = { 192, 168, 40, 254 }; // ip in lan byte subnet[] = { 255, 255, 255, 0 }; //subnet mask EthernetServer 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;
unsigned int currentmillis = 0; unsigned int interval = 60*1000;
void setup(){ delay(2000);
pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); Serial.print("Serial Start! at "); Serial.print(millis()); Serial.println(" millisecond.");
Ethernet.begin(mac, ip, gateway, gateway, subnet); delay(1000);
Serial.println("Ethernet configured"); Serial.print("Local IP: "); Serial.println(Ethernet.localIP()); Serial.print("SubnetMask: "); Serial.println(Ethernet.subnetMask()); Serial.print("Gateway: "); Serial.println(Ethernet.gatewayIP()); Serial.print("DNS Server: "); Serial.println(Ethernet.dnsServerIP());
Serial.println("Wait client..."); currentmillis = millis(); }
void loop(){ EthernetClient client = server.available(); if (client) { Serial.println("Client connect"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); readString.concat(c); if (c == '\n' && currentLineIsBlank){ Serial.print("--> "); Serial.println(readString); CheckLogin(); if(login==true) CheckLed(); WebPage(client); //clearing string for next read readString=""; //stopping client client.stop(); } } } Serial.println("Client disconnect"); } }
void WebPage (EthernetClient &client){ // INIZIO DICHIARAZIONE PAGINA HTML client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/html")); client.println(); client.print(F("<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 if (login==false) { // client.print(F("<form action='http://192.168.40.220/'>")); client.print(F("<form>")); client.print(F("Nome")); client.print(F("utente: <input name='Nome' value=''>")); client.print(F("Password: <input type='Password' name='Pwd' value=''>")); client.print(F("<input type='submit' value=' OK '>")); client.print(F("</form>")); }
// Login OK if (login==true) { //Primo led client.println(F("<hr />")); client.println(F("<h1>LED1</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED1ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>")); client.println(F("<hr />"));
//Secondo led client.println(F("<h1>LED2</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED2ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>")); client.println(F("<hr />"));
//terzo led client.println(F("<h1>LED3</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED3ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>"));
client.println(F("<hr />")); //Exit // client.println(F("<h1>Exit</h1>")); // client.println(F("<br />")); client.print(F("<h2><a href='/?L=Exit'>Exit</a>"));
} //chiude if login=true client.println(F("</body></html>")); }
void CheckLogin() { // Check Login if ((millis() - currentmillis) > interval){ login = false; currentmillis = millis(); Serial.println("Login Timeout"); } if (readString.indexOf("Nome=user&Pwd=pass") > 0) { login=true; currentmillis = millis(); Serial.println("Login OK "); } if (readString.indexOf("L=Exit") > 0) { login=false; Serial.println("No Login"); } }
void CheckLed() { // Check Led
if(readString.indexOf("L=1") > 0) { digitalWrite(3, HIGH); // set the LED on LED1ON = true; }
if(readString.indexOf("L=01") > 0) { //led has to be turned OFF digitalWrite(3, 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(5, HIGH); // set the LED on LED2ON = true; }
if(readString.indexOf("L=02") > 0) { //led has to be turned OFF digitalWrite(5, 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(6, HIGH); // set the LED on LED3ON = true; }
if(readString.indexOf("L=03") > 0) { //led has to be turned OFF digitalWrite(6, LOW); // set the LED OFF LED3ON = false; } }
|
|
|
|
« Last Edit: December 22, 2012, 12:17:36 pm by PaoloP »
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #19 on: December 22, 2012, 12:17:28 pm » |
Senti non ho parole...funziona alla grande ma tu di professione fai il programmatore?
Ora nella mia ignoranza totale cerco almeno di capire la logica del tuo codice con la speranza di imparare
Grazie infinite per la tua disponibilità gentilezza e soprattutto per la tua professionalità.
Cmq poi aprirò sicuramente un'altro post per avere delle delucidazioni in merito alle uscite disponibili dell' Arduino Ethernet tipo l'uscita 0 e 1, che ho capito che servono per la programmazione via seriale, ma poi staccato la seriale si possono usare?
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #20 on: December 22, 2012, 12:20:49 pm » |
Non sono un programmatore ne un elettronico. ho solo un po' di passione e mi documento su quello che mi interessa. I pin 0 e 1 sono collegati alla seriale hardware del chip di Arduino e sono usate per la programmazione via seriale. Possono essere usate per il proprio progetto per collegare periferiche seriali come i moduli bluetooth. Credo che nel codice che ho scritto ci sia un problema col timeout. 
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #21 on: December 22, 2012, 12:36:37 pm » |
facendo qualche prova mi sembra che dopo il login accendo un led aspetto il timeout se provo a cambiare lo stato di qualche led torna alla pagina di login, però se faccio il login di nuovo non mi porta sulla gestione dei led, ma resta sempre nella pagina del login, a questo punto non basta chiudere e riaprire il browser, ma devo resettare l'Arduino. Per avere conferma ho commentato tutto il codice relativo al timeout e sembra funzionare bene.
|
|
|
|
« Last Edit: December 22, 2012, 01:02:42 pm by format »
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #22 on: December 22, 2012, 12:47:42 pm » |
Adesso dovrebbe andare. Più o Meno.  #include <String.h> #include <SPI.h> #include <Ethernet.h>
byte mac[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA }; IPAddress ip(192, 168, 40, 15); IPAddress gateway(192, 168, 40, 254); IPAddress subnet(255, 255, 255, 0); EthernetServer 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;
unsigned int previousMillis = 0; unsigned int currentMillis = 0; unsigned int interval = 60*1000;
void setup(){ delay(2000);
pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); Serial.print("Serial Start! at "); Serial.print(millis()); Serial.println(" millisecond.");
Ethernet.begin(mac, ip, gateway, gateway, subnet); // delay(2000);
Serial.println("Ethernet configured"); Serial.print("Local IP: "); Serial.println(Ethernet.localIP()); Serial.print("SubnetMask: "); Serial.println(Ethernet.subnetMask()); Serial.print("Gateway: "); Serial.println(Ethernet.gatewayIP()); Serial.print("DNS Server: "); Serial.println(Ethernet.dnsServerIP());
Serial.println("Wait client..."); }
void loop(){ currentMillis = millis(); EthernetClient client = server.available(); if (client) { Serial.println("Client connect"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); readString.concat(c); if (c == '\n' && currentLineIsBlank){ Serial.print("--> "); Serial.println(readString); CheckLogin(); if(login==true) CheckLed(); WebPage(client); //clearing string for next read readString=""; //stopping client client.stop(); } } } Serial.println("Client disconnect"); } }
void CheckLogin() { if (currentMillis - previousMillis > interval){ login = false; previousMillis = currentMillis; Serial.println("Login Timeout"); } if (readString.indexOf("Nome=user&Pwd=pass") > 0) { login=true; previousMillis = currentMillis; Serial.println("Login OK "); } if (readString.indexOf("L=Exit") > 0) { login=false; Serial.println("No Login"); } }
void WebPage (EthernetClient &client){ // INIZIO DICHIARAZIONE PAGINA HTML client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/html")); client.println(); client.print(F("<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 if (login==false) { // client.print(F("<form action='http://192.168.40.220/'>")); client.print(F("<form>")); client.print(F("Nome")); client.print(F("utente: <input name='Nome' value=''>")); client.print(F("Password: <input type='Password' name='Pwd' value=''>")); client.print(F("<input type='submit' value=' OK '>")); client.print(F("</form>")); }
// Login OK if (login==true) { //Primo led client.println(F("<hr />")); client.println(F("<h1>LED1</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED1ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=1'>ON</a> | <a href='/?L=01'>OFF</a></h2>")); client.println(F("<hr />"));
//Secondo led client.println(F("<h1>LED2</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED2ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=2'>ON</a> | <a href='/?L=02'>OFF</a></h2>")); client.println(F("<hr />"));
//terzo led client.println(F("<h1>LED3</h1>")); client.println(F("<br />")); //printing LED status client.print(F("<span>STATO LED: </span>"));
if (LED3ON) { client.println(F("<span style='color:green'>ON</span>")); } else { client.println(F("<span style='color:grey'>OFF</span>")); } client.print(F("<h2><a href='/?L=3'>ON</a> | <a href='/?L=03'>OFF</a></h2>"));
client.println(F("<hr />")); //Exit // client.println(F("<h1>Exit</h1>")); // client.println(F("<br />")); client.print(F("<h2><a href='/?L=Exit'>Exit</a>"));
} //chiude if login=true client.println(F("</body></html>")); }
void CheckLed() { // Check Led
if(readString.indexOf("L=1") > 0) { digitalWrite(3, HIGH); // set the LED on LED1ON = true; }
if(readString.indexOf("L=01") > 0) { //led has to be turned OFF digitalWrite(3, 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(5, HIGH); // set the LED on LED2ON = true; }
if(readString.indexOf("L=02") > 0) { //led has to be turned OFF digitalWrite(5, 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(6, HIGH); // set the LED on LED3ON = true; }
if(readString.indexOf("L=03") > 0) { //led has to be turned OFF digitalWrite(6, LOW); // set the LED OFF LED3ON = false; } }
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #23 on: December 22, 2012, 01:02:24 pm » |
Ora funziona alla grande. Ma tutto questo codice potrei metterlo anche su una SD? Ma la F dopo print a cosa serve?
Grazie ancora
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #24 on: December 22, 2012, 01:24:37 pm » |
Per metterlo su una SD bisognerebbe modificare pesantemente il codice scritto. La funzione F serve per risparmiare memoria dicendo ad Arduino di caricare il testo direttamente dalla memoria flash e non dalla memoria Ram. Funziona solo con il testo "statico" e non con le variabili. Però e molto utile in questi casi, così Arduino non si impalla per mancanza di memoria.
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Genova
Offline
Edison Member
Karma: 13
Posts: 2434
|
 |
« Reply #25 on: December 22, 2012, 03:06:16 pm » |
Io per 401 intendevo questo void WebPage (EthernetClient &client){ // INIZIO DICHIARAZIONE PAGINA HTML client.print("HTTP/1.1 401 Authorization Required\r\n"); client.print("WWW-Authenticate: Basic realm=\"mio login\"\r\n"); //client.println(); //client.println(F("HTTP/1.1 200 OK")); //client.println(F("Content-Type: mime/type")); client.println(); client.print(F("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>")); Queste 2 righe fanno apparire il popup di autenticazione da qualsiasi client compatibile compresi gli smartphone, se non altro questa non è visibile sulla get ed è minimamente criptata in base64, nel char c = client.read(); viene racchiuso l'user e pass codificato, resta solo confrontare la stringa che si può leggere in fase di realizzazione con l'uso di debug o online usando una decodifica base64 senza l'uso di nessuna libreria, poi ci sarebbe l'algoritmo MD5 un po' più complicato ma fattibile lo stesso la cifratura è un po' più complessa e più difficile intercettarla e decodificarla. ciao
|
|
|
|
« Last Edit: December 22, 2012, 05:11:08 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #26 on: December 22, 2012, 05:26:21 pm » |
Interessante. 
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 42
|
 |
« Reply #27 on: December 22, 2012, 05:39:22 pm » |
ho applicato queste righe: client.print("HTTP/1.1 401 Authorization Required\r\n"); client.print("WWW-Authenticate: Basic realm=\"mio login\"\r\n"); al codice però non funziona bene, nel senso che mi esce la richiesta di login, ma se faccio annulla torno al login del codice originale, inoltre se provo ad accendere / spegnere un led mi compare sempre il popup di autenticazione. Quindi credo che bisognerebbe adattare tutto il codice per questo tipo di login.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 13
Posts: 2434
|
 |
« Reply #28 on: December 22, 2012, 05:51:53 pm » |
Certo, ho scritto le righe del richiamo, poi devi fare tu le tue elaborazioni dei response ricevuti leggendo il char c, sono meno modifiche di quanto credi, una volta avute le credenziali puoi lanciare il 200 altrimenti sempre il 401
|
|
|
|
« Last Edit: December 22, 2012, 05:53:34 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Genova
Offline
Edison Member
Karma: 13
Posts: 2434
|
 |
« Reply #29 on: December 22, 2012, 06:05:02 pm » |
usando ad esempio questa pag http://www.motobit.com/util/base64-decoder-encoder.aspscrivendo adminadmin (user=admin ... passw=admin) otterrai questa stringa YWRtaW5hZG1pbg== ... dovrai cercarla nel char c se readString è == a "YWRtaW5hZG1pbg==" manda le altre linee del client.print con codice 200, altrimenti rimandami un 401 dove in pratica riapri il popup, oppure se la pass è sbagliata scrivi con codice 200 client.print Pass errata + un tasto nella pagina "ritorna al login" rilanciando nuovamente un 401 e così all'infinito. Comunque dipende dal livello di sicurezza che vuoi ottenere. Con la stringa ottenuta dalla decodifica MD5 invece di 16 caratteri ne hai 32, ma a differenza del base64 l'MD5 non è reversibile cioè dalla stringa codificata non si può risalire a user e pass (o comunque è molto difficile si ottengono molte probabilità e molti conflitti) mentre se nel link che ho incollato prima scrivi ..... decodifica questa stringa a base64 YWRtaW5hZG1pbg== puoi risalire all'user e alla pass che poi vai a scrivere nel popup (però prima mi devo attrezzare per intercettarla) Se a un utente interessa invece codificare tutto il traffico in entrata e in uscita ad esempio il get?on=1 allora deve usare la libreria di codifica e decodifica base64 o la pesantissima MD5, tutto ciò però succhia risorse ad arduino, un 16 MHz è un po' limitato a fare tutto ciò, ma non è impossibile in linea di principio per avere una maggior sicurezza servirebbe l'https, in questo caso arduino deve essere dietro a un server ben fatto ciao
|
|
|
|
« Last Edit: December 22, 2012, 06:44:32 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
|