INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ethernet-Bibliothek, Frage zu: EthernetClient client = server.available();
15.08.2019, 13:28 (Dieser Beitrag wurde zuletzt bearbeitet: 15.08.2019 22:54 von Bitklopfer.)
Beitrag #1
Ethernet-Bibliothek, Frage zu: EthernetClient client = server.available();
Hallo,

ich mache gerade erste Erfahrungen mit dem Ethernet-Shield des Arduino.

Ich habe bereits erste einfache Beispielcodes zum Laufen gebracht.

Für mich ist das auch eine gute Möglichkeit mich tiefer mit den allgemeinen Netzwerk-Vorgängen und den spezifischen Funktionen der Arduino-Bibliothek auseinander zu setzen.

Gerne würde ich mich tiefer in das IOT-Thema einarbeiten und nicht nur vorgegebene Beispielcodes anpassen.

Gerne könnt ihr mir auch gute Bücher oder Webseiten zum Thema nennen.

Folgende Situation liegt vor:
- Arduino Uno mit Ethernet-Shield
- Mein Laptop ist direkt über LAN-Kabel mit dem Ethernet-Shield verbunden.
(kein Switch oder Router dazwischen)
- Laptop-Netzwerkkarte hat eine feste IP.

Ich habe viele Fragen, heute diese:

Was genau bewirkt diese Zeile:
_________________________________________________
EthernetClient client = server.available();
_________________________________________________

Ich schreibe mal ein paar Sachen, die ich mir angelesen habe.
Nichts muss richtig sein.

- Aus der Server-Klasse gibt es die Methode available(). Wenn sich ein Client (z.B. Telnet?) mit dem Server verbindet, dann wird ein Client-Objekt mit dem Namen client erzeugt. Dies wird in der Variablen mit Namen client vom Typ EthernetClient gespeichert.

--> Frage: Was ist dann der Inhalt der Variablen client?
- Ist die Variable genau ein Byte groß?
- Durch welche Vorgänge im Programmablauf wird der Inhalt verändert?
- Wann ist diese Zeile absolut notwendig im Programm?


Mein Problem, auch ohne diese Zeile funktioniert die Kommunikation mit dem Server.
Beim folgenden Code liefert der Server fortlaufend den Text in das aufrufende Terminal. Im einem Terminal gebe ich
telnet 192.168.1.100 23
ein.
Code:
--------------------------------------------------
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
byte ip[] = { 192, 168, 1, 100 };    

EthernetServer server = EthernetServer(23);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  delay(1000);
  server.println("Sag was!");
    delay(1000);
  server.println("Sag noch mehr!");
}
---------------------------------------------------
// Verbindet man sich mit einem Client-Programm wie Telnet
// oder netcat mit dem Server werden im Terminal fortlaufend
// die beiden Sätzen "Sag was!" und "Sag noch mehr!" ausgegeben.
Wenn ich das richtig verstehe, ist der Server doch ein Anwendungsprogramm, welches über die Biblioteks-Funktionen jetzt auf dem Arduino liegt.
Richtig?

Da der Text in der lopp nicht nur einmal, sondern dauernd auf meine Konsole übertragen wird, scheint es eine dauerhafte Verbindung von Server (auf dem Arduino) und Client (auf meinem Rechner) zu geben.

Ich erweitere jetzt das obige Programm.
Über telnet soll eine Buchstabe eingelesen und an das Terminal auf dem Laptop zurückgesendet werden.
-----------------------------------------------------
Code:
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
byte ip[] = { 192, 168, 1, 100 };    

EthernetServer server = EthernetServer(23);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  delay(1000);
  server.println("Sag was!");
    delay(1000);
  server.println("Sag noch mehr!");

         // ab hier jetzt das Neue
