Ethershield, HTTP Fragen

Guten Tag alle zusammen,
da mein altes Thema noch im Alten Forum hängt kann ich dort nicht weiter posten.
Aber grundlegend habe ich versucht mit dem Arduino UNO und einem Ethernetshield einen Webserver zu errichten.
Dies ist mir auch gelungen.
Grundlegende Problematik war früher das ich eine Passwortabfrage realisieren wollte via " GET", dies hat auch schlussendlich geklappt.
Jedoch, neues Jahr neue Herrausforderungen.

Die Abfrage mit GET geht zwar aber nun will ich mehr, undzwar eine " Richtige" internetseite.
Nach diesem Motto : Arduino wird via Ip im Browser aufgerufen und es zeigt sich eine “Log In” Page.
Nachder erfolgreichen Eingabe des Passworts möchte ich zu ein paar “Links” gelangen : Temperatur Drinnen / Draußen / Luffeuchtigkeit/ IO Controll.

Problem ist in dem Zusammenhang das ich Zwar die Login seite bekomme jedoch scheitert es dann schon an den Links.
Also habe ich einfach mal alle Daten ( Temp, innen aussen, IO controll usw ) auf die Seite nach dem Einloggen gepackt.
Nicht schön aber geht erstmal, das IO Controll geht Via Checkboxen… sobalt ich eine Anhake fliege ich wieder auf die “Login” page,
Ist auch klar weil in der URL nichtmehr das Passwort steht was ich mit GET abfrage…
Wie lässt sich das ganze lösen?

Ich hatte mal den Ansatz via POST jedoch weiß ich weder genaue syntax noch richtige Anwendung.

Code etwas unsauber, jedoch funktional. ( Luftfeuchtemessung ist zurzeit noch nicht integriert)

#include <String.h>
#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#define ONE_WIRE_BUS 7
DeviceAddress insideThermometer, outsideThermometer;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC = sensors.getTempC(insideThermometer);
float Temperatur;

//##################################################################################################

byte mac[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX};	        // MAC Adresse des Arduino Boards
byte ip[] = {192, 168, 178, 5 };			        // IP Adresse des Arduino Boards
byte gateway[] = {192, 168,178, 1 };				// Gateway Fritzbox
byte subnet[] = {255, 255, 255, 0 };				// Subnet Maske 
Server server = Server(80);			                // Port Einstellung (Standard 80)

//##################################################################################################
LiquidCrystal lcd(9, 8, 5, 4, 3, 2);       


//##################################################################################################

int ledPin = 5;
String readString = String(30); 
boolean LEDON = false;

//##################################################################################################

////
String PW= "POST /?Passwort=Passwort";
////



void setup() {
  
  
  Wire.begin();						
  Ethernet.begin(mac, ip);//, gateway, subnet);                // Ethernet starten
  server.begin();					       // Auf Clients warten
  Serial.begin(9600);
  sensors.begin();
  lcd.begin(16, 2);
  pinMode(10,OUTPUT);

}



void loop() {

  

  float tempC = sensors.getTempC(insideThermometer);
  Client client = server.available();		               // Prüfen, ob Client Seite aufruft
   
  if (client) {
    while (client.connected()) {
   if (client.available()) {
    char c = client.read();
   if (readString.length() < 30) 
      {
       
      readString = readString + c;
      }  
     Serial.print(c);
        
        if (c == '\n') {
            
         
                   
          if(readString.indexOf("LED")>0)
           {
           
             digitalWrite(ledPin, HIGH);   
             LEDON = true;
           }
           if(readString.indexOf("LED")<1)
         {
         digitalWrite(ledPin, LOW);    
             LEDON = false;
         }
   
//############################################################################################


    server.print("HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n");
    server.print("<HTML><HEAD><TITLE>");
    server.print("Arduino Temperatur");
    server.print("</TITLE>");
    server.print("</HEAD><BODY>");
    server.print("<body bgcolor='#CCFFCC'>");
    server.print("<b> <font color='#2076CD'>  Arduino Temperaturmonitor  </font color></b>
");
    server.print("
");
    server.print("ArduinoUNO Temperaturen :  ");
    server.println("<form method=post/getvalue name=PASSWORTABF >Passwort <input name=Passwort type=text >
<input type=submit value=Bestätigen></form>");
   
    if(readString.startsWith(PW))
    {
   
    {
    if (tempC < frierpunkt)
    server.print( "<font color='#FF0000'> Achtung Glatteis Gefahr!</font color>" );
    }
    
    
    server.print("
");
    server.print("
");
    server.print("Aussen Temperatur ");
    server.print(tempC);
    server.print(" C");
    server.print("
");
    server.print("
");
    server.print("Zimmer Temperatur ");
    server.print(Temperatur);
    server.print(" C");
    server.print("<meta http-equiv= refresh content=100; URL=http://19.168.178.5/");
    server.print(" Celsius
 ");
    server.print(" </BODY></HTML> ");
    server.print("
");
    server.print("
");     

//!!       
// Hier startet die zurzeit auskommentierte Checkbox abfrage!
//!!
   
         // server.println("<form method=get name=LED><input type=checkbox name=Passwort/Check value=1>LED
<input type=submit value=Besaetigen></form>");  
      
    
          // server.println("
");
          //server.print("LED Status: ");
          //if (LEDON)
          //server.println("<font color='green' size='3'>EIN"); 
          // else
          //server.println("<font color='red' size='3'>AUS"); 
    
      }
    readString="";
    delay(10);						 // Kurz warten, um Daten zu senden
    client.stop();					 // Verbindung mit dem Client trennen
    
}



   }}}

{


Temperatur = analogRead(A3);         
Temperatur = (5.0 * Temperatur *100.0 )/1024.0;
Serial.print (Temperatur);
}    

{
  if (!sensors.getAddress(insideThermometer, 0));
  sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));  
  float tempC = sensors.getTempC(insideThermometer);
}
 
 
 
 lcd.setCursor(0, 0);
 lcd.print("In");
 
 lcd.setCursor(4, 0);
 lcd.print(Temperatur);

 lcd.setCursor(0, 1);
 lcd.print("Out");
 
 lcd.setCursor(4, 1);
 lcd.print(tempC);

lcd.setCursor(9, 1);
 lcd.print("  ");


//{
 // if(tempC >weiss)
  
  //{
  //digitalWrite(5,HIGH);
 // digitalWrite(6,HIGH);
  //digitalWrite(7,HIGH);
//}

//if(tempC < blau)

//{
 //digitalWrite(5,LOW);
 //digitalWrite(6,HIGH);
 // digitalWrite(7,LOW);


//}


//if(tempC >gelb)

//{
 //digitalWrite(5,HIGH);
 // digitalWrite(6,LOW);
  //digitalWrite(7,HIGH);


//}

//if(tempC >rot)

//{
 //digitalWrite(5,LOW);
 //digitalWrite(6,LOW);
  //digitalWrite(7,HIGH);


//}
//}
}

Zunächstmal fehlt Deinem Tag der Parameter “action”.
also sowas wie …
Der Trick ist nun (nicht schön aber erstmal funktionabel) dem Action-Parameter wieder den GET-Parameter für das Passwort mitzugeben:

..., wenn Du die Seite mit dem IO-Formular an den Browser ausgibst. Damit steht zwar Dein Passwort im Quelltext der Webseite, aber erst nach dem Login. Außerdem steht beim Login das Passwort eh in der URL, daher ist das aus sicherheitstechnischer Sicht auch nicht schlimmer. Alternativ müßtest Du Dir eine Sessionverwaltung programmieren.

Ahhhh :astonished: Vielen Dank! Okay, ich werde das morgen mal versuchen einzubauen. Ja grundlegend ist mein Passwort in der URL enthalten, aber natürlich erst nachdem ich es eingegeben habe, also für mich ist das okay. Das heist beim Aufruf einer Seite nach dem Login gebe ich einfach mein Passwort mit?

Wie sieht meine Probelmatik mit den "Links" aus? Ich brauche also nach dem Login eine Liste von Links haben hinter denen sich die einzelnen Funktionen verstecken, da müsste ich ja auch das Passwort mitgeben? ;)Gruß

Genau so sieht es aus.

Ein Link würde dann so aussehen: Link-Text
temp_innen.html ist natürlich nur ein Beispiel.
Mario.

Servus!

Nachdem das ja alles keine Pin-Daten sind, schlage ich einen alternativen Ansatz vor: Alle Daten sind schon auf der Login-Seite in versteckten DIVs. Die Daten sind mit den Loginuser und dem Passwort verschlüsselt. Beim Login werden die DIVs sichtbar gemacht und die Daten entschlüsselt. Alles mit JavaScript im Browser des Besuchers. Das könnte dir Platz auf dem arduino und viel Arbeit sparen. JavaScript framework kannste von google aus einbinden. Stichwort jQuery.

Gruß, Marc