Re: Arduino Webserver mit Passwort schützen

Hallo ihr Arduino Freaks :slight_smile: ,
ich möchte mich ersteinmal vorstellen ich heiße Michael und komme aus dem raum Hannover.
Ich bin absulut ein Fan von automatisierung und Smart Home, beruflich habe ich viel damit am Hut.
Nur ich möchte nicht auf KNX oder sonstige fertig Lösungen zugreifen kann ja jeder... :slight_smile: :slight_smile:

Ich bin gerade dabei eine Homepage zu erstellen wo diverse Arduino´s via. iframe implentiert werden sollen zum steuern meiner Wohnung & meiner Standheizung im Auto.

Nun stecke ich momentan leider ein bisschen fest da ich überhaupt kein C freak bin
und ich es mir beibringen möchte, am besten hat es immer geklapt in demt ich mit ein vorhanden Projekt angefangen habe um diese zu ändern und zu verstehn.

Nun zu mein Problem... :confused:

Ich habe zwei Arduino Sketches genommen und kombiniert den von:
Jurs riesen Lob echt cool gemacht und erklärt bisher
Und ein Sketch den ich auf homebrew-tech.com gefunden habe

Die Passwort Abfrage scheint zu funktionieren nur ich weiß nicht warum ich was anklicken kann
wenn ich einfach das PW anfrage Fenster einfach schließe kann ich ein Pin kurz schalten ohne Passwort der Pin geht zwar sofort wieder aus (bleibt mit PW eingeschaltet) ich denke da ist noch ein Fehler drin nur ich finde ihn nicht... :frowning:

Ich zeige euch mal meinen Sketch ist vielleicht das einfachste für euch, mir hoffentlich zu helfen :confused:

/*
 Web Server


Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

*/

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 55);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
// Open serial communications and wait for port to open:
 Serial.begin(9600);
 pinMode(8, OUTPUT);    //  Set digital pin 8 as output
  while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }

 // start the Ethernet connection and the server:
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.print("server is at ");
 Serial.println(Ethernet.localIP());
}


void SendOKpage(EthernetClient &client)
{
         // send a standard http response header
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println("Connnection: close");
         client.println();
         client.println("<!DOCTYPE HTML>");
         client.println("<html>");
                   // add a meta refresh tag, so the browser pulls again every 5 seconds:
         client.println("<meta http-equiv=\"refresh\" content=\"5\">");
         // output the value of each analog input pin
         for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
                 
         }
         client.println("</html>");
}


void SendAuthentificationpage(EthernetClient &client)
{
         client.println("HTTP/1.1 401 Authorization Required");
         client.println("WWW-Authenticate: Basic realm=\"Secure Area\"");
         client.println("Content-Type: text/html");
         client.println("Connnection: close");
         client.println();
         client.println("<!DOCTYPE HTML>");
         client.println("<HTML>  <HEAD>   <TITLE>Error</TITLE>");
         client.println(" </HEAD> <BODY><H1>401 Unauthorized.</H1></BODY> </HTML>");
}

char linebuf[80];
int charcount=0;
boolean authentificated=false;

void loop() {
 // listen for incoming clients
 EthernetClient client = server.available();
 if (client) {
   Serial.println("new client");
   
   memset(linebuf,0,sizeof(linebuf));
   charcount=0;
   authentificated=false;
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   String buffer = "";  //  Declare the buffer variable
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
  
       linebuf[charcount]=c;
       if (charcount<sizeof(linebuf)-1) charcount++;
       Serial.write(c);
       buffer+=c;
       // if you've gotten to the end of the line (received a newline
       // character) and the line is blank, the http request has ended,
       // so you can send a reply
       if (c == '\n' && currentLineIsBlank) {
         if (authentificated)
           SendOKpage(client);
         else
           SendAuthentificationpage(client); 
       
       
       
       //Ausgänge schalten  
      //--------------------------------------------------------------------------------------------------------------------
         if (digitalRead(8)){  //  1<-- Display LED status
           client.print(" LED ist ON");
         }else{
           client.print(" LED ist OFF");
         }
         client.println("
");
         
         // 2<-- Create a form
         client.print("<FORM action=\"http://192.168.1.55/\" >");
         client.print("<P> <INPUT type=\"radio\" name=\"status\" value=\"1\">ON");          
         client.print("<P> <INPUT type=\"radio\" name=\"status\" value=\"0\">OFF");     
         client.print("<P> <INPUT type=\"submit\" value=\"senden\"> </FORM>");
        
        
         client.print("<FORM action=\"http://192.168.1.55/\" >");
         client.print("&nbsp <INPUT type=\"radio\" name=\"status\" value=\"1\">ON");
         client.print("&nbsp <INPUT type=\"radio\" name=\"status\" value=\"0\">OFF");
         client.print("<P> &nbsp &nbsp &nbsp &nbsp<INPUT type=\"submit\" value=\"senden\"> </FORM>");
        //--------------------------------------------------------------------------------------------------------------------
         
         
         
         
      
         
         break;
        
       }
       if (c == '\n') {
         // you're starting a new line
        currentLineIsBlank = true;
         if (strstr(linebuf,"Authorization: Basic")>0 && strstr(linebuf,"YXJkdWlub21z")>0) //BASE64-Verschlüsselung PW:arduinoms
           authentificated=true; 
           
         memset(linebuf,0,sizeof(linebuf));
         currentLineIsBlank = true;
       
       
       
       
       //Ausgänge schalten
       //--------------------------------------------------------------------------------------------------------------------
       
         buffer="";       //  Clear the buffer at end of line
       } else if (c == '\r') {            
         if(buffer.indexOf("GET /?status=1")>=0)
           digitalWrite(8,HIGH);  // Catch ON status and set LED
         
         if(buffer.indexOf("GET /?status=0")>=0)
           digitalWrite(8,LOW);  // Catch OFF status and set LED
        
        //--------------------------------------------------------------------------------------------------------------------
        
        
        
        
        
         charcount=0;          
         
       }
       else if (c != '\r') {
         // you've gotten a character on the current line
         currentLineIsBlank = false;
       }
     }
   }
   // give the web browser time to receive the data
   delay(1);
   // close the connection:
   client.stop();
   Serial.println("client disonnected");
 }
}

Was macht die Sonnenbrille in deinem Code?

".....digitalRead(8))....) bei //Ausgänge schalten

stoni99:
Was macht die Sonnenbrille in deinem Code?

".....digitalRead(8))....) bei //Ausgänge schalten

Da kommt davon weil man nicht die CODE-TAGS verwendet.
Grüße Uwe

SPSfetishist:
Ich bin gerade dabei eine Homepage zu erstellen wo diverse Arduino´s via. iframe implentiert werden sollen zum steuern meiner Wohnung & meiner Standheizung im Auto.

Hi,

wo läuft denn deine Homepage ?

Falls deine HP ein "Iframe-sammelnder" Webserver ist (zb apache) würde ich die PW-Abfrage da machen,
da kannst du dann sogar verschlüsseln ...

Grüße
Harry