EthernetClient client = server.available();
  delay(200);
  if (client) {
  server.write(client.read());
  server.println("In der if-Schleife");
   }
}
----------------------------------------------------
Bei Code bitte immer die Code Tags benutzen, das ist das # Zeichen oben in der Editorleiste... zum schließen dann auf Close Tags klicken...ist ganz einfach.
Versuch es mal bei deinem Zweiten Beitrag.
lgbk Moderator



Was passiert:
Nach der Verbindungsaufnahme werden erstmal wie oben ständig die ersten beiden Sätze ausgegeben. --> Nicht der Satz innerhalb der if-Schleife.
Wenn ich einen Buchstaben eintippe wird dieser erst nach dem Drücken der Return-Taste vom Programm verarbeitet.
Das Programm springt erst jetzt in die if-Schleife.
Nun sind drei Zeichen (drei Byte) übertragen worden. Der Buchstabe selbst
und die beiden Zeichen LineFeed und CarriageReturn durch die Return-Taste.
Erst jetzt springt das Programm in die if-Schleife. Zeigt eines Zeichen an. Danach springt das Programm raus aus der if-Schleife und sendet die beiden äußeren Sätze. Dann wieder in die if-Schleife für das nächste Zeichen. Und so weiter bis alle Zeichen ausgegeben.
ABER,
danach werden dann weiterhin wieder nur noch die obigen beiden Sätze ausgegeben, also nicht mehr der Satz in der if-Schleife.
Obwohl ja noch eine Client-Server-Verbindung besteht.

Mit
if (client)
wird anscheinend nicht das vorhandensein einer Verbindung geprüft,
sondern ob ein Zeichen übertragen wurde und in einem Speicher liegt.
Speicher wo?
Speicher auf dem Arduino, oder
Speicher auf dem Ethernet-Shield?

In if (client) muss die Variable client ja > 0 sein, damit in die Schleife gesprungen wird.

Ich habe mir die client-Variable am Ende der if-Schleife ausgeben lassen mit
server.println(client);

Es wird mir eine 1 ausgegeben.
ABER,
trotzdem springt das Programm aus der if-Schleife raus, sobald alle eingegebenen Zeichen ausgegeben wurden.


Ich brauche ja das client-Objekt, um Methoden wie client.read() aus der Client-Klasse benutzen zu können.

Es gibt ja noch die Methode
client.available()
Rückgabe der Methode ist ja die Anzahl der Bytes im Speicher nach der Übertragung mit Telnet.

Hier der Originaltext von der arduino.cc Seite.
Gets a client that is connected to the server and has data available for reading. The connection persists when the returned client object goes out of scope; you can close it by calling client.stop().
Bedeutet das Folgendes?
Erster Satz: Ein Client (z.B. Telnet) ist verbunden UND Daten müssen von diesem vorhanden sein? Allein die Verbindung reicht nicht?
Zweiter Satz: persits--> fortbstehen, bleibt, andauern
scope --> Anwendungsbereich, Geltungsbereich
Also. Die Verbindung bleibt bestehen, wenn das zurückgebende Client-Objekt außerhalb des Geltungsbereich geht.
Kann mir das mal jemand besser übersetzen, bitte.
Wie ist das zu verstehen?

Damit es hier nicht zu lang wird, höre ich jetzt auf.

Meine Frage also:
Ab wann und wie wird der Inhalt der Variablen client verändert und beeinflusst?
Was genau bewirkt diese Zeile:
_________________________________________________
EthernetClient client = server.available();
_________________________________________________
Ist die Nutzung von client letztlich nur wie eine boolesche Variable,
entweder true oder false?
Die ich dann mit if (client) abfrage, um danach die Client-Methoden wie client.read() ansprechen zu können?

Vielen Dank für das Lesen bis hierher und all eurer Antworten.

