EthernetShield - server èn client

Hi allemaal,

Veel informatie haal ik als beginnende gebruiker al van dit forum, erg leuk!
Nu zit ik na te denken over een toepassing. Hiervoor heb ik een 'heen-en-weer' verbinding nodig met een NAS webserver (PHP). (een led aanzetten met een actie op die server EN bij het drukken op een Arduino knop een script uitvoeren op die server)

Ik heb een Arduino Uno met EthernetShield, daarmee kan ik een server maken en ook een client lukt wel. Maar is het ook mogelijk om beide tegelijk te doen?
Ik las op een ander forum dat de chip tot 4 sockets kan maken? Zijn deze dan ook los te 'programmeren'?
Het maakt me niet uit als de server en client eventueel andere IP-adressen hebben..

Als iemand een idee heeft hoor ik dat graag.
Heb ook al gedacht aan een PHP-socket verbinding, maar denk niet dat dat het wordt..

Alvast bedankt voor het meedenken!
Groet, Robert-Jan

robertjan
Ja het kan maar het is zeker geen beginner project.
Met vriendelijke groet
Jantje

Dag Jantje,

Bedankt voor de info, inmiddels heb ik de voorbeeldscriptjes van de EthernetShield al bij elkaar gedaan en iets gemodificeerd. Wanneer hij een aanvraag krijgt, gaat de webserver antwoorden en anders is het mogelijk een pakketje te versturen (als client). Dus niet tegelijkertijd, maar zeker werkbaar.

Dus het is gelukt!

Ter info: dit is mijn script:

/*
  GPIO-Ethernet code v2 by Robert-Jan.
  some source code used from the examples, credits:


  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, 0xAA, 0xAA };
IPAddress ip(192,168,1, 45);

IPAddress ip_server(192,168,1,44); // PHP webserver

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
int led1 = 7;
int button1 = 3;
boolean flag1 = false;
int i1 = 0;

void setup() {
    pinMode(A0, OUTPUT);
    pinMode(led1, OUTPUT); 
    pinMode(button1, INPUT);

 // Open serial communications and wait for port to open:
  Serial.begin(9600);

  // 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) {
    digitalWrite(A0, HIGH);
    Serial.println("Client connected");
    boolean currentLineIsBlank = true;
    String buffer = "";  
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
     //   Serial.print(c);   // commented voor performance
        buffer+=c;       
        if (c == '\n' && currentLineIsBlank) {
          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          if (digitalRead(7)){  
            client.print(" GPO 1 is <font color='green'>HOOG</font>");
            Serial.println("GPO 1 hoog gemaakt");
          }else{
            client.print(" GPO 1 is <font color='red'>LAAG</font>");
            Serial.println("GPO 1 laag gemaakt");
          }
          client.println("
");
            
          break;
        }
        if (c == '\n') {
          
          currentLineIsBlank = true;
          buffer="";       
        } else if (c == '\r') {            
          if(buffer.indexOf("GET /?gpo=")>=0) {
          
       //    Serial.println(buffer.substring(10,11));
          // GPO 1 hoog
          if (buffer.substring(10,11) == "1") {
                  digitalWrite(led1,HIGH);  
          }
          
          // GPO 1 laag
          if (buffer.substring(10,11) == "0") {
                  digitalWrite(led1,LOW);  
          }
          
         }
          
      
        }
        else {
          
          currentLineIsBlank = false;
        }
      }
    }
    
    delay(1);
    
    client.stop();
    
    Serial.println("client disonnected");
    Serial.println("");
  } else {
   digitalWrite(A0, LOW);  
   
   int sensorValue = digitalRead(3);
   if (sensorValue == HIGH) {
      flag1 = true; 
   } else {
     flag1 = false;
     i1 = 0;
   }
   
   
   if (flag1 == true && i1 == 0) {
    Serial.println("GPI 1 hoog"); 
    flag1 = false;
    i1 = 1;
    
    if (client.connect(ip_server, 80)) {
      Serial.println("connected");
      Serial.println("");
      // Make a HTTP request:
      client.println("GET /gpi_1.php HTTP/1.0");
      client.println();
      
      if (!client.connected()) {
        client.stop();
      }
        
    } else {
       Serial.println("connection failed"); 
    }
    
    
   }
   
   
   
  }  
  
}

:slight_smile:
Goed zo. Zo word je de arduino internet expert 8)
Met vriendelijke groet
Jantje

Mooi, lukt je dit ook met 2 verschillende poorten? Bv server op 80 en client op 81?

JO3RI:
Mooi, lukt je dit ook met 2 verschillende poorten? Bv server op 80 en client op 81?

Meteen even uitgeprobeerd en ja hoor! Heb de server nu op 81 draaien en de client vraagt nog netjes aan poort 80 de requests. Weet alleen niet waar de antwoorden van de requests aankomen bij de Arduino, dat behandelt mijn script niet, zal misschien ook wel 80 zijn, kan ik helaas niet testen.

Ter info: De Arduino fungeert nu als stand-alone GPIO box voor een PHP web-applicatie.

[ Offtopic: Ik wilde nog iets met HTML5 websockets testen maar dat werd me al snel iets te ingewikkeld :slight_smile: - als er iemand expertise heeft hoor ik het graag :wink: ]