Pages: [1]   Go Down
Author Topic: Client und Server zugleich möglich?  (Read 390 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 76
just sun
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also momentan hab ich das hier Dank dem Forum am laufen:
Code:
#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?
Logged

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ;-)



* Lantaster.jpg (1175.21 KB, 2560x1920 - viewed 27 times.)
« Last Edit: January 28, 2014, 05:32:00 am by Haustechno » Logged

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 97
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
Logged

Pages: [1]   Go Up
Jump to: