Forum: Mikrocontroller und Digitale Elektronik WizNet W5500 Probs als Webserver


von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo, wal meider ein neues Problemchen.

Ich "spiele" gerade mit einem W5500 Modul an meiner Arduino DUE Plative. 
(Standard C)

Die Ansteuerung des W5500 funktioniert, ich kann auch als Webserver 
"laucschen" und die Anfrage des Browsers "sehen". Ich antworte auch 
richtig, bzw,. will richtig antworten. Aber das kommt offensichtlich 
nicht an.

Der W5500 scheint den Sendebefehl bzw. das Einschreiben der Strings zu 
ignorieren. Stutzig macht mich, daß der bei der Anfrage vom Browser 
geöffnete Socket sofort (oder einige ms) nach der Anfrage geschlossen 
wird. Ist das korrekt? Meines Wissens doch eher nicht, aber ich finde 
keine Möglichkeit, einen Time-Out zu programmieren.

Weiterhin "dubios" finde ich die RD und WR Pointer des TX-Buffers. Diese 
liegen bei jeder Browseranfrsge höchst unterschiedlich verteilt in einem 
64k Adressraum. Das ist mehr als verwunderlich, da doch nur 16kbyte für 
alle TX-Sockets in suma verfügbar sind. Trotz Sendebefehl (0x20) wird 
(logischerweise??) der Sendebuffer NICHT gesendet...

Falls keine triviale Lösungsantwort möglich ist, poste ich gerne den 
Sourcecode (aus main.c) und die betreffende Senderoutine, die bei Github 
gefunden und dann entsprechend modifiziert habe. Aber das würde viel 
Platz in Anspruch nehmen. Vielleicht ist es auch nur eine "Kleinigkeit", 
die ich übersehen habe. Allerdings hatte ich vor einigen Jahren einen 
AVR ARduino mit einem W5100 mit den gleichen Hauptprogrammroutinen 
laufen.

So, jetzt mache ich "Schluß" und bin erst morgen wieder am PC.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo zusammen, leider hat keiner auf meine Anfarge von gestern 
geantwortet.

Heute habe ich viele (!) Stunden damit verbracht, mit Hilfe des 
Internets und durch Tests dem Problem auf die Spur zu kommen. Auch ein 
Wechsel der HW (Ich habe drei W5500 PCBs) hat nichts gebracht. 
Schlußendlich habe ich meine SW radikal gechopped.

Problem scheint eine eher zufällige Falschinitalisierung des TX_Wr und 
und des TX_RD Pointers des jeweiligen Sockets zu sein.

Nach Programmstart initialisiere ich den W5500 als TCP-Server und 
schalte ihn auf "Listen" Zudem setze ich die TX Pointer auf 0.

Das funktioniert auch, ich lese sie nach der Initialisierung zyklich 
aus. Eine Auswertugn der evnetuellen Browserabfragen findet nicht statt, 
in keinster Weise. Aber sobald der Browser seinen Anfragestring sendet, 
wird zwar der RX-Pointer richtig gesetzt, aber der TX-Pointer wird mit 
einen eher zufälligen Wert überschrieben. Das ist absolut 
reproduzierbar, allerding ist der jeweilige TX-Pointerwert (Der 
WR-Pointer) zufällig.

Die Main-Schleife sieht wie folgt aus...
1
while (1) {
2
    WDT->WDT_CR = 0xA5000001;  //REset Watchdog
3
    TFT_csabs(7,1);
4
    printf("%02X SR %02X SN %02X", server_client_available(),     client_status(),client_get_sock());

Der IRQ des W5500 ist nicht aktiv. Socket "0" ist in dfer 
Auswerteroutine estgelegt, da dieser nach einem RESET auch automatisch 
gewählt wird.

Ich stehe völlig auf dem Schlauch. Sicherlich liegt der Fehler bei 
meiner SW, aber wo könnte ich noch suchen?

Pls help.

von Florian H. (Firma: h.a.l.m.) (flomann)


Lesenswert?

Prinzipiell zum W5500 da mir die Arduino  Implementierung auch nicht 
bekannt ist.
Erstmal ist es nicht schlecht dessen Dateblatt zu bemühen da ist das 
mapping
der Rx/Tx Fifos als auch das handling mit dessen zeigern erläutert.
Die Fifo Zeiger initialisiert der W5500 selber, je nach Protokoll, beim 
Öffnen oder
dann beim connect Event des Socket dir kann es dabei egal sein wo diese 
im 64k
Adressraum liegen.
Zum Senden als Beispiel.
1. Prüfe auf freien Platz im Tx Fifo gibt entsprechendes register dazu 
und beachte
    das ein nur einmaliges lesen zu Fehler führen kann da nicht atomar.
    also z.b doppelt lesen so lange beide gelesenen werte gleich sind. 
Dies beim
    Rx Register für Anzahl Bytes im Fifo genau so.
Wenn nun platz zum Senden von Daten ist, dann:
2. Tx Write Zeiger aus w5500 lesen.
3. Daten in den Tx Fifo schreiben.
4. Die Anzahl Bytes der in den Fifo geschriebenen Daten auf den Tx write 
Zeiger
    aufaddieren und diesen wert an den w5500 zurückschreiben.
5. Send cmd absetzen.

Fertig, um mehr muss man sich mit den Fifo zeigern nicht kümmern.

Gruß
Florian

von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo Florian, danke für Deine Antwort.

Das Datenblatt habe ich (natürlich) intensiv studiert, nur es bringt 
nicht wirklich die Erleuchtung bezüglich des Fifo Mappings. Ich habe es, 
wie auch einige andere Postings im I-Net ergeben haben, so verstanden, 
daß der jeweilige Pointer (TX-WR, TX-RD, RX-WR, RX-Rd) bei 0 anfängt und 
dann beim Überschreiten der Maximalgrneze wieder bei = beginnt. Das 
tatsächliche Mäpping also für den user verborgen bleibt ( Beim  W5100 
ist es, so glaube ich  mich zu erinnern, etas anders). Ich bin mir da 
aber nicht sicher. Beim RX-WR-Fifo Pointer zumindest ist es so.

Ich beschreibe das TX-Fifo genau so wie Du es erwähnt hast, auch mit der 
Überprüfung beim Lesen der 16-bit Register.

Ich werde das aber nochmals genau untersuchen, vielleicht liegt da ein 
Fehler im Detail. Ich melde mich dann.

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, ein kleines Update:

Offenbar ist ist Wert der TX-Fifo Pointer tatsächlich "irgendwo" im 64k 
Adressraum

Ich habe ein paar Vereinfachungen in meiner SW vorgenommen und nun 
scheint tatsächlich etwas ausgesendet zu werden. Das das der Browser 
nicht als Antwort akzeptiert dürfte wohl nicht am W5500 liegen. Ich will 
mal versuchen, mir den Datenstrom anzusehen.

Ich melde mich wieder...

von Florian H. (Firma: h.a.l.m.) (flomann)


Lesenswert?

Hanns-Jürgen M. schrieb:
> So, ein kleines Update:
>
> Offenbar ist ist Wert der TX-Fifo Pointer tatsächlich "irgendwo" im 64k
> Adressraum

Wie beim mapping im DB ersichtlich werden die Fifos jeweils über den 
gesamten 16Bit
adressraum mehrfach gemappt. Der W5500 kümmert sich dabei um wraparround
und das es physikalisch da landet wo es hin soll.

>
> Ich habe ein paar Vereinfachungen in meiner SW vorgenommen und nun
> scheint tatsächlich etwas ausgesendet zu werden. Das das der Browser
> nicht als Antwort akzeptiert dürfte wohl nicht am W5500 liegen. Ich will
> mal versuchen, mir den Datenstrom anzusehen.
>
> Ich melde mich wieder...

Nutze Wireshark und schaue dir an was auf die Leitung geht/ging

Ps w5100 und w5500 sind schon signifikant unterschiedlich  also 
sicherstellen
das die richtigen libs überall genutzt werden.
Und nein am w5500 als chip liegt es sicher nicht das ist ein sw ding.
(defekte, suboptimal ausgeführter Aufbau in HW ausgenommen)

: Bearbeitet durch User
von Hanns-Jürgen M. (yogy)


Lesenswert?

Ich befürchte, ich bin einem Phantom hinterher gelaufen...

Wireshark habe ich mir installiert, aber ich komme auf die Schnelle 
nicht damit klar, scheint mir aber ein tolles Tooll zu sein, mit dem ich 
mich nähere auseineder setzenm werden.

Ich habe "HyperTerminal" auf TCP Winsock und Port 80 eingestellt, meine 
SW so geändert, daß sie schon nach einem empfangenen Zeichen den String 
zurücksendet, und siehe da, es wird korrekt gesendet. Die "Website" wird 
vom HyperTerminal korrekt empfangen (bzw. deren Sourcecode).

Ich denke, das Problem  "W5500" ist gelöst (oder hat nie bestanden...). 
Das Problem liegt offenbar in der gesendeten Antwort zum Browser.. Aber 
das bekomme ich in den Griff

BTW, der Antwortstring:
HTTP/1.1 200 OK
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<HTML><HEAD></HEAD><BODY><br><br><br><br><br> <center>
<H3>NUR EIN HELLO WORLD</h3></center></body></html>

von Marco H. (damarco)


Lesenswert?

Also die Zeiger setzt der W5500 selbst.

Um zu wissen ob etwas empfangen wurde müssen die Statusregister 
ausgelesen werden. Sobald die Buffer gelesen oder geschrieben werden 
setzt der w5500 diese neu. Ist der Buffer voll wird im TCP/IP Mode kein 
ACK gesendet. Bis zum Timeout dann wird der Socket geschlossen. Holst du 
die Daten nicht aus dem Buffer wird der Socket geschlossen.

Steht alles im Datenblatt...

von Hanns-Jürgen M. (yogy)


Lesenswert?

Ja, danke, schon klar.

Wie erwähnt basiert meine SW auf den "alten" AVR-Routinen für den W5100. 
Die HW-nahen Routinen natürlich angepasst.

Sobald eine Verbidnung "etablished" ist (SnSR == 0x17), wird der Buffer 
ausgelesen und (zunächst nur) rudimentär ausgewertet.

Dann wird der Sendestring rausgeschickt. Das klappt ja auch (laut 
Hyperterminal). Nur, der Browser akzeptiert es WTF nicht. (Egal, ob FF 
oder IE). Ich denke doch, ein Empfang der OK-Strings  " HTTP/1.0 200 
OK\n\r " der Browser doch eigentlich zufrieden sein sollte?

Meine Idee war zunächst, daß die DIPR falsch ist..

Ich habe vor dem Sende-CMD die DIPR ausgelesen, sie ist richtig (IP des 
Client). Die DPORT Nummer ist "exotisch", ich vermute, die wird beim 
Verbindungsaufbau Browser <-> W5500 "vereinbart"

Nun habe ich im I-Net herumsucht und einen simple-Webserver gefunden:

https://olduino.wordpress.com/2014/12/11/minimal-http-server-with-w5500/

aber die dortigen Befehle entsprechen schlußendlich meinen...

Ich denke, ich bin wieder einmal betriebsblind und habe etwas übersehen.

von Hanns-Jürgen M. (yogy)


Lesenswert?

...Ergänzung:

Beim W5100 habe ich die Zeichen einzeln ausgelesen und das beim W5500 
auch so übernommen. Dies kostet Zeit..

von Marco H. (damarco)


Lesenswert?

Beitrag "einfache und performante W5500 LIB"

Ich kann ja nochmal in den Code schauen...

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, meine Versuche heute waren alle für den Besagten.

Ich werde, spbald ich Zeit finde, meine SW 1:1 durch diese

https://olduino.wordpress.com/2014/12/11/minimal-http-server-with-w5500/

ersetzen. Angeblich soll diese ja funktionieren.

von Heiko G. (heikog)


Lesenswert?

Hanns-Jürgen M. schrieb:
> BTW, der Antwortstring:
> HTTP/1.1 200 OK
> <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
> <HTML><HEAD></HEAD><BODY><br><br><br><br><br> <center>
> <H3>NUR EIN HELLO WORLD</h3></center></body></html>

Füge mal nach der ersten Zeile eine Leerzeile ein (Falls die nicht schon 
da ist und durch die Foren-Formatierung verlorengegangen ist). HTTP 
erwartet nach der Statusantwort eine (eventuell leere) Liste von 
Headern, dann ein einzelnes CRLF, und dann erst die Nutzdaten.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Marco H. schrieb:
> Beitrag "einfache und performante W5500 LIB"
>
> Ich kann ja nochmal in den Code schauen...


Hi Marco, ich habe Deinen Post erst nach dem Versenden meiones vorigen 
gelesen.

Danke für Dein Angebot, aber vlt. sollte ich erst einmal das erwähnte 
Beispiel aus dem link nehmen. Denn ich glaube eher nicht, daß es an der 
W5500 Programmierung liegt, da der Antwortstring ja ausgesendet wird.

Wenn es mit dem Beispiel auch nicht funktioniert, dann liegt das Problem 
wohl ganz woanders.

Vor weit über 15 Jahren hatte ich einmal einen Linux-Server zwischen 
meinem LAN und dem I-Net hängen, der den Datenverkehr aufzeichnete. 
Leider habe ich den Rechner und insbesondere seine SW nicht mehr...

von Hanns-Jürgen M. (yogy)


Lesenswert?

Heiko G. schrieb:
> Hanns-Jürgen M. schrieb:
>> BTW, der Antwortstring:
>> HTTP/1.1 200 OK
>> <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
>> <HTML><HEAD></HEAD><BODY><br><br><br><br><br> <center>
>> <H3>NUR EIN HELLO WORLD</h3></center></body></html>
>
> Füge mal nach der ersten Zeile eine Leerzeile ein (Falls die nicht schon
> da ist und durch die Foren-Formatierung verlorengegangen ist). HTTP
> erwartet nach der Statusantwort eine (eventuell leere) Liste von
> Headern, dann ein einzelnes CRLF, und dann erst die Nutzdaten.

Wieder war ich zu langsam... ich checke das jetzt gleich

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, Versuch verlief leider negativ. Morgen baue ich das mal alles um...

Im  Bild (Screenshot vom Hypetrterminal) siehst Du die resetmeldung des 
Dues,

dann die Anfrage des Servers (ausgelesen aus dem W5500) und dann die 
Antwort, mit eingefügten Leerzeilen, si im W5500 abgeklegt und gesendet 
wird. Die TX-RD und WR Pointer zeigen dies.

Viele Grüße und vielen Dank für Deine beständige Hilfe!

Yogy

von Hanns-Jürgen M. (yogy)


Angehängte Dateien:

Lesenswert?

Bild vergessen

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, das "Simple Server" Beispiel hat auch ein paas Fehler, aber, nachdem 
ich diese beseitigt habe, gibt der Browser das aus, was er soll.

Jetzt suche ich mal konkret die Unterschiede..

von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> So, meine Versuche heute waren alle für den Besagten.

Überlege mal: Wie sollen wir den Fehler in deinem Quelltext zeigen, ohne 
ihn sehen zu können?

Der Größte Fehler in der Softwareentwicklung ist, davon auszugehen, dass 
der Fehler nicht im eigenen Code ist.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> Hanns-Jürgen M. schrieb:
>> So, meine Versuche heute waren alle für den Besagten.
>
> Überlege mal: Wie sollen wir den Fehler in deinem Quelltext zeigen, ohne
> ihn sehen zu können?
>
> Der Größte Fehler in der Softwareentwicklung ist, davon auszugehen, dass
> der Fehler nicht im eigenen Code ist.

Ich hatte schon erwähnt, daß der Fehler in meinem Code liegt. Und so 
langsam nähere ich mich auch der Ursache an... (siehe mein heutiges 
Porting von 16h06. Sobald ich das Problem gefunden und gelöst habe, 
werde ich das hier "melden".

von Stefan F. (Gast)


Lesenswert?

Auf jeden Fall finde ich deinen Versuch gut, das Programm auf möglichst 
wenig zu reduzieren. Wenn du dann noch Hilfe brauchst, solltest du es 
uns aber mal zeigen.

von Thomas K. (joshua314)


Lesenswert?

Nabend zusammen

der W5500 wird von Arduino nativ unterstützt.
Man includiert statt ethernet.h  ethernet2.h
dann geht der w5500    und das ohne Probleme bei mir

dann noch zu den Pointer und Buffer beim W5500.

1. müssen die für alle benutzten sockets angelegt werden.
   Es ist getrennt RX und TX buffer
2. wenn ein socket kein speicher bekommt kann man ihn auch nicht nutzen.
3. TX Buffer uuf Null stellen ...   warum ???
   Denn das sind Ringbuffer... den Anfang vom Buffer schreibt immer der 
W5500        um !!! Ich würde die Finger davon lassen.

Der Sendevorgang geht so.
Den W5500 fragen wieviel im Sendebuffer frei ist. Dann ab dem Start 
Zeiger mit der freien Länge (oder was man davon braucht) reinschreiben 
was gesendet werden soll. Das eben mit Umbruch am Ende Ringbuffers. 
Pointer nachziehen bis wo man reingeschrieben hat. Dann Warten bis der 
W5500 sendet, oder das Senden antriggern wenns pressiert.
Wenn noch was zu senden ist, immer nachfragen was im Buffer frei ist.

So habs ich ohne Arduino gemacht .... und es geht

Gruß Thomas

von Stefan F. (Gast)


Lesenswert?

Wie gesagt haben alle AVR viel zu wenig Buffer für die Daten. Da braucht 
man über den zusätzlichen Speicherbedarf für Ethernet gar nicht weiter 
nachzudenken.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> Auf jeden Fall finde ich deinen Versuch gut, das Programm auf möglichst
> wenig zu reduzieren. Wenn du dann noch Hilfe brauchst, solltest du es
> uns aber mal zeigen.

Mache ich sicher, danke

von Hanns-Jürgen M. (yogy)


Lesenswert?

Thomas K. schrieb:
> Nabend zusammen
>
> der W5500 wird von Arduino nativ unterstützt.
> Man includiert statt ethernet.h  ethernet2.h
> dann geht der w5500    und das ohne Probleme bei mir
>

>
> Gruß Thomas

Da liegt wohl ein Mißverständis vor. Ich nutze keine 
Arduino-SW-Platform, sondern Standard C mit Atmel Studio. Mit Buffern, 
Pointern etc habe ich auch keine Probleme. Die ursache des Problems 
liegt irgendwo im Verborgenen, ich bin ihr aber auf der Spur...

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> Wie gesagt haben alle AVR viel zu wenig Buffer für die Daten. Da braucht
> man über den zusätzlichen Speicherbedarf für Ethernet gar nicht weiter
> nachzudenken.

Ja, schon klar. Aktuell ist meine Hardware ein SAM3X8e auf einer 
Arduino-DUE PCB

Meine spätere Anwendung wird kein Webserver o.ä. sein, sondern ein 
proprietäres Binär-Protoll, inkl. Overhead maximal 180 Bytes lang.

von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> Meine spätere Anwendung wird kein Webserver o.ä. sein, sondern ein
> proprietäres Binär-Protoll, inkl. Overhead maximal 180 Bytes lang.

Ach so. Dann ist Ok.

von Hanns-Jürgen M. (yogy)


Lesenswert?

HEUREKA, Problem gelöst, Fehler gefunden.

Nach der Übetragung der Antwort zum Browser (Client) muß offenbar der 
Socket disconnectiert werden.

Der "Simple Server" aus dem Internetlink (s.o.) macht das so, und das 
habe ich dann übernommen.

Soweit ist das aber verstanden habe, wird ein Socket erst nach Ende der 
Kommunikation, und das ja mehrfaches Hinundher bedeuten, geschlossen. 
(Bei einer Browseranfrage gibt es halt nur ein Hin und ein Her (Vom 
Handshaking mal abgesehen) Korrekt?

Danke für Eure Hilfe und Eure Geduld...

von Thomas K. (joshua314)


Lesenswert?

Nabend...

ok reines C

Besser so,  ich hab es genau so. Ist viel schneller als Arduino .....
Also solange das Webseiten sind, die nur was ausgeben, macht man die 
immer zu. Damit kann dann der nächste auch schon kommen.

Immer das </html>   ausgeben.   Dann noch kurz warten damit es gesendet 
ist. Oder den W5500 abfragen wieviel speicher zum Senden zur Verfügung 
steht, wenn wieder alles frei ist, ist alles gesendet. Dann den Socket 
zumachen.



Bei Binär würde ich es offen lassen. Ist schneller...

Wenn es aber rein Binär ist, wie du es sagst, würde ich eine Simples 
Protokoll drüber hängen, damit ein Sync funktioniert. Dann rennen 
lassen.

Was ich immer benutze (egal USB oder Netzwerk) ist folgendes.

Ich Sende immer ein 0xAA als Frame Erkennung.
Dann als nächtes Byte die Länge (Wenn es nur die 180 Byte bleiben passt 
das) als letzten noch eine pseudo CRC   sprich ich addiere incl Länge 
alle Bytes als char (sprich mit überlauf) das sind 3 Byte gesamt mehr.

Wenn das mal nicht passt   und ich keine Antwort bekomme    sende ich 
als erstes 255 Byte nullen. Damit ist das Flag wieder weg.....

Das Flag setze ich beim Sync 0xAA, dass eben erst zurückgesetzt wird 
wenn alles durch ist. Damit kann 0xAA auch als Data vorkommen.

Damit kann man im laufenden Betrieb   ein und ausstecken und fällt immer 
wieder auf die Füsse.

Gruß Thomas

von Marco H. (damarco)


Lesenswert?

Nö das macht der Client... Du musst bloß den Status auslesen und den 
Socket wieder im richtigen Mode bringen..

Wenn der Socket verbunden ist steht dieser nur dem einem Client zur 
Verfügung andere Anfragen werden nicht bearbeitet. Es sei denn du machst 
weitere Sockets auf dem Port auf.

Deswegen muss der Code mit N Sockets umgehen können...

Bei maximal 8 Clients gleichzeitig ist Schluss...

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> HEUREKA...hin und her...Korrekt?


It depends. Zunächst mal muss geklärt werden, ob der Browser weiß, wie 
viele Bytes er zu erwarten hat.

Bei HTTP 1.0 teilt der Server dies dem Browser mit dem optionalen 
Content-Length Header mit. Sobald der Browser alle Bytes empfangen hat, 
muss er die Verbindung schließen.

Ohne diesen Header muss der Server die Verbindung am Ende schließen, 
damit signalisiert er das Ende der Übertragung. Probleme bekommst du, 
wenn beim Browser noch nicht alles angekommen ist. Nach dem Schließen 
der Verbindung kann er keine Empfangsstörung mehr signalisieren, dann 
bleibt es halt bei einer unvollständigen Datei.

Bei HTTP 1.1 gibt es eine weitere Methode, die für Datenmengen 
unbekannter Größe vorgesehen ist. Nennt sich Chunked-Transfer. Dabei 
werden die Daten in Blöcken mit bekannter Größe übertragen. Zum Schluss 
sendet der Server einen Block mit der Größe 0, um das Ende zu 
kennzeichnen.

Bei HTTP 1.1 soll die Verbindung normalerweise offen gehalten werden. 
Der Client kann über diese eine Verbindung mehrere Anforderungen senden 
und der Server hat sie in der gleichen Reihenfolge zu beantworten. Der 
Client entscheidet normalerweise, wann er die Verbindung schließen 
möchte. Der Server darf sie allerdings auch schließen, wenn er es für 
notwendig hält (z.B. nach einer Minute Inaktivität).

HTTP 1.1 ermöglicht auf Strecken mit hohen Laufzeiten erheblich bessere 
Performance. Für Mikrocontroller ist das eher uninteressant, aber dieser 
Chunked Transfer ist eine nette Sache denn er reduziert das Risiko 
erheblich, den letzten Block der Datei zu verlieren.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Danke für Eure Antworten und Kommentare.

@Thomas: Das von mir verwendete Protokoll basiert auf einer (von mir 
maßgeblich mit entworfenem) industriellen Kommunikationsstruktur (BiCat, 
1993). Ich verwende es seit etwa 1995 und läuft ursprünglich über UART 
Systeme. (z.B. RS 485) Es ist stabil und robust. Es ist eine 
Single-Master System. Ich habe allerdings aktuelleeinen Fortentwicklung 
im Test, das mit "echter" CRC arbeitet und weiteren Kontrollmechanismen 
ausgestattet ist.

@Marco, @Stefanus. Wertvolle Hinweise, die mir bislang unbekannt waren, 
insb. bezüglich HHTP 1.0 und 1.1, Ich werde also noch ein paar 
Experiemnte machen. Wie erwähnt soll der W5500 (wie auch der W5100 und 
andere) bei mir mit einem reinen Binaerprotokoll arbeiten. Bislang ist 
das Netzwerk ein Single-Master System, das mit einem Socket auskommt. 
Das künftige Protokoll wird aber multimasterfähig sein, so daß ggf. 
mehrere Sockets bearbeitet werden müssen. ich denke, daß auch 
"gleichzeitig" Client- und Server Sockets implemenieren werde (zumindest 
will ich das versuchen), aber das liegt noch in fernerer Zukunft.

Auch bislang kann ich auf dem Controller mehrfere Kommunikationswege 
gleichzeitig und unabhängigvoneinander betreiben (UARTs, USB, LAN, Funk 
RFM12), solange der Controller das alles, insb. speichermäßig, schafft.

@Stefanus Frage, wie sende ich einen Block der Größe "0"? Einfach ein 
Sendecommand ohne den TX-Buffer mit irgendetwas geladen zu haben?

von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> Wie erwähnt soll der W5500 (wie auch der W5100 und
> andere) bei mir mit einem reinen Binaerprotokoll arbeiten.

> @Stefanus Frage, wie sende ich einen Block der Größe "0"? Einfach ein
> Sendecommand ohne den TX-Buffer mit irgendetwas geladen zu haben?

bezieht sich deine Frage auf HTTP oder auf dein selbst erfundene 
Protokoll? Ich kann Dir dein eigenes Protokoll nicht erklären.

Dass Ethernet Pakete (also UDP) mit 0 Bytes Daten beim Empfänger 
ankommen, darauf würde ich mich nicht verlassen. Das TCP Protokoll ist 
hingegen Stream-orientiert. Dabei kannst du dich nicht darauf verlassen, 
dass die Daten in der selben Stückelung beim Empfänger ankommen, wie sie 
gesendet wurden. TCP stellt aber im Gegensatz zu UDP die richtige 
Reihenfolge sicher und dass verlorene Pakete automatisch wiederholt 
werden.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> Hanns-Jürgen M. schrieb:
>> Wie erwähnt soll der W5500 (wie auch der W5100 und
>> andere) bei mir mit einem reinen Binaerprotokoll arbeiten.
>
>> @Stefanus Frage, wie sende ich einen Block der Größe "0"? Einfach ein
>> Sendecommand ohne den TX-Buffer mit irgendetwas geladen zu haben?
>
> bezieht sich deine Frage auf HTTP oder auf dein selbst erfundene
> Protokoll? Ich kann Dir dein eigenes Protokoll nicht erklären.
>
> Dass Ethernet Pakete (also UDP) mit 0 Bytes Daten beim Empfänger
> ankommen, darauf würde ich mich nicht verlassen. Das TCP Protokoll ist
> hingegen Stream-orientiert. Dabei kannst du dich nicht darauf verlassen,
> dass die Daten in der selben Stückelung beim Empfänger ankommen, wie sie
> gesendet wurden. TCP stellt aber im Gegensatz zu UDP die richtige
> Reihenfolge sicher und dass verlorene Pakete automatisch wiederholt
> werden.

Meine Frage bezieht sich auf das Thema HTTP 1.1, das hattest Du doch 
erwähnt?


Ich habe gerade mal nach HTTP gegooschelt, und habe da in der Wikipedia 
etwas gefunden, ich werde das jetzt testen....

Solong  Yogy

von Stefan F. (Gast)


Lesenswert?

HTTP ist zum Übertragen von Text gedacht. Dein eigenes binäres Protokoll 
in HTTP zu tunneln erscheint mir nicht sinnvoll. Ich hatte HTTP nur zur 
Sprache gebracht, weil du es "Webserver" genannt hast und Teile von HTML 
Dokumenten zitiert hast.

von Roger S. (edge)


Lesenswert?

Stefanus F. schrieb:
> HTTP ist zum Übertragen von Text gedacht.

Echt? Und wie denkst du werden z.B. PNGs übertragen?

Cheers, Roger

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> HTTP ist zum Übertragen von Text gedacht. Dein eigenes binäres Protokoll
> in HTTP zu tunneln erscheint mir nicht sinnvoll. Ich hatte HTTP nur zur
> Sprache gebracht, weil du es "Webserver" genannt hast und Teile von HTML
> Dokumenten zitiert hast.

Das eigene Protokoll wird natürlich NICHT in HTTP verpackt. Ich habe 
mich da wohl mißverständlich ausgedrückt.

Die Spielerei mit HTTP dient mir alleine dazu, Fehler nur auf der 
Serverseite suchen zu müssen und nicht bei einem Client.

Aif jeden Fall danke für die offenbar dringend notwendige HTTP 
Nachhilfe. Ich habe mich daraufhin auch etwas schlauer gemacht, und 
meine Antwort aus die Anfrage des Clients ist nun:


HTTP/1.1 200 OK
Content-Length: 120
Content-Language: de
Connection: close
Content-Type: text/html

<HTML><HEAD></HEAD><BODY><br> <br><br><br><br><center><H1>  NUR EIN 
SCHNELLES HELLO WORLD </h1></center></body></html>

Die Länge der Nichtheaders ist 120 byte <HTML>...</HTML>

Damit funzt es, in dem ich den Socket Status nach der Übertragung 
intensiver auswerte (hatte ich aus Unkentnis nicht gemcht). Da schließt 
nun der Client den Socket oder der Client meldet "CLOSE WAIT". In den 
beiden Fällen trenne ich den Socket und starte den Server erneut auf 
"listening"

So scheint es zu funzen...

von Marco H. (damarco)


Lesenswert?

eben das ist was ich meinte. Man muss den Status des w5500 immer wieder 
abfragen oder man bemüht die ISR.. Anhand des Status muss dann das Event 
ausgelöst werden.

Die Schleife muss alle verwendeten sockets abarbeiten. Auch der 
Webserver muss Status basiert arbeiten damit er mehre Clients auf 
verschieden Sockets abarbeiten kann. Genau das wirst du Festellen wenn 
die Datei größer ist als der buffer.

Die Verbindung offen zu lassen ist beim w5500 etwas kontraproduktiv, 
damit lassen sich genau 8 Clients bedienen, beim 9 Client der connect 
abgewiesen.

Noch ein Problem gibt es mit dem ARP Table das kann nur eine Adresse 
speichern. Jedes mal wenn ein anderer Client bedient wird löst der W5500 
diese per ARP auf.. Abhilfe schafft nur ein eignendes Table und das 
setzen vor dem senden.

: Bearbeitet durch User
von Marco H. (damarco)


Angehängte Dateien:

Lesenswert?

Das sieht dann so aus ...

Was ich gerade festgestellt habe das das Project auf einen China Clone 
läuft und im Code steht das es mit dem orginalen und dem ASP probleme 
mit dem CD gab, das dort gefixt wurde. Auf einen orginalen initalsiert 
die SD Karte nun nicht mehr...

von Hanns-Jürgen M. (yogy)


Lesenswert?

Nachdem nun das ursprüngliche Problem gelöst ist, ich etwas über HTTP 
geöernt habe und auch mein Binärptotokoll nach unwerwarteten Problemchen 
mit dem Visual-Basic Client (ist eigentlich nicht mein Beritt) will ich 
etwas weiter "herumspielen" und optimieren bzw. den Code "choppen".

Interessant finde ich die Möglichkeit, das "Pingen" bzw. die Pingantwort 
zu verbieten. Darauzs ergäbe sich doch die Möglichkeit, auf der einen 
IP-Adresse mherere Server anzuschließen, die sich nur in der Portnummer 
unterscheiden? Ist das (technuch) möglich und praktikabel? (ich weiß, 
daß das "unsauber" ist...)

von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> Interessant finde ich die Möglichkeit, das "Pingen" bzw. die
> Pingantwort zu verbieten.
> Daraus ergäbe sich doch die Möglichkeit, auf der einen
> IP-Adresse mherere Server anzuschließen, die sich nur in der Portnummer
> unterscheiden?

Ja sicher geht das, und es hat mit Ping überhaupt nichts zu tun.

Ping benutzt das ICMP Protokoll. Wenn du Port Nummern verwendest, dann 
bist du beim TCP oder UDP Protokoll. Alle drei Protokolle kannst du 
voneinander unabhängig nutzen. Du könntest sogar auf TCP Port 80 einen 
anderen Service betreiben, als gleichzeitig auf UDP Port 80.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Danke für die Antwort.

Mein Verzicht auf die Pingantwort hat nichts mit den Ports zu tun, 
sondern soll ggf. der "Verschleierung" der Anwesenheit dienen.

Allerdngs: Fall mehrere Netzteilnehmer mit identischer IP vorhanden 
sind, würden doch alle auf eine Ping-Afrage hin antworten (wollen), 
oder?

von Stefan F. (Gast)


Lesenswert?

Jeder Rechner hat innerhalb eines lokalen Netzes eine eindeutige IP 
Adresse. Auf einem Rechner können aber mehrere Server-Dienste laufen.

von Marco H. (damarco)


Lesenswert?

Was hat das mit dem Ping zu tun ? Ping ist ein eignender Dienst der von 
W5500 abgewickelt wird, genau so wie ARP.

Ich habe es doch oben erklärt ! Du kannst immer nur einen Client pro 
Socket abwickelten. Du kannst beim W5500 genau 8 Clients bzw. 8 offenen 
TCP/IP Verbindungen abwickeln. Als Server machst du eben 1-8 Sockets auf 
die auf dem Port z.Bsp 80 hören. Ist einer belegt nutzt der W5500 den 
nächsten, sind alle belegt wird der Connect abgewiesen.

: Bearbeitet durch User
von Hanns-Jürgen M. (yogy)


Lesenswert?

Ich glaube, mein Ansinnen ist völlig falsch verstanden worden.

1. Die Ping-Funktionalität möchte ich abschalten, um dadurch das 
"Entdecken" von Nodes zu erschweren.

2. Wenn die Pingfunktionalität abgeschaltet ist, so kam mir die Idee, 
könnte ich doch mehrere Nodes im Netz mit einer identischen IP-laufen 
lassen, die aber zur Unterscheidung unterschieldiche Ports benutzen.

ANderes gesagt: Kaffeemaschine, Waschmaschine, Kühlschrank haben alle 
die selbe, identische IP, sie unterscheiden sich nur in der Portnummer..

von Hanns-Jürgen M. (yogy)


Lesenswert?

Ach ja, natürlich wäre das nicht im Sinne des Erfinders, es geht mir 
auch nur um die Möglichekit.

von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> 2. Wenn die Pingfunktionalität abgeschaltet ist, so kam mir die Idee,
> könnte ich doch mehrere Nodes im Netz mit einer identischen IP-laufen
> lassen, die aber zur Unterscheidung unterschieldiche Ports benutzen.

Wie gesagt, die IP Adresse ist im lokalen Netz eindeutig. Anders 
funktioniert es nicht. Lies mal wie ARP funktioniert, dann wird Dir das 
auch klar.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> Hanns-Jürgen M. schrieb:
>> 2. Wenn die Pingfunktionalität abgeschaltet ist, so kam mir die Idee,
>> könnte ich doch mehrere Nodes im Netz mit einer identischen IP-laufen
>> lassen, die aber zur Unterscheidung unterschieldiche Ports benutzen.
>
> Wie gesagt, die IP Adresse ist im lokalen Netz eindeutig. Anders
> funktioniert es nicht. Lies mal wie ARP funktioniert, dann wird Dir das
> auch klar.

Danke, habe ich gemacht und verstanden.

von Marco H. (damarco)


Lesenswert?

Na hoffentlich, so wird auch klar das die wirkliche Kommunikation im 
Layer 2 stattfindet. Punkt zu Punkt per MAC.. Das ARP Table kann nur 
eine Adresse speichern. Sobald du eine andere IP was versendet muss der 
W5500 die MAC per ARP auflösen. Das verzögert bei UDP Verbindungen die 
response stark und deshalb habe ich damals mein eignendes Table 
aufgebaut und vor dem senden die Register des W5500 gesetzt.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo zusammen,

ich wollte keine neuen Thread aufmachen, falls notwendig, bitte Bescheid 
geben.

Nachdem die Kommunikation zwischen Client (PC mit kleiner VB.net 
Routine) und dem W5500 am Arduino DUE funktioniert, und ich das auch mit 
einem Arduino MEGA geschaffgt habe,

will ich das nun per UDP machen. Bitte keine Diskussion über UDP vs TCP, 
ich brauche Broadcast.

Der Server (W5500 mit Arduino) lauscht nun auf Broadcasts an einen 
festgekegten Port.

Auf dem PC werkelt wieder ein VB.net Progrämmchen... Ich selber habe von 
VB.net mehr oder weniger keine Ahnung...

Das VBnet-Progrämmchen schickt nach Tastendruck eine UDP-Broadcast 
Nachricht an die Teilnehmer im Subnet. Diese Nachricht wird auch vom 
Arduino richtig empfangen und decodiert und mit einer UDP Nachricht an 
den Client (Antwort also kein broadcast) benatwortet.

Nur der laufende UDP Receiver im VB-Net empfängt nur die eigene 
Broadcast-Nachricht, aber nicht die des Servers.

Ich habe nun den Server so programmiert, daß er sekündlich einen 
Nachricht aussendet (An den Client, kein Bradcast). Nur der Client 
(VBnet empfängt "nichts"

Das VB.net UDP-Epnfangsprogamm: (verkürzt)
1
            Dim UdpReceivingClient = New UdpClient(8820)
2
            UdpReceivingClient.EnableBroadcast = True
3
4
      '''' hier waere die Senderoutine 
5
6
            Label1.Text = "RECEIVING"
7
8
            endTime = Now.AddMilliseconds(5000)      'WARTEZEIT AUF ANTWORT  MAX
9
10
            Dim RemoteIpEndPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8820)
11
'ALTERNATIV, geht aber auch nicht: Dim RemoteIpEndPoint As IPEndPoint = New IPEndPoint("192.168.1.113", 8820)
12
13
'Das ist ein Beispiel für die IP-Adresse des Servers und die Portnummer
14
15
            While Now < endTime
16
                Application.DoEvents()
17
                If UdpReceivingClient.Available Then
18
                    endTime = Now
19
                End If
20
            End While
21
            If UdpReceivingClient.Available Then
22
23
                Dim Anz As Integer
24
                Anz = CInt(UdpReceivingClient.Available)  'Gibt Anzahl der Bytes zurueck
25
26
                idata = (UdpReceivingClient.Receive(RemoteIpEndPoint))
27
28
                Me.Refresh()
29
30
                For i = 0 To Anz - 1
31
                    If idata(i) < 16 Then
32
                        Label1.Text = Label1.Text + " $0" + Hex(idata(i))
33
                    Else
34
                        Label1.Text = Label1.Text + " $" + Hex(idata(i))
35
                    End If
36
                    Me.Refresh()
37
                Next
38
39
40
            End If
41
.....
42
43
            UdpReceivingClient.Close()

Auf der W5500 Seite ist UDP eingestellt, sonst koennte ich ja nicht 
empfangen. Das Starten des Sendes wird mit der gleichen Routine wie für 
TCP  vorgenommen, das protokoll wird nicht verändert. DIPR wird mit der 
Server-IP beschrieben. Dort dürfte das proebleme eher nicht liegen, 
oder?

Sehe ich vor lauter Bäumen den Waöd nicht mehr?

Danke und viele Grüße

Yogy




PS: Wie bekomme ich hier die rechtschreibprüfung aktiviert? Anleitung 
von Mozilla (rechte Maustaste) hilft nicht.. und meine Brille ist noch 
nicht fertig

von Stefan F. (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> PS: Wie bekomme ich hier die rechtschreibprüfung aktiviert? Anleitung
> von Mozilla (rechte Maustaste) hilft nicht.. und meine Brille ist noch
> nicht fertig

Du musst ein Wörterbuch als Firefox Extension installieren.
https://support.mozilla.org/de/kb/Rechtschreibpruefung-nutzen

von Hanns-Jürgen M. (yogy)


Lesenswert?

Stefanus F. schrieb:
> Hanns-Jürgen M. schrieb:
>> PS: Wie bekomme ich hier die rechtschreibprüfung aktiviert? Anleitung
>> von Mozilla (rechte Maustaste) hilft nicht.. und meine Brille ist noch
>> nicht fertig
>
> Du musst ein Wörterbuch als Firefox Extension installieren.
> https://support.mozilla.org/de/kb/Rechtschreibpruefung-nutzen

Ich habe ein Wörterbuch installiert, und diese Supportseite kenne ich, 
bringt aber nichts, da ich beim Clicken mit der re maustaste in einen 
mehrzeiligem  Eingabefeld im Kontextmenue bei mir nichts bezüglich 
Rechtschreibung erscheint.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ich hab's gerade mit einem frisch installierten Firefox ausprobiert. Die 
Rechtschreibkontrolle hat direkt nach der Installation des Wörterbuches 
funktioniert, ohne weitere Einstellungen.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Mag sein, denkbar wäre bei mir z.B. eine "Beeinflussung" durch andere 
AddOns:

NoScript
PrintFriendly
AdblockPlus
Video Downloadhelper
Tails Verification
Toggle Referrer
uMatrix (deaktiviert)

Ach ja, Wörterbuch: Deutsch (DE) Language Pack, letzte Aktualisierung 
26. Okt 2018, ist auch vorhanden.

Aber gut, daß mit der RS-Kontrolle ist nicht wirklich vordringlich.

von Hanns-Jürgen M. (yogy)


Lesenswert?

kurz zur UDP Geschichte: VB ist nicht das Probelem. Zwei VB.net PCs 
können miteinander über UDP Daten austauschen. Der Gehler liegt im W5500 
bzw. in der Ansteuerung, die offenbar falsch ist. Aber ich bin guter 
Hoffnung...

von Marco H. (damarco)


Lesenswert?

ich er weniger.. Du musst den W5500 Socket in den UDP Mode bringen...

Was man bei UDP noch beachten sollte ist das es keine Flusskontrolle 
gibt. Abhängig vom SPI Takt und Code schafft er nicht 100Mbit/s Trafic 
zu verarbeiten. Trotz Buffers, in dem die Pakete landen und du zusehen 
musst diesen schnell genug auszulesen. Sonst sind die Pakete weg...

von Hanns-Jürgen M. (yogy)


Lesenswert?

Ja, danke, alles soweit klar. Der W5500 kann die UDP-Nachrichten 
(Broadcast) von VBnet empfangen,
offenbar funktioniert das Rücksenden nicht richtig. Ich kann aktuell 
nach dem Beschreiben nicht die DIPR für den zug. Socket auslesen, bzw. 
nicht beschreiben. Das ist wohl ein Fehler meinerseits.

Aber zum Verständis mal folgende Frage (Die Applikation von WizNet ist 
da für mich unverständlich)

(https://wizwiki.net/wiki/doku.php?id=products:w5500:application:udp_function)

Zunächst beschreibe ich zum zugehörigen Sockel die DIPR Adresse, z.B. 
192.168.178.255 (255 als Broadcast) und die DPORT Nummer (funzt bei mir 
auch nicht, what the hell...) Dann baue ich den Nachrichtenbuffer 
zusammen, bestehend aus Source-IP,Source Port und Anzahl der 
nachfolgenden folgenden Nachrichtenbytes (insg. also 8 bytes) und dann 
die Nachricht (bei mir maximal 160 bytes). Diese kopiere ich in den 
TX-Buffger des Sockets und  gebe den Sendebefehl.

Es wird auch etwas ausgesendet (LEDs des Hubs blinken), aber es wird 
nicht empfangen (VB.net). Ich dene, es liegt an der (scheinbar) 
fehlenden DIPE, aber ich bin auf der Suche,m wo ich da meinen Bug 
verbaut habe.

(Die Selektion und das handshaking wird durch meine Nachrichtenstruktur 
bearbeitet)

von Hanns-Jürgen M. (yogy)


Lesenswert?

...DIPR/DPORT Problem gelöst, mit einigen weiteren Modifikationen klappt 
es nun "grob" mit dem erfolgreichen Aussenden der 
Broadcast-Nachrichten...

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.