Webserver und Client Verbindungsproblem

Hallo,

Ich habe angefangen mit den Ethernet Shields zu experimentrieren.
Läuft soweit auch ganz gut. Ich kann zb mittels Chrome auf den Webserver zugreifen und mir die Analogwerte anzeigen lassen. Der Webserver Arduino hing an meinen PC oder W-LAN Router über ein Kabel, ging beides . Als nächstes hab ich mir nen Client geschrieben mit dem Ziel die Analogwerte mittels Textfinder auszulesen und weiterzuverarbeiten.

Doch der Client kann laut Seriellem Monitor den Webserver nicht finden. Jemand einen heißen Tip wo mein Fehler liegt?
Hier der Code vom Client

#include <SPI.h>         
#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = {  0x5A, 0xA2, 0xDA, 0x0D, 0x56, 0x56  };
byte ip[] = { 192, 168, 178, 110 }; // IP-Adresse Client der versucht die Daten zu lesen   
byte gateway[] = { 192, 168, 178, 1 }; //Ip-Adresse vom Router
byte subnet[] = { 255, 255, 255, 0 };
byte server[] = {192,168,178,177 }; //Arduino Webserver

EthernetClient client;
TextFinder finder( client);

int ADC3; // Zahlenwert

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet); 
  Serial.begin(9600);
  Serial.println("Verbinden mit Arduino Webserver...");  
  delay(2000);  
}

void loop()
{
  if (client.connect(server, 80))  {
    Serial.print("Verbunden... ");
     } else {
    Serial.println("Verbinden Fehlgeschlagen");
  }
  if (client.connected()) {
    ADC3 = 0; 

      if(finder.find("3")){     
         ADC3 = finder.getValue(':');
         Serial.print(ADC3);
         Serial.println(" RAW");         
      }
    
    if(ADC3 == 0){
      Serial.println("Daten lassen sich nicht lesen "); 
    }
    delay(10000); // check again in 10 seconds
  }
  else {
    Serial.println();
    Serial.println("Nicht Verbunden");
    delay(1000); 
  } 
  client.stop();

}

und hier der Code vom Webserver

/*
  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};
//the IP address for the shield:
byte ip[] = { 192, 168, 178, 177 };    
// the router's gateway address:
byte gateway[] = { 192, 168, 178, 1 };
// the subnet:
byte subnet[] = { 255, 255, 255, 0 };
// 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, gateway, subnet);
  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("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
            int sensorReading = analogRead(3);
            client.print("analog input ");
            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 disconnected");
  }
}


[code]

Beide hängen im Netzwerk und lassen sich mit Erfolg Pingen, doch reden Miteinander wollen die Herrschaften nicht. 

Danke schon mal für eure Hilfe

Metaworld82:
Jemand einen heißen Tip wo mein Fehler liegt?

Deine Fehler sind:

  1. Du kannst nicht programmieren
  2. #include <TextFinder.h> ist ein Fehler, weil das großer Mist ist
  3. Du hast den eingebundenen TextFinder-Mist offenbar nicht mal verstanden

Wie bitte soll Dein Client mit diesem Code:

      if(finder.find("3")){     
         ADC3 = finder.getValue(':');
         Serial.print(ADC3);
         Serial.println(" RAW");         
      }

die "3" und einen Doppelpunkt ':' finden können, wenn Du vom Server weder eine "3" noch einen Doppelpunkt senden lässt:

            int sensorReading = analogRead(3);
            client.print("analog input ");
            client.print(" is ");
            client.print(sensorReading);

???

Falls im gesendeten Wert selbst eine 3 enthalten ist, sendet Dein Server zum Beispiel:

analog input is 321

In dem Fall könnte zwar eine 3 gefunden werden, aber dahinter steht immer noch kein Doppelpunkt.

Versuch's beim Server vielleicht mal mit:

            int sensorReading = analogRead(3);
            client.print("analog input 3:");
            client.print(sensorReading);

Ich kenne diesen TextFinder-Mist nicht näher, aber damit könnte eventuell eine Chance bestehen.
Eventuell wäre aber auch beim Client dann das eher richtig:

   if(finder.find("input 3:")){     
         ADC3 = finder.getValue();
         Serial.print(ADC3);
         Serial.println(" RAW");         
      }

Keine Ahnung, aber sieh Dir den TextFinder und wie er funktioniert mal GENAU an und versuche zu verstehen, was der überhaupt macht!

Allerdings würde es erstmal nur für die "3" und einige andere Ziffern funktionieren.

Und mit "0", "1", "2" und "5" würde es schon wieder nicht funktionieren können. Denn auf dem Webserver sendest Du diese Ziffern bereits im HTTP-Header, und auf dem Client überliest Du den Header nicht, sondern würdest mit Deinem Code Ziffern auch finden, wenn sie nur im HTTP-Header erscheinen.

jurs:
Deine Fehler sind:

  1. Du kannst nicht programmieren
  2. #include <TextFinder.h> ist ein Fehler, weil das großer Mist ist
  3. Du hast den eingebundenen TextFinder-Mist offenbar nicht mal verstanden

Wie bitte soll Dein Client mit diesem Code:

      if(finder.find("3")){     

ADC3 = finder.getValue(':');
        Serial.print(ADC3);
        Serial.println(" RAW");       
      }




die "3" und einen Doppelpunkt ':' finden können, wenn Du vom Server weder eine "3" noch einen Doppelpunkt senden lässt:


int sensorReading = analogRead(3);
            client.print("analog input ");
            client.print(" is ");
            client.print(sensorReading);



???

Falls im gesendeten Wert selbst eine 3 enthalten ist, sendet Dein Server zum Beispiel:


analog input is 321




In dem Fall könnte zwar eine 3 gefunden werden, aber dahinter steht immer noch kein Doppelpunkt.

Versuch's beim Server vielleicht mal mit:


int sensorReading = analogRead(3);
            client.print("analog input 3:");
            client.print(sensorReading);




Ich kenne diesen TextFinder-Mist nicht näher, aber damit könnte eventuell eine Chance bestehen.
Eventuell wäre aber auch beim Client dann das eher richtig:


if(finder.find("input 3:")){   
        ADC3 = finder.getValue();
        Serial.print(ADC3);
        Serial.println(" RAW");       
      }



Keine Ahnung, aber sieh Dir den TextFinder und wie er funktioniert mal GENAU an und versuche zu verstehen, was der überhaupt macht!

Allerdings würde es erstmal nur für die "3" und einige andere Ziffern funktionieren.

Und mit "0", "1", "2" und "5" würde es schon wieder nicht funktionieren können. Denn auf dem Webserver sendest Du diese Ziffern bereits im HTTP-Header, und auf dem Client überliest Du den Header nicht, sondern würdest mit Deinem Code Ziffern auch finden, wenn sie nur im HTTP-Header erscheinen.

Danke für die Info mit dem Textfinder. Es ist wirkich ein Problem mit meinen Mangelnden C-Kenntnissen, stehe ich auch dazu. Hab da nicht aufgepasst, aber erstmall müsste der Client sich mit dem Webserver verbinden und das Funktioniert schon mal nicht...

Metaworld82:
aber erstmall müsste der Client sich mit dem Webserver verbinden und das Funktioniert schon mal nicht...

Funktioniert das Beispiel unter "Datei - Beispiele - Ethernet - Webclient" bei Dir?
Ja oder Nein?

Und wie sieht Dein Heimnetzwerk konkret aus?
Kann man das ungefähr so skizzieren, dass das Internet über ein DSL-Modem/Router angeschlossen ist, daran ggf. (optional) ein Switch und dann verschiedene PCs und Arduinos mit Ethernet-Shield?

              +-----------+        +-------+
              |           |        |       |
              |DSL-Modem  |        |       |
Internet ---->|DSL-Router +------->|Switch |
              |           |        |       |
              |           |        |       |
              +-----------+        +-+-+-+-+
                                     | | | 
                                     | | | 
                                     | | +Arduino-Server
                                     | |
                                     | +Arduino-Client
                                     | 
                                     +PC

Nein das Webclient Beispiel funktioniert bei mir auch nicht.
Da liegt der Hase dann ja wohl schon begraben. Angeschlossen ist das wie auf dem Bild im Anhang
Ich habe leider keinen Switch, noch nicht.

Danke für deine Geduld und Hilfe Jurs

Anschluss.jpg

Metaworld82:
Nein das Webclient Beispiel funktioniert bei mir auch nicht.
Da liegt der Hase dann ja wohl schon begraben. Angeschlossen ist das wie auf dem Bild im Anhang
Ich habe leider keinen Switch, noch nicht.

Für Dein Vorhaben ist Dein Netzwerk offensichtlich falsch konfiguriert.

Dein "Arduino mit Web-Client" gehört mit einem Netzwerkkabel am "WLAN-Router" angeschlossen. Falls Dein WLAN-Router nur eine einzige LAN-Netzwerkbuchse für Kabel hat, brauchst Du einen "Switch". Dann gehört der Switch mit dem UpLink an den WLAN-Router angeschlossen, und an den Switch gehören sowohl der Arduino-Server als auch der Arduino-Client angeschlossen.

So wie Du es jetzt angeschlossen hast, müßtest Du am PC-Betriebssystem umfangreiche Änderungen an der Netzwerkkonfiguration vornehmen, damit es so funktionieren kann. Falls der PC unter Windows läuft, wäre das Minimum wohl die Aktivierung von "Internet Connection Sharing" auf dem PC, damit der Arduino-Client die Verbindung zum Router mitbenutzen kann. Aber ich kann Dir wirklich nicht sagen, was ggf. sonst noch konfiguriert werden muss. Ich würde mir lieber einen Switch besorgen und am Router anschließen, falls dieser nicht genügend Buchsen für das LAN hat.

Gerade mal bei eBay reingeschaut: Ein 10/100 MBit 5-Port Switch mit eBay Nr. 121489013868 kostet inklusive langsamem Versand als Warensendung nicht mal 10 Euro.

Mit den Freigaben haben ich auch schon Probiert. Den Internetzugriff freigeben usw. Was mir fehlt meiner Meinung nach ist das IP-Routing.

Kurze Rede langer Unsinn:

Hab mir gerade nen Switch, zwei W-Lan Adapater TP-Link TL-WR702n Kabel und Paar Kleinigkeiten bestellt. Damit sollte man arbeiten können. So komme ich nicht weiter :smiling_imp:

So kleines Update von meiner Seite nachdem ich einen alten Speedport W503v in meinen Restbeständen als Switch benutze. Ich kann mit dem Webclient den Analogwert vom Webserver mittels
Textfind auslesen und die Ausgabe zur Kontrolle im Seriellen Monitor.

Vielleicht kann das ein Anfänger gebrauchen.
Sketch vom Webserver

/*
  Web Server
  Aus den Beispielen leicht abgeändert auf derzeit nur einen Anlaogen Wert.
 
 */

#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, 0xEF};
IPAddress ip(192, 168, 178, 173);

// 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("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
            int sensorReading = analogRead(3);
            client.print("Analogwert3:");
            
            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 disconnected");
  }
}

Sketch vom Client

/*
 * SimpleClientTextFinder.pde
 * Angepasst von Stefan M.
 */
 

#include <SPI.h>         // needed for Arduino versions later than 0018 


#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,178,177 };
byte server[] = {192,168,178,173 }; // Google

EthernetClient client;
TextFinder finder( client);

int ADC3; // Variable für den Anlogen Wert der vom Server gelesen werden soll

void setup()
{
   
   Serial.begin(9600);
   delay(100);




}
void loop()
{
     Ethernet.begin(mac, ip);
     if (client.connect(server, 80)) {
     Serial.println("Verbunden mit 192.168.178.173 ");
     client.println("GET /search?q=arduino HTTP/1.0");
     client.println();
   } else {
     Serial.println("Verbindung Fehlgeschlagen");

}

  if (client.connected()) {
    ADC3 = 0; // Variable zurücksetzen um Prüfen zu können ob wirklich neue Daten kommen
    if(finder.find("Analogwert")){    
      if(finder.find("3")){     
         ADC3 = finder.getValue(':');
         Serial.print("Analog3= ");
         Serial.print(ADC3);
         Serial.println(" RAW");         
      }
    }
    
    if(ADC3 == 0){
      Serial.println("Keine Daten vorhanden"); 
    }
    delay(2000); // Warte 10000ms
  }
  else {
    Serial.println();
    Serial.println("Verbindung Fehlgeschlagen");
    delay(1000); 
  } 
  client.stop();

}

Hoffe es hilft jemanden.

Mfg Stefan M.