wie richte ich einen Webserver mit Buttons ein??? HILFE :-(

Hallo,

ich möchte gerne folgendes Projekt verwirklichen:
Ein Codeschloss mit Keypad und LCD Display. Das ist soweit auch alles schon funktionsfähig. Nun möchte ich mittels Eathernet Shield per Webseite auf den Arduino zugreifen und zum Beispiel sehen, ist die Tür aktuell geöffnet, wann war sie das letzte mal auf,... auch soll die Tür über einen Button auf der Webseite fern geöffnet werden. Die ganze Webseite soll natürlich noch Kennwortgeschützt sein.

Keypad und LCD Display funktionieren - mit Webserver ect. habe ich noch NIE gearbeitet, daher bin ich sehr dankbar für INFOS´s, Tutorials, Beispiel Codes, eigene Projektbeschreibungen, ect...

Vielen Dank schonmal im vorraus,

viele Grüße Tobias

Hallo Tobias93,

wo hast du denn schon überall selbst nach den Informationen gesucht?
Das Forum ist voll davon:
Tür Öffner - RFID, Bluetooth und Ethernet

Temperaturdaten (mit DS1820) von Arduino über Ethernet an FHEM übermitteln ?!
In Weiser Voraussicht schonmal das hier:
Mega 2560 + Ethernet Shield + LCD Shield
Und zu guter Letzt:
Funkschalter in Webserver einbinden

Damit solltest du alle nötigen Informationen haben um dein Projekt realisieren zu können.

Gruß,
trib

Wenn das ganze halbwegs sicher sein soll brauchst du https zur Datenübertragung. Das ist meines Wissens mit mit dem Arduino nicht möglich. Ich denke bei deinem Projekt fährst du mit z.B. einem Raspberry Pi deutlich besser. Da hast du ei komplettes Linux was dir alle gängigen Serverdienste liefert. Und im Preis/Leistungsverhältnis ist der Raspberry Pi doch deutlich besser als ein Mega + Ethernet Shield. Wenn du Doch zum Arduino Tendiers achte darauf, dass das Ethernet Shield einem W5100 und nicht mit einem enc28j60 ausgestattet ist.

circuit99:
Wenn das ganze halbwegs sicher sein soll brauchst du https zur Datenübertragung. Das ist meines Wissens mit mit dem Arduino nicht möglich.

Das möchte ich mit einem eindeutigen "Jein" beantworten.
Natürlich kann man seine eigenen Sicherheitsfeatures implementieren und diese auch so dynamisch gestalten, dass im Falle eines mitlesenden Dritten, aus den Daten kein Rückschluss auf die "Verschlüsselung" oder den Sicherheitskey gezogen werden kann.
Das erfordert natürlich ein bisschen Arbeit und wird nie 100%ig sicher sein.

Da das EthernetShield hinter einem Router hängen wird, kann man diesen natürlich auch ein bisschen Arbeit abnehmen lassen. Je nach Modell ist es dort möglich einige Sicherheitsfeatures für den Fernzugriff einzurichten.
Schlussendlich muss aber erstmal jemand die Adresse herausfinden, das Potential dahinter entdecken, die Verschlüsselung knacken, den Befehl an den Arduino herausfinden und dann noch wissen wo auf der Welt diese Tür überhaupt ist.

Um "nur" einen Türöffner zu bauen finde ich den Raspberry Pi etwas zu überdimensioniert.

Schlussendlich wäre ich natürlich sehr vorsichtig so einen Türöffner zu programmieren, halte es aber nicht für grundsätzlich unsicher.

Hallo Tobias,
zum Testen könnte vielleicht das erst einmal reichen

/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 
 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,178, 177);

// 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);
   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 loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(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) {
          // 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++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        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");
  }
}

Gruß Gerd

Hallo Gerd,

vielen Dank für den Code. Welche Funktion hat der Sketch, bzw. was muss Hardwaretechnisch noch wo angeschloßen werden?

Gruß Tobias

Trib:
Natürlich kann man seine eigenen Sicherheitsfeatures implementieren und diese auch so dynamisch gestalten, dass im Falle eines mitlesenden Dritten, aus den Daten kein Rückschluss auf die "Verschlüsselung" oder den Sicherheitskey gezogen werden kann.
Das erfordert natürlich ein bisschen Arbeit und wird nie 100%ig sicher sein.

Tobias93 fragte wie man einen Button auf eine HP setzt. Wie hoch ist schätzt du die Wahrscheinlichkeit dass er eine Verschlüsselung selbst implementieren kann/will? (Soll jetzt keine Beleidigung an Tobias sein, ich kann es auch nicht und ich hätte auch nicht die lust dazu es zu machen). Da muss man selber entscheiden, wie tief man in die Materie einsteigt.

Da das EthernetShield hinter einem Router hängen wird, kann man diesen natürlich auch ein bisschen Arbeit abnehmen lassen. Je nach Modell ist es dort möglich einige Sicherheitsfeatures für den Fernzugriff einzurichten.
Schlussendlich muss aber erstmal jemand die Adresse herausfinden, das Potential dahinter entdecken, die Verschlüsselung knacken, den Befehl an den Arduino herausfinden und dann noch wissen wo auf der Welt diese Tür überhaupt ist.

Und wenn auch unberechtigte Zugriffe von innerhalb des Netzwerkes denkbar sind? Dazu müsste man erstmal die genauen Gegebenheiten kennen.

Um "nur" einen Türöffner zu bauen finde ich den Raspberry Pi etwas zu überdimensioniert.
Schlussendlich wäre ich natürlich sehr vorsichtig so einen Türöffner zu programmieren, halte es aber nicht für grundsätzlich unsicher.

Der Raspberry Pi ist sicher etwas überdimensioniert. Aber ob man 60 € für einen Arduion Mega + Eternet Shield oder für den Raspberry Pi ausgibt ist schlussendlich egal. Und bei dem Raspberry Pi ist noch Luft nach oben falls man dann doch noch auf die Idee kommt man braucht ei Foto von den Leuten die das Gebäude betreten oder sonst was.

Tobias93:
Hallo Gerd,

vielen Dank für den Code. Welche Funktion hat der Sketch, bzw. was muss Hardwaretechnisch noch wo angeschloßen werden?

Gruß Tobias

Der Sketch stellt die Messwerte des ADC auf einer Hompage dar. Du brauchst dafür das Ethernet Shield.

zuerst schon einmal vielen Dank für die ganzen Posts, sie haben mir schon etwas weiter geholfen. Ja der Gedanke mit Verschlüsselung und co. kann komplett vernachlässigt werden. Ich habe einfach nur vor ein Paar Buttons auf einer Homepage darzustellen. Wenn dass dann klappt evtl. auch noch eine Temperaturkurve anzeigen und so weiter. Aber das ist alles noch Zunkunftsmusik. Ich bin absolut neu auf dem Gebiet und setze deshalb die Latte sehr niedrig an.

Ich habe mich durch die Links zu den Fhem Seiten durchgearbeitet und hätte da noch ein Paar Fragen. Wie ist das mit dem Programm Fhem zu verstehen? Bietet es eine Möglichkeit meine Homepage mit Buttons und co grafisch zu "programmieren" oder muss man die HP mit Pearl oder einer anderen Sprache aufbauen. Wenn ja was macht dann dieses Fhem genau, bzw. wie kann es mir helfen. Habe das noch nicht verstanden, sry.

Würde mich über weitere Antworten freuen,
Gruß

Tut mir Leid Tobias, ich habe das verkehrte Script geposted.
Hier das richtige:

#include <SPI.h>
#include <Client.h>
#include <Ethernet.h>
#include <Server.h>
#include <Udp.h>
/*
	Simple Ethernet Test
        Arduino server outputs simple text to browser
	The circuit:
	* Arduino Duemilanove
        * Arduino Ethernet shield
        * Basic FTDI breakout 5V
        *LED connected to GND and digital pin 4 via resistor
        http://www.sciencprog.com/
        Created: 2009.11.18
        By Minde
        Modified: 2011.04.06
          1. Changed obsolete Wstring.h functions to String.h
          2. Changed includes to match Ethernet library.
          3. Fixed LED control
        By Minde
*/

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 178, 177 };			// ip in lan
byte gateway[] = { 192, 168, 178, 150 };			// internet access via router
byte subnet[] = { 255, 255, 255, 0 };                   //subnet mask
EthernetServer server(80);                                      //server port
byte sampledata=50;            //some sample data - outputs 2 (ascii = 50 DEC)             
int ledPin = 4;  // LED pin
char link[]="http://http://www.rg-oh.kilu.de/"; //link data
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //LED status flag
void setup(){
//start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
//Set pin 4 to output
  pinMode(ledPin, OUTPUT);  
//enable serial datada print  
  Serial.begin(9600);
}
void loop(){
// Create a client connection
EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
   if (client.available()) {
    char c = client.read();
     //read char by char HTTP request
    if (readString.length() < 100) 
      {
        //store characters to string 
        readString += c; //replaces readString.append(c);
      }  
        //output chars to serial port
        Serial.print(c);
        //if HTTP request has ended
        if (c == '\n') {
          //dirty skip of "GET /favicon.ico HTTP/1.1"
          if (readString.indexOf("?") <0)
          {
            //skip everything
          }
          else
          //lets check if LED should be lighted
        if(readString.indexOf("L=1") >0)//replaces if(readString.contains("L=1"))
           {
             //led has to be turned ON
             digitalWrite(ledPin, HIGH);    // set the LED on
             LEDON = true;
           }else{
             //led has to be turned OFF
             digitalWrite(ledPin, LOW);    // set the LED OFF
             LEDON = false;             
           }
          // now output HTML data starting with standart header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          //set background to yellow
          client.print("<body style=background-color:yellow>");
          //send first heading
          client.println("<font color='red'><h1>HTTP test routines</font></h1>");
          client.println("<hr />");
          client.println("<hr />");
          //output some sample data to browser
          client.println("<font color='blue' size='5'>Sample data: ");
          client.print(sampledata);//lets output some data
          client.println("
");//some space between lines
          client.println("<hr />");
          //drawing simple table
          client.println("<font color='green'>Simple table: ");
          client.println("
");
          client.println("<table border=1><tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr>");
          client.println("<tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr></table>");          
          client.println("
");
          client.println("<hr />");
          //printing some link
          client.println("<font color='blue' size='5'>Link: ");
          client.print("<a href=");
          client.print(link);
          client.println(">Visit Scienceprog!</a>");
          client.println("
");
          client.println("<hr />");
          //controlling led via checkbox
          client.println("<h1>LED control</h1>");
          //address will look like http://192.168.1.110/?L=1 when submited
          if (LEDON)
          client.println("<form method=get name=LED><input type=checkbox name=L value=1 CHECKED>LED
<input type=submit value=submit></form>");
          else
          client.println("<form method=get name=LED><input type=checkbox name=L value=1>LED
<input type=submit value=submit></form>");      
          client.println("
");
          //printing LED status
          client.print("<font size='5'>LED status: ");
          if (LEDON)
              client.println("<font color='green' size='5'>ON"); 
          else
              client.println("<font color='grey' size='5'>OFF");     
          client.println("<hr />");
          client.println("<hr />");
          client.println("</body></html>");
          //clearing string for next read
          readString="";
          //stopping client
          client.stop();
            }
          }
        }
      }
 }

Danke :slight_smile: