Arduino Ethernet Shield baut keine Verbindung auf

Hallo,

ich wollte mal einen kleinen Webserver mit diesem Code

http://pastebin.com/f7zYtWwq

Quelle: Arduino IDE

starten lassen, aber wenn ich meinen Arduino unter der lokalen IP 192.168.0.63 aufrufen will, dauert das Laden beim Browser sehr lange und es kommt zum Schluss zur Meldung 'Die Webseite kann nicht angezeigt werden.'

Ich habe vermutet, dass es an dem Delay liegt, weil er länger als 1 Millisekunde braucht. Darum habe ich versucht, den Delay auf 10000 zu stellen, aber ohne Erfolg.

Wieso funktioniert es nicht?

Freue mich auf Antworten.

MFG

Alex-Digital :D

hi,

unter windows deaktiviere zuerst die (windows-interne) firewall bei den netzwerkeinstellungen. andere firewalls natürlich auch. wenn Du dann die verbindung bekommst, kannst Du die firewall so konfigurieren, daß es klappt.

Hallo,

ich habe es gerade auf meinen ganz frischen PC ausprobiert, der gerade gar keine Firewall hat und es funktioniert aber auch nicht.

Freue mich auf Antworten

MFG

Alex-Digital :D

hi nocheinmal,

ich habe gerade gesehen, daß die IP 192.168.0.63 im beispiel steht. paßt die auch in Dein netzwerk? wenn Dein rechner zb. 192.168.2.101 hat, wirst Du die des arduino auf 192.168.2.63 umstellen müssen. die ip des rechners bekommst Du unter win im command-fenster mit ipconfig. windows-taste + R, eingabe cmd, dort eingabe ipconfig.

gruß stefan

hi,

ich habe es gerade auf meinen ganz frischen PC ausprobiert,
der gerade gar keine Firewall hat

unter windows ist die windows-firewall standardmäßig aktiviert. mußt Du abschalten, dann testen.

gruß stefan

Hallo,

mein Rechner-IP ist 192.168.0.5 Darum bedeutet das, dass ich es richtig gemacht habe.

Ich habe es mit ausgeschalteter Firewall probiert, aber funktioniert immer noch nicht.

MFG

Alex-Digital :D

Funktioniert ein Ping? (auf der Kommandozeile: ping 192.168.0.63)

Was ist zwischen Deinem Rechner und dem Arduino (alles aufzählen!)?

Nimm mal den Beispiel Sketch Chat Server. Ändere dann hier, was geändert werden muss

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

Und Poste was Serial Monitor sagt. Dann kann ich dir sagen wo das Problem liegt Bzw kann ich dir auch jetzt schon sagen aber lerne erstmal dir selbst zu helfen ;)

Ist die Firewall nicht nur für eingehende Verbindungen und hat damit überhaupt nichts damit zu tun? Für den Zugriff über das Internet muss glaube ich noch der Port 80 auf die IP weitergeleitet werden, sollte aber auch so gehen wenn dein PC im gleichen Netzwerk hängt. Du musst auf jeden Fall die Mac-Adresse an dein Ethernet-Shield anpassen, hast du das gemacht?

Die MAC-Adresse muss nur angepasst werden, wenn es noch ein Gerät mit der gleichen MAC im Netzwerk gibt. Wenn der Arduino Ethernet der einzige ist, sollte das kein Problem sein. Spannend wäre tatsächlich mal zu wissen, was alles zwischen Rechner und Arduino hängt (Router,Switch etc.) und was auf der Kommandozeile ein "ping 192.168.0.63" ausgibt. Mario.

Alex-Digital: Wieso funktioniert es nicht?

Weil Du mit dieser Zeile: Ethernet.begin(mac, ip); weder eine vollständige manuelle noch eine reine DHCP Zuweisung der Netzwerkparameter hinbekommst. Das ist vielmehr eine Mischanforderung: Ich möchte gerne diese IP-Adresse haben falls möglich, und ich möchte aber die Subnetzmaske und das Standardgateway per DHCP vom Router erhalten.

Das ist Tinnef. Und es geht bei Dir wahrscheinlich deshalb schief, weil .63 nicht zu dem Adressbereich gehört, aus dem Dein Router per DHCP IP-Adressen zuteilt.

Du kannst Dir ja mal im seriellen Monitor ansehen, welche IP-Adresse Du tatsächlich bekommen hast, einfach nach Ethernet.begin: Ethernet.begin(mac, ip); delay(1000); Serial.begin(9600); Serial.print(F("IP: "));Serial.println(Ethernet.localIP());

Na, welche IP-Adresse wird Dir da wohl für den Arduino angezeigt, die er bekommen hat?

Ist das die angeforderte .63 Adresse? Oder eine andere?

Ist die angezeigte lokale IP-Adresse anpingbar?

jurs: Weil Du mit dieser Zeile: Ethernet.begin(mac, ip); weder eine vollständige manuelle noch eine reine DHCP Zuweisung der Netzwerkparameter hinbekommst. Das ist vielmehr eine Mischanforderung: Ich möchte gerne diese IP-Adresse haben falls möglich, und ich möchte aber die Subnetzmaske und das Standardgateway per DHCP vom Router erhalten.

Das ist Tinnef. Und es geht bei Dir wahrscheinlich deshalb schief, weil .63 nicht zu dem Adressbereich gehört, aus dem Dein Router per DHCP IP-Adressen zuteilt.

Das ist nicht richtig. Schaut man sich die Ethernet-Lib mal genauer an: (hier die Ethernet.h)

  // Initialise the Ethernet shield to use the provided MAC address and gain the rest of the
  // configuration through DHCP.
  // Returns 0 if the DHCP configuration failed, and 1 if it succeeded
  int begin(uint8_t *mac_address);
  void begin(uint8_t *mac_address, IPAddress local_ip);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);

Hier sieht man, das nur im ersten Fall, also ein Parameter (nur die MAC Adresse), ein DHCP Request gemacht wird. Bei allen anderen Versionen von begin() wird die übergebene IP verwendet. Schaut man sich die Implementierung an:

int EthernetClass::begin(uint8_t *mac_address)
{
  _dhcp = new DhcpClass();


  // Initialise the basic info
  W5100.init();
  W5100.setMACAddress(mac_address);
  W5100.setIPAddress(IPAddress(0,0,0,0).raw_address());

  // Now try to get our config info from a DHCP server
  int ret = _dhcp->beginWithDHCP(mac_address);
  if(ret == 1)
  {
    // We've successfully found a DHCP server and got our configuration info, so set things
    // accordingly
    W5100.setIPAddress(_dhcp->getLocalIp().raw_address());
    W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address());
    W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address());
    _dnsServerAddress = _dhcp->getDnsServerIp();
  }

  return ret;
}

void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip)
{
  // Assume the DNS server will be the machine on the same network as the local IP
  // but with last octet being '1'
  IPAddress dns_server = local_ip;
  dns_server[3] = 1;
  begin(mac_address, local_ip, dns_server);
}

void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server)
{
  // Assume the gateway will be the machine on the same network as the local IP
  // but with last octet being '1'
  IPAddress gateway = local_ip;
  gateway[3] = 1;
  begin(mac_address, local_ip, dns_server, gateway);
}

void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway)
{
  IPAddress subnet(255, 255, 255, 0);
  begin(mac_address, local_ip, dns_server, gateway, subnet);
}

Sieht man schön, wie die einzelnen Funktionen aufeinander aufbauen und default-Werte für Gateway, DNS und Netzmaske annehmen. DNS und Gateway werden auf die übergebene IP gesetzt und das letzte Octed wird auf ".1" geändert. Die default Netzmaske ist 255.255.255.0.

Mit DHCP hat das Ganze hier also überhaupt nichts zu tun.

Allerdings wäre es einen Versuch wert mal DHCP zu verwenden. Also NUR die MAC-Adresse zu übergeben und dann zu schauen was der Arduino denn bekommt. Evtl. ist das Netz ja doch ein wenig anders.

@Alex: Hast Du mal ein "ping 192.168.0.63" probiert?

Mario.

mkl0815:
Sieht man schön, wie die einzelnen Funktionen aufeinander aufbauen und default-Werte für Gateway, DNS und Netzmaske annehmen.
DNS und Gateway werden auf die übergebene IP gesetzt und das letzte Octed wird auf “.1” geändert. Die default Netzmaske ist 255.255.255.0.

Mit DHCP hat das Ganze hier also überhaupt nichts zu tun.

Ja OK, hab’s selbst gerade nochmal getestet, weil mir das selbst ein wenig spanisch vorkam. Du hast recht, er sollte immer die angeforderte Adresse bekommen und die restlichen Werte werden als Default-Werte aus der Adresse abgeleitet.

Der Fehler liegt auch in dem Programm-Sketch, der eine Endlosschleife enthält.

Ein “break;” an der richtigen Stelle eingefügt und der Server läuft.

#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,0,63);  // hier ggf. die IP-Adresse anpassen
 
// 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() {
 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
 
}
 
 
void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
 
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        // 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>");
          client.println("<b>Es funktioniert!</b>");
          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();
 
  }
}