Gruß
Karl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.08.2019, 22:47
Beitrag #2
RE: Ethernet-Bibliothek, Frage zu: EthernetClient client = server.available();
Ich habe mich noch mal vergewissert und beschreibe den Ablauf des Programms.
Ich beschränke mich auf den loop-Bereich:
_________________________________________________
void loop()
{
delay(1000);
server.println("Sag was!");

EthernetClient client = server.available();
delay(200);
if (client) {
server.write(client.read());
server.println("In der if-Schleife");
}
}
_________________________________________
In der loop gibt es den Bereich vor der if-Schleif
und den Bereich in der if-Schleife.

Folgendes passiert:
1.) Nach der geglückten Verbindung mit Telnet wird ständig der Satz vor der if-Schleife ausgegeben.
2.) Erst nach der Eingabe von Zeichen (z.B. das Wort --> hallo) an der Tastatur und drücken der Return-Taste springt das Programm in die if_Schleife.
4) Für jeden Durchlauf in der Schleife wird genau ein Zeichen ausgegeben.
ABER:
Nachdem in der if-Schleife ein Zeichen ausgeben wird, verbleibt es nicht in der if-Schleife bis alle Zeichen ausgegen werden.
SONDERN:
In der if-Schleife wird ein Zeichen ausgegeben, dann von außerhalb der Satz "Sag was!",
danach das nächste Zeichen aus dem Zeichen-Buffer usw.
Wenn alle Zeichen ausgegeben sind, verbleibt das Programm außerhalb der if-Schleife und gibt nun nur noch den Satz: Sag was! aus

So sieht das dann aus:

Sag was!
Sag was!
Sag was!
Sag was!
Sag was!
h
Sag was!
a
Sag was!
l
Sag was!
l
Sag was!
o
Sag was!

<------- Return Zeichen
Sag was!
Sag was!
Sag was!
Sag was!
Sag was!
usw

Also, wenn

if (client)
erfüllt ist, wenn die beiden Bedingungen
1. Verbindung mit Client
2. Ein Zeichen im Zeichen-Buffer
vorhanden sind,
dann verstehe ich nicht, warum die if-Schleife ständig verlassen wird.

Darum, was genau bewirkt
_________________________________________________
EthernetClient client = server.available();
_________________________________________________


Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.08.2019, 10:18 (Dieser Beitrag wurde zuletzt bearbeitet: 16.08.2019 13:01 von Bitklopfer.)
Beitrag #3
RE: Ethernet-Bibliothek, Frage zu: EthernetClient client = server.available();
Setze Code bitte in Codetags. siehe oben lgbk
Client ist ein Objekt, mit dem Du auf die Daten, die an Deinen Server gesendet wurden, zugreifen kannst und mit dem Du Antworten kannst.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Passwort Schutz fuer Client-Server Verbindung TCP/IP im W-Lan, braucht man einen? gutschy 9 422 04.08.2019 21:12
Letzter Beitrag: hotsystems
  LAN- Probleme mit Arduino UNO und W5100 Ethernet Shield SpooN 32 2.058 13.05.2019 16:54
Letzter Beitrag: SpooN
  Client.read() Zwischenspeicher erstellen!? Gura 11 5.358 16.04.2019 11:05
Letzter Beitrag: Blende8
  Auslagern von Code aus einer Bibliothek Blende8 6 601 10.04.2019 20:23
Letzter Beitrag: Tommy56
  Fern-Programmierung über Ethernet passra 14 935 09.04.2019 20:01
Letzter Beitrag: amithlon
  Bibliothek finden und löschen AnFi 1 484 25.02.2019 16:36
Letzter Beitrag: Tommy56
  Hilfe bei Formulierung der Frage Matt 3 823 23.02.2019 12:45
Letzter Beitrag: Tommy56
  Frage zur Datei "preferences.txt" daja64 5 534 17.02.2019 21:00
Letzter Beitrag: amithlon
  Wire.write und Client Socket LiVe 3 568 11.01.2019 13:51
Letzter Beitrag: Tommy56
  Frage zu goto uweausbaden 5 523 23.12.2018 13:56
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste