Verlustfreie Datenübertragung via Ethernet

Hallo,

ich verwende das Arduino Ethernet-Shield um Messwerte mit der GET-Methode an meinen Webserver zu übertragen. Das Ethernet-Shield ist an einer Wireless Bridge im Garten verbunden, da ich dort (noch) kein LAN-Kabel habe.

Um Übertragungsfehler zu vermeiden, werden die Messwerte zwischengespeichert und nicht übertragen, wenn client.connect("www.12345.de", 80) fehlschlägt. Das funktioniert auch so wie es sollte. Trotzdem kommt es fast täglich zu Lücken in meinen Aufzeichnungen: Der Arduino/ das Ethernet-Shield verbindet sich mit dem Webserver (client.connect() ist true) aber es werden keine Messwerte übertragen. Es scheint so, als ob die Verbindung während dem Übertragen abreißt!

Wenn ich die gleiche Abfrage mehrmals im Abstand von ca. 2 Sekunden mache, besteht das Problem nicht mehr. Dafür ist mein Traffic aber deutlich größer.

Wie am besten erkenne ich also, ob die Übertragung fehlgeschlagen ist? Oder ist das "Problem" schon bekannt?

Gruß

Hi, du könntest könntest mit deinen Daten eine Checksumme bilden. Schau mal nach CRC8 oder CRC16.
Die Checksumme wird beim Empfänger überprüft, wenn die Daten nicht gültig sind dann muss das Paket neu übertragen werden.

Desweiteren klingt es so, dass du das UDP Protokoll nutzt. Hierbei wird nicht festgestellt ob Daten verloren gehen. Wenn du anstatt UDP TCP nutzen würdest, wird überprüft ob Daten fehlerhaft sind und automatisch erneut verschickt.
Mehr Infos: hier oder bei Wikipedia oder sonstwo ,-)

UDP = best effort (also so gut wie möglich, so wies die Post macht )
TCP = garantierte Übertragung (Brief per einschreiben sozusagen)

Quelle: hier

-Jan-:
Wie am besten erkenne ich also, ob die Übertragung fehlgeschlagen ist? Oder ist das "Problem" schon bekannt?

HTTP-Statuscodes sind bekannt, seit die erste Webseite per HTTP im Internet übertragen wurden.

Dein Fehler besteht offenbar darin, dass Du etwas an einen Webserver "sendest", ohne danach den zurückgelieferten Statuscode des Servers zu lesen und auszuwerten, um ggf. im Fehlerfall die Verbindung nach einer kurzen Zeitspanne nochmals zu wiederholen.

Du müsstest also beim Senden per HTTP-Protokoll stetes prüfen:

  1. Kommt innerhalb einer Timeout-Zeit von z.B. 30 Sekunden überhaupt eine Serverantwort zurück?
  2. Ist der zurückgelieferte Server-Statuscode "200" für "OK" oder wird ein anderer Statuscode geliefert?