INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
11.11.2014, 15:09 (Dieser Beitrag wurde zuletzt bearbeitet: 13.11.2014 12:01 von BERND87.)
Beitrag #1
Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
hallo zusammen,

ich will auf einem Arduino Ethernet via Webserver einen Alarm erstellen. beim Schalten der Ausgänge macht der Webserver 2 Durchläufe.
Dabei habe ich einen Butten zum senden der Zeiten und zwei zum Testen des Ausgangs (LED) allgemein.

Wenn ich nun die Daten einlese(Senden) oder die LED teste (ein/aus) reagiert bei jedemTastendruck der Ausgang und bringt damit meine LED zum Leuchten.
Dabei erfolgt die Ansteuerung 2malig...warum auch immer.

hab ne Vermutung...
kann es sein das ich die if-Schleifen iwie falsch erzeuge, da meine Zeit auch nicht so wie verhofft im Serial-Monitor dargestellt wird wie erhofft.

   

//++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++

/*
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>
#include <EthernetUdp.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x8F, 0x82 };
IPAddress ip(192,168,2,222); // Initialize the Ethernet server library with the IP address and port you want to use (port 80 is default for HTTP):
unsigned int localPort = 8888;
IPAddress timeServer(192,168,2,3);
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

EthernetServer server(80);
String URL = String();

boolean tueraktiv=true;

String HTTP_req;

String Vergleichswert="14:22:30"; //<== Test für Ausgang



void setup()
{
// Open serial communications and wait for port to open:
Ethernet.begin(mac, ip);

server.begin();
Serial.begin(9600);

pinMode(2, OUTPUT); //Signal 1
pinMode(3, OUTPUT); //Signal 2
pinMode(4, OUTPUT); //Signal 3
pinMode(7, OUTPUT); // LED
digitalWrite(3,HIGH);




int i=0;

Serial.println(Ethernet.localIP());

Udp.begin(localPort);
}


void loop()
{
sendNTPpacket(timeServer); // send an NTP packet to a time server
// Serial.print("Sendeversuch");
// wait to see if a reply is available
delay(1000);
if ( Udp.parsePacket() )
{
// We've received a packet, read the data from it
Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer
//the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:

unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
//Serial.print("Seconds since Jan 1 1900 = " );
//Serial.println(secsSince1900);

// now convert NTP time into everyday time:
//Serial.print("Unix time = ");
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years:
unsigned long epoch = secsSince1900 - seventyYears;
// print Unix time:
//Serial.println(epoch);


// print the hour, minute and second:
//Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT)
Serial.print(((epoch % 86400L) / 3600)+1); // print the hour (86400 equals secs per day)
int epoch_h=(((epoch % 86400L) / 3600)+1);
String ZEIT_h=String(epoch_h);

Serial.print(':');

if ( ((epoch % 3600) / 60) < 10 )
{
// In the first 10 minutes of each hour, we'll want a leading '0'
Serial.print('0');
int epoch_min=((epoch % 3600) / 60) < 10 ;
String ZEIT_min=String(epoch_min);
ZEIT_min="0"+ZEIT_min;
}
Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
int epoch_min=((epoch % 3600) / 60);
String ZEIT_min=String(epoch_min);

Serial.print(':');

if ( (epoch % 60) < 10 )
{
// In the first 10 seconds of each minute, we'll want a leading '0'
Serial.print('0');
int epoch_sec=(epoch %60);
String ZEIT_sec=String(epoch_sec);
ZEIT_sec="0"+ZEIT_sec;

}
Serial.println(epoch %60); // print the second
int epoch_sec=epoch %60;
String ZEIT_sec=String(epoch_sec);

///String ZEIT_min=String(epoch_min);



String ZEIT=ZEIT_h+":"+ZEIT_min+":"+ZEIT_sec;


Serial.println(ZEIT);
Serial.readString();
//delay(5000);//else{Serial.print("FEHLER ");}


// 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();
HTTP_req += c;
Serial.write©;
// 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

//++++++++++++++++++++++++++++++++++++++++++HTML++++++++++++++++++++++++++++++++++​++++++++++++++++++++++++++++++++++++

client.print(F("HTTP/1.1 200 OK\n"));
client.print(F("Content-Type: text/html\n\n"));
client.print(F("<html><head>\n"));
client.print(F("<title>Alarmanlagen Steuerung</title>\n"));
client.print(F("</head>\n"));
client.print(F("<body bgcolor='#d8d8d8'>\n"));
client.print(F("<h1><span style=color:#FF0000;font-family:'Arial Black'>Signale</h1>\n"));
client.print(F("<p></p>"));
client.print(ZEIT); //client.print(millis()/1000); // um zu sehen ob überhaupt noch was reagiert
client.print(F("<p></p>\n"));

//client.print(F("<p></p>"));
//client.print(ep); // um zu sehen ob überhaupt noch was reagiert
//client.print(F("<p></p>\n"));

client.print(F("<table width='500px' border='1' cellpadding='0' cellspacing='2'>\n"));
client.print(F("<tr>\n"));
client.print(F("<td >Beschreibung</td>\n"));
client.print(F("<td>Zeiteingabe</td>\n"));
client.print(F("<td>Aktueller Wert</td>\n"));
client.print(F("</tr>\n"));
client.print(F("<tr>\n"));

client.print(F("<td> Pausensignal 1</td>\n"));
client.print(F("<td><form method=get><input name='P1' type='time' value='09:00'></td>\n"));
client.print(F("<td>\n"));
if (HTTP_req.indexOf("Zeiten=Senden&P1="))
{ String p1h=HTTP_req.substring(23,25); String p1m=HTTP_req.substring(28,30); String P1=p1h + ":"+p1m+":00"; client.print(P1);
} else{String P1=""; client.print(P1);}
client.print(F("</td>\n"));
client.print(F("</tr>\n"));

client.print(F("<td>Pausensignal 2</td>\n"));
client.print(F("<td><form method=get><input name='P2' type='time' value='12:00' ></td>\n"));
client.print(F("<td>\n"));
if (HTTP_req.indexOf("Zeiten=Senden&P1="))
{ String p2h=HTTP_req.substring(34,36); String p2m=HTTP_req.substring(39,41); String P2=p2h + ":"+p2m+":00"; client.print(P2); Serial.println(P2+"HALLLO");
} else{String P2=""; client.print(P2); Serial.println(P2+"HALLLO");}
client.print(F("</td>\n"));
client.print(F("</tr>\n"));

client.print(F("<td>Pausensignal 3</td>\n"));
client.print(F("<td><form method=get><input name='P3' type='time' value='17:00'></td>\n"));
client.print(F("<td>\n"));
if (HTTP_req.indexOf("Zeiten=Senden&P1="))
{ String p3h=HTTP_req.substring(45,47); String p3m=HTTP_req.substring(50,52); String P3=p3h + ":"+p3m+":00"; client.print(P3);
} else{String P3=""; client.print(P3);}
client.print(F("</td>\n"));
client.print(F("</tr>\n"));

client.print(F("<td>Schichtwechsel 1</td>\n"));
client.print(F("<td><form method=get><input name='SW1' type='time' value='07:00'></td>\n"));
client.print(F("<td>\n"));
if (HTTP_req.indexOf("Zeiten=Senden&P1="))
{ String S1h=HTTP_req.substring(57,59); String S1m=HTTP_req.substring(62,64); String S1=S1h + ":"+S1m+":00"; client.print(S1);
} else{String S1=""; client.print(S1);}
client.print(F("</td>\n"));
client.print(F("</tr>\n"));

client.print(F("<td>Schichtwechsel 2</td>\n"));
client.print(F("<td><form method=get><input name='SW2' type='time' value='16:00'></td>\n"));
client.print(F("<td><p>\n"));
if (HTTP_req.indexOf("Zeiten=Senden&P1="))
{ String S2h=HTTP_req.substring(69,71); String S2m=HTTP_req.substring(74,76); String S2=S2h + ":"+S2m+":00"; client.print(S2);
} else{String S2=""; client.print(S2);}
client.print(F("</p></td>\n"));
client.print(F("</tr>\n"));

client.print(F("<td>Schichtwechsel 3</td>\n"));
client.print(F("<td><form method=get><input name='SW3' type='time' value='22:00'></td>\n"));
client.print(F("<td>\n"));
if (HTTP_req.indexOf("Zeiten=Senden&P1="))
{ String S3h=HTTP_req.substring(81,83); String S3m=HTTP_req.substring(86,88); String S3=S3h+":"+S3m+":00"; client.print(S3);
} else{String S3=""; client.print(S3);}
client.print(F("</td>\n"));
client.print(F("</tr></span></tabel></div>\n"));

//Senden einfügen am Schluss
client.print(F("<form method=get><input type=submit name=Zeiten value='Senden'></form>\n"));
//client.println();
//Zeiten auslesen

////++++++++++++++++++++++++++++++++++++++++++++++++LED+++++++++++++++++++++++++++++​++++++++++++++++++++++++++++++++++++++
client.print(F("</table><td><form method=get><input type=submit name=LED3 value='ein'></form></td>\n"));
client.println(F("</table><td><form method=get><input type=submit name=LED3 value='aus'></form></td>\n"));

LED(client); //<== DACHTE EINDEUTIGER AUFRUFF

if (ZEIT=="16:53:30")
{
digitalWrite(3,LOW);
delay(3000);
digitalWrite(3,HIGH);
}


//++++++++++++++++++++++++++++++++++++++++++++++++++/LED+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
client.print( F("</tr>\n"));
client.print( F("</body></html>"));

//++++++++++++++++++++++++++++++++++++++++++/HTML++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

HTTP_req="";


break;
}

}
}

delay(1); // give the web browser time to receive the data



//LED(client);

//close the connection:
client.stop();

Serial.println("client disonnected");
Serial.println(""); // Sc
Serial.println("");
}
}
}

void LED(EthernetClient cl)
{
if(HTTP_req.indexOf("LED3=ein")-1) //<== AUSLESEN DER URL AUCH EINDEUTIG
{
digitalWrite(3,LOW);
delay(3000);
digitalWrite(3,HIGH);
}
if(HTTP_req.indexOf("LED3=aus")-1 )
{
digitalWrite(3,HIGH);
digitalWrite(7,HIGH);
}


}




// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;

// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}


//++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++


So sieht der bisherige Webserver aus:

   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.11.2014, 07:46
Beitrag #2
RE: Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
Kann mir keiner etwas dazu sagen oder ist meine Frage zu komplex?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.11.2014, 13:56
Beitrag #3
RE: Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
Hallo Bernd,

ich glaube der Sketch hat ein generelles Ablaufproblem was den NTP-Teil angeht.
Du schickst die NTP-Requests im Loop immer wieder raus (wenn ich es richtig interpretiere). Den ganzen NTP-Teil sollte man besser einmalig im Setup() konfigurieren, dann laufen die NTP-Requests auch von allein, ohne dass dazu nochmal expliziet Code abgearbeitet werden muss. Guck dir mal diesen Eintrag dazu an: http://www.arduinoforum.de/arduino-Threa...P-und-DHCP

Bin mir auch nicht sicher ob delay() bei client.print so gut funktioniert, da delay definitv auch die Abarbeitung auf der Netzwerkkarte stoppen dürfte.

Soweit erstmal.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2016, 11:15
Beitrag #4
RE: Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
Ach ja.... DANKE!!! Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2016, 12:19
Beitrag #5
RE: Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
das ist normal, der request wird von deinem browser erzeugt, der webserver ist daran unschuldig.
der request nach favicon ist eine art default anfrage an den webserver.
du hast vergessen in deinem html-code einen ico file anzugeben für die namenszeile im browser, da wird links dieses kleine bildchen als symbol für die webseite angezeigt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2016, 12:33
Beitrag #6
RE: Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
(04.02.2016 12:19)Pit schrieb:  das ist normal, der request wird von deinem browser erzeugt, der webserver ist daran unschuldig.
der request nach favicon ist eine art default anfrage an den webserver.
du hast vergessen in deinem html-code einen ico file anzugeben für die namenszeile im browser, da wird links dieses kleine bildchen als symbol für die webseite angezeigt.

Hi,
ich habe das aktuell erst dieser Tage ausprobiert. Wenn man in die Root Ebene auf dem Webserver wo auch die index.htm(l) liegt eine Datei favicon.ico hinterlegt dann wird dieses Icon vom MS-ie automatisch gelesen und in der URL Zeile angezeigt. Der Firefox hat das bei mir ignoriert.
Schreibe ich aber in den html Code eine entsprechende Zeile rein wo ich auf eine Icon Datei verweise die dann .png z.B. sein kann dann wird das Icon auf dem Reiter vom Browser angezeigt - das macht dann auch der Firefox.
Bei Interesse kann ich das Abends mal eroieren und noch zum besten geben wie diese Zeile aussieht.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2016, 13:56
Beitrag #7
RE: Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER???
(04.02.2016 12:33)Bitklopfer schrieb:  
(04.02.2016 12:19)Pit schrieb:  das ist normal, der request wird von deinem browser erzeugt, der webserver ist daran unschuldig.
der request nach favicon ist eine art default anfrage an den webserver.
du hast vergessen in deinem html-code einen ico file anzugeben für die namenszeile im browser, da wird links dieses kleine bildchen als symbol für die webseite angezeigt.

Hi,
ich habe das aktuell erst dieser Tage ausprobiert. Wenn man in die Root Ebene auf dem Webserver wo auch die index.htm(l) liegt eine Datei favicon.ico hinterlegt dann wird dieses Icon vom MS-ie automatisch gelesen und in der URL Zeile angezeigt. Der Firefox hat das bei mir ignoriert.
Schreibe ich aber in den html Code eine entsprechende Zeile rein wo ich auf eine Icon Datei verweise die dann .png z.B. sein kann dann wird das Icon auf dem Reiter vom Browser angezeigt - das macht dann auch der Firefox.
Bei Interesse kann ich das Abends mal eroieren und noch zum besten geben wie diese Zeile aussieht.
lgbk

hallo bitklopfer,

die üblichen browser verhalten sich bei fehlender favicon unterschiedlich.
ich habe den arduinocode von "BERND87" jetzt nicht durchgelesen, ist mir auch zuviel arbeit.
das einstellen der favicon kann man z.b. beim apache machen, aber in diesem fall ist der webserver ja auf dem aduino so wie ich das sehe.
man könnte die favicon datei auf der SD-Karte einstellen.
allerdings muss man dann den request analysieren und die favicon datei von der SD-Karte liefern. allerdings muss man sie dann erst umwandeln weil sie nicht sichtbare zeichen enthält.
ich würde das "BERND87" jetzt nicht empfehlen, das ist etwas komplex.
ich würde den serverthread nach erkennen des favicon requests einfach schliessen und die browseranfrage abwürgen oder den 404 - fehler zurückschicken.
dann ist der browser zufrieden und gibt ruhe.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 ESP12-E Webserver-Frage Claus_M 8 252 14.11.2016 22:02
Letzter Beitrag: Claus_M
  Webserver + Bild als Hintergrund ?! Marc2014 8 246 11.10.2016 21:39
Letzter Beitrag: Bitklopfer
  ESP8266 Webserver Programmieren HDT 11 768 23.08.2016 13:28
Letzter Beitrag: HDT
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 452 22.08.2016 08:07
Letzter Beitrag: b3ta
  ESP8266 Webserver Marc2014 0 348 30.07.2016 20:15
Letzter Beitrag: Marc2014
Question Webserver, Client, Loop Marc2014 6 369 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Zwei ident Feuchtesensoren an Arduino Uno R4 Karli 5 354 24.07.2016 23:36
Letzter Beitrag: SkobyMobil
  Wetterstation mit Vorhersage auf Webserver reimundko 8 591 05.06.2016 16:06
Letzter Beitrag: reimundko
  Webserver Textfeld jannis.f 15 1.940 15.05.2016 16:48
Letzter Beitrag: avoid
  SD.open() erzeugt keine neue Datei! torsten_156 4 529 11.03.2016 17:31
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste