Go Down

Topic: Client und Server zugleich möglich? (Read 451 times) previous topic - next topic

Haustechno

Hallo,
ich habe gelesen das der Arduino in Verbindung mit dem ethernet-shield bis zu vier Verbindungen gleichzeitig verarbeiten kann.
Meine Frage nun,kann es immer nur Client oder Server oder auch beides zusammen auf einem Arduino sein?

Momentan hab ich ja nur den Client drauf,der per Button was  an IP und Port sendet.
Nun möchte ich aber auch was empfangen können,bzw. Zustände des Clients von extern setzen können.

Also ist dies möglich auch gleichzeitig?
Kann ich es mischen,also z.b. 2 Clienten uns 2 Server?

Danke vorab,

Mfg.
Haustechno

s-light

Hi Haustechno,

also ich habe schon einen UDP-Empfänger, UDP-Sender und 'Telnet-Server' gleichzeitig laufen gehabt.
also bei mir gings -
allerdings müsstest du sonst mal genauer specifizieren / beschreiben wie du dir das vorstellst bzw. was die gegenstelle ist...

sonnige grüße
stefan

Serenifly

Die Server/Client Sache hängt ja auch nicht davon ab ob gesendet oder empfangen wird. Das können beide.

Die Definition ist glaube ich wer die Verbindung aufbaut. Server akzeptieren Verbindungen und Clients initiieren sie. Aber wenn die Verbindung mal steht kann man glaube ich in beide Richtungen kommunizieren.

Haustechno

Also momentan hab ich das hier Dank dem Forum am laufen:
Code: [Select]
#include "ClickButton.h"
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>  

//========================= TCPIP einstellungen ==========
byte mac[]     = {
 0x5D, 0xA2, 0xFA, 0x2D, 0x36, 0x3C };                      // MAC-Adresse des Arduino
byte ip[]      = {
 192, 168, 178, 178 };                                      // IP-Adresse des Arduino
byte gateway[] = {
 192, 168, 178, 1 };                                        // Gateway
byte subnet[]  = {
 255, 255, 255, 0 };                                        // SubNet
byte server[]  = {  
 192, 168, 178, 22 };                                       // IP-Adresse des Servers
int serverPort = 54711;                                      // Port variable
EthernetClient client;                                       //
char host[]    = "192, 168, 178, 22 ";                       // Domain
//========================= LCD einstellungen ============
LiquidCrystal lcd(2, 3, 5, 6, 7, 8);
int Backlight = 28;
//========================= Buzzer =======================
int buzzerPin = 29;
//========================= LED ==========================
const int led1Pin = 40;
const int led2Pin = 41;
const int led3Pin = 42;
const int led4Pin = 43;
const int led5Pin = 44;
const int led6Pin = 45;

//========================= Variablen beim Start setzen ==
int ledState1 = 0;
int ledState2 = 0;
int ledState3 = 0;
int ledState4 = 0;
int ledState5 = 0;
int ledState6 = 0;



//=========================TASTER=========================
const int buttonPin1 = 22;
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);
const int buttonPin2 = 23;
ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP);
const int buttonPin3 = 24;
ClickButton button3(buttonPin3, LOW, CLICKBTN_PULLUP);
const int buttonPin4 = 25;
ClickButton button4(buttonPin4, LOW, CLICKBTN_PULLUP);
const int buttonPin5 = 26;
ClickButton button5(buttonPin5, LOW, CLICKBTN_PULLUP);
const int buttonPin6 = 27;
ClickButton button6(buttonPin6, LOW, CLICKBTN_PULLUP);

//========================= LED Funktion =================
int LEDfunction = 0;

//========================= SETUP ========================
void setup()
{
 Serial.begin(9600);                                               // Debug starten
 Serial.println("Webtaster gestartet");                            // Debug Serial
 Ethernet.begin(mac, ip);                                          // TCPIP starten
 Serial.println(Ethernet.localIP());                               // Debug client ip
 //========================Buzzer beim start
 digitalWrite(buzzerPin, LOW);                                     // Buzzer beim start auf low
 //======================= LCD starten ==================
 lcd.begin(20, 4);                                                 // LCD zeichen und Zeilen
 //=======================Ausgänge deffinieren ==========
 pinMode(led1Pin,OUTPUT);  
 pinMode(led2Pin,OUTPUT);
 pinMode(led3Pin,OUTPUT);
 pinMode(led4Pin,OUTPUT);  
 pinMode(led5Pin,OUTPUT);
 pinMode(led6Pin,OUTPUT);
 pinMode(Backlight,OUTPUT);
 pinMode(buzzerPin, OUTPUT);
 //=======================Entprellung der Taster========
 button1.debounceTime   = 10;   // Debounce timer in ms
 button2.debounceTime   = 10;   // Debounce timer in ms
 button3.debounceTime   = 10;   // Debounce timer in ms
 button4.debounceTime   = 10;   // Debounce timer in ms
 button5.debounceTime   = 10;   // Debounce timer in ms
 button6.debounceTime   = 10;   // Debounce timer in ms
}
void loop()
{
 //=======================Update button zustand========
 button1.Update();
 button2.Update();
 button3.Update();
 button4.Update();
 button5.Update();
 button6.Update();

 //======================klicks speichern in Funktion==
 if (button1.clicks != 0) LEDfunction = button1.clicks;
 if (button2.clicks != 0) LEDfunction = button2.clicks;
 if (button3.clicks != 0) LEDfunction = button3.clicks;
 if (button4.clicks != 0) LEDfunction = button4.clicks;
 if (button5.clicks != 0) LEDfunction = button5.clicks;
 if (button6.clicks != 0) LEDfunction = button6.clicks;

 //======================  Taster 1 Funktion ==============
 if(button1.clicks == 1)                                              // Toggeln der led 1 beim klick
 {
   ledState1 = !ledState1;
   if (client.connect(server, serverPort))                          // Verbindung zum Server IP und Port aufbauen
   {
     Serial.println("Verbunden, Sende Daten Taster 1");               // Verbunden,senden
     if(ledState1 == 1)                                               // wenn led high
     {
       digitalWrite(buzzerPin, HIGH);
       client.println("swebtaster1=an");                                // textinhalt senden
       Serial.println("Taster1=an");                                      // Debug serial
       Serial.println(ledState1);                                    // Debug zustand led
       delay(50);
       digitalWrite(buzzerPin, LOW);
     }
     else                                                             // sonst
     {
       digitalWrite(buzzerPin, HIGH);
       client.println("swebtaster1=aus");                               // textinhalt senden
       Serial.println("Taster1=aus");                                     // Debug serial
       Serial.println(ledState1);                                         // Debug zustand led1
       delay(50);
       digitalWrite(buzzerPin, LOW);
     }
   }
   
}


Damit hab ich 6 Taster mit jeweils einer led als Statusanzeige,und kann mit Hilfe der gesendeten Texte an die IP und Port
Schaltbefehle am Server ausführen.Dies funktioniert sehr gut genauso wie gewollt.

Nun möchte ich aber wenn ich am Server die Zustände schalte,das der Client dies auch bei sich aktualisiert,d.h. der Zusatnd der leds muss am klient und server übereinstimmen.

Oder was der Ansatz von voren an falsch?

Serenifly

Da würde ich auch sagen, dass du beides brauchst. Wenn sich die Zustände ändern nimmst du einen Server um eine Verbindung mit einem Client aufzubauen.

Du kannst zwar keinen Server und Client gleichzeitig haben, aber das brauchst du auch nicht. Nacheinander reicht vollkommen. Geht laut dem hier:
http://forum.arduino.cc/index.php/topic,134966.0.html

Aber wirklich auskennen tue ich mich mit dem Web Kram nicht :)

Haustechno

#5
Jan 28, 2014, 11:30 am Last Edit: Jan 28, 2014, 11:32 am by Haustechno Reason: 1
Also hier im Anhang,
der fertige Prototyp,es sind sogar 10 taster geworden,da die zwei unter dem LCD möchte ich als + und- nutzen für die Heinzung später.


Zurück zu meiner Frage,wie kann ich das nun lösen mit der client /server Geschichte?

Der Srver auf seite der Haussteuerung kann momentan nicht selber aktiv werden,reagiert aber auf get und set befehle des clients.
ich könnte es aber den anpassen,das er dann sendet an ip und port den Zustand der Taster.

Aber wie könnte das denn am Taster selber halt aussehen?
Danke schon mal vorab für Tipps ;-)


Serenifly

Das haben Server per Definition an sich.

Server akzeptieren Verbindungen. Clients bauen Verbindungen auf. Wenn du Verbindung initiieren willst, brauchst du einen Client.

Wie gesagt, es sollte möglich seinen auf beiden Enden je einen Client und Server zu haben.

Haustechno

Hmm leider hilft mir das nicht weiter :-(.
Also die Haussteuerung-Software hat halt nur nen Server keinen klient,ich kann aber mit PHP direkt aus der Software halt auch dsen Zustand der Taster  aus der Visualisierung dann an den Lantaster senden,Frage ist halt nur wie der code auf dem Lantaster aussehen sollte.

ich dachte an sowas in etwa:
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,178,178); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80

String HTTP_req;          // stores the HTTP request
boolean LED_status = 0;   // state of LED, off by default

void setup()
{
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
    Serial.begin(9600);       // for diagnostics
    pinMode(2, OUTPUT);       // LED on pin 2
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                HTTP_req += c;  // save the HTTP request 1 char at a time
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                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();
                    // send web page
                    client.println("<!DOCTYPE html>");
                    client.println("<html>");
                    client.println("<head>");
                    client.println("<title>Arduino LED Control</title>");
                    client.println("</head>");
                    client.println("<body>");
                    client.println("<h1>LED</h1>");
                    client.println("<p>Click to switch LED on and off.</p>");
                    client.println("<form method=\"get\">");
                    ProcessCheckbox(client);
                    client.println("</form>");
                    client.println("</body>");
                    client.println("</html>");
                    Serial.print(HTTP_req);
                    HTTP_req = "";    // finished with request, empty string
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// switch LED and send back HTML for LED checkbox
void ProcessCheckbox(EthernetClient cl)
{
    if (HTTP_req.indexOf("LED2=2") > -1) {  // see if checkbox was clicked
        // the checkbox was clicked, toggle the LED
        if (LED_status) {
            LED_status = 0;
        }
        else {
            LED_status = 1;
        }
    }
   
    if (LED_status) {    // switch LED on
        digitalWrite(2, HIGH);
        // checkbox is checked
        cl.println("<input type=\"checkbox\" name=\"LED2\" value=\"2\" \
        onclick=\"submit();\" checked>LED2");
    }
    else {              // switch LED off
        digitalWrite(2, LOW);
        // checkbox is unchecked
        cl.println("<input type=\"checkbox\" name=\"LED2\" value=\"2\" \
        onclick=\"submit();\">LED2");
    }
}


Wobei hier nuer eine led geschaltet werden kann ich brauche ja 10,aber das ist ja auch nicht das Problem...
Den HTML Teil brauch ich auch nicht,sondern nur ein einfaches schalten der led halt nicht nur am Lantaster selbst,sondern auch über ip und port.

Go Up