Probleme mit Ethernetbibliothek

Hallo,

ich habe mir mit Hilfe des ENC28J60 und der EthernetENC Bibliothek (Nutzt die selbe API wie die Arduino Ethernet Bibliothek) einen Webserver auf einem Arduino Nano realisiert.

Es ergibt sich folgendes Problem: - Wenn ich mit einem Browser die URL aurfurfe werden mir per Console zwei Verbindungen angezeigt. Hierbei ist es egal welcher Browser verwendet wird. Ebenso wird kein Code abgearbeitet. - Mach ich einen Aufruf per CURL wird alles abgearbeitet.

void loop() {
EthernetClient client = server.available();
 if (client) {
   Serial.println("new client");
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   String header = "";
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       Serial.write(c);
       header += 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("Connection: close");
         client.println();

         // Sonstige Programmfunktionen werden hier abgearbeitet
         // Funktioniert nur bei CURL

          if(compURL(header, "GET /on")) {
            lightState = true;
            staticOn();
          } 


          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(header);
   Serial.println("client disconnected");
 }
}

int compURL(String _header, String _searchStr) {
  int _idx = 0;
  _idx = _header.indexOf(_searchStr);
  if(_idx >= 0) {
    return int(_idx + _searchStr.length());
  } else {
    return 0;
  }
}

Konsolenausgabe bei CURL

new client
switched static on
client disconnected

Konsolenausgabe bei Aufruf mit dem Browser

new client
client disconnected

Bei CURL wird "switched static on" ausgegeben, bei dem Aufruf über den Browser nicht.

Aufruf: http://192.168.10.151/on

Ich vermute es hat etwas hiermit zu tun:

// 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
    ...
    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;
}

Jemand eine Idee?

Danke

Wenn ich mit einem Browser die URL aufrufe werden mir per Console zwei Verbindungen angezeigt. Hierbei ist es egal welcher Browser verwendet wird.

ich vermute du siehst, dass der Browser nicht nur die Seite sondern auch ein favicon abruft. Daher siehst du zwei hereinkommende Requests.

Ich mache nichts mit dem ENC am Arduino, nehme aber an, dass alles was hier für den wiznet w5100 steht, auch für deinen ENC Webserver gültig wäre:

https://werner.rothschopf.net/202001_arduino_webserver_post.htm

Der ENC hat keine eigenen Intelligenz. Alle Arbeiten für die Ethernetverbindung muß der Arduino bereitstellen und bearbeiten. Darum ist ein Arduino mit dem EMC schnell am limit. Verwende einen Ethernetadapter mit W5100 bzw W5500. Grüße Uwe

kevins391:
Jemand eine Idee?

Da mein Browseraufruf bisher funktionierte, das auf Deins runtergekürzt - da geht sicher noch mehr raus:

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xFF
};
IPAddress ip(192, 168, 0, 8);
EthernetServer server(80);

void setup() {
  Ethernet.init(10);
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print(F("Server läuft: "));
  Serial.println(Ethernet.localIP());
}


void loop() {
  enum {index, on, off};
  int Seite = index;
  int look = 0;
  EthernetClient client = server.available();
  if (client)
  {
    Serial.println(F("new client"));
    boolean currentLineIsBlank = true;
    char chararray[100] = {"\0"};
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        chararray[look] = c;
        look++;
        if (c == '\n')
        {
          if (Seite == index)
          {
            Serial.println(F("Suche Teilstring.."));
            Serial.println(chararray);
            if (strstr(chararray, "GET /on"))
            {
              Seite = on;
              Serial.println(F("Seite on gefunden"));
              memset (chararray, "\0", sizeof(chararray));
              Serial.println(chararray);
            }
            if (strstr(chararray, "GET /off"))
            {
              Seite = off;
              Serial.println(F("Seite off gefunden"));
              memset (chararray, "\0", sizeof(chararray));
              Serial.println(chararray);
            }
            look = 0;
          }
          if (currentLineIsBlank)
          {
            // send a standard http response header
            client.println(F("HTTP/1.1 200 OK"));
            client.println(F("Content-Type: text/html"));
            client.println(F("Connection: close"));  // the connection will be closed after completion of the response
            client.println(F("Refresh: 5"));  // refresh the page automatically every 5 sec
            client.println();
            client.println(F("<!DOCTYPE HTML>"));
            client.println(F("<html>"));
            Serial.println(Seite);
            if (Seite == on)
            {
              for (int analogChannel = 0; analogChannel < 6; analogChannel++)
              {
                int sensorReading = analogRead(analogChannel);
                client.print(F("analog input "));
                client.print(analogChannel);
                client.print(F(" is "));
                client.print(sensorReading);
                client.println(F("
"));
              }
            }
            client.println(F("</html>"));
            break;
          }
          if (c == '\n')
          {
            currentLineIsBlank = true;
          }
          else if (c != '\r')
          {
            currentLineIsBlank = false;
          }
        }
      }
    }
    delay(2);
    client.stop();
    Serial.println(F("client disconnected"));
  }
}

probier mal aus, was der Browser tut…