Messwerte über TCP senden
-
Hallo,
ich muss zur zeit folgende Aufgabe bewältigen: Ein System nimmt Messdaten auf und ermittelt daraus einen Füllstand (0-100%). Diese Daten sollen nun via WLAN an einen anderen PC geschickt werden. über diesen PC wird der Füllstand in analoger Form ausgegeben (0-5V).
ich habe jetzt ein paar fragen zur bertragung.
Bei der Analyse-maschine verwende ich java unter linux und auf der Empfangseinheit mit der Hardware verwende ich c unter windows.
Folgende Lösung habe ich bereits implementiert, leider ist diese nicht so gut geeignet.
ich speichere den Füllstand als short ab. und sende danach jeweils das Highbyte und das Lowbyte.
auf der Empfangseinheit empfange ich mit folgendem Stück code;
unsigned short int buf = 0; unsigned short int val = 0; recv(connSock,&buf,sizeof(unsigned short int),0): val=buf; recv(connSock,&buf,sizeof(unsigned short int),0): val = val + 256*buf;val enthält nun den korrekten Wert der ausgegeben werden kann.
Das Problem dabei ist folgendes. Von zeit zu zeit treten empfangsfehler aus und ich würde gerne diese übertragung absichern. oder gleich auf ein einfacheres Übertragungsmodell umsteigen (das wär mir am liebsten). Leider habe ich keinen Ansatz, wie ich das Effizienter lösen kann (1x empfangen). Meine idee wäre ByteBuffer unter java. dann daraus ein byte array machen und das ganze array senden.
aber da ich ein c-beginner bin, habe ich keine plan, wie ich auf der gegenseite wieder vernünftige Werte bekomme!
Könnt ihr mir bitte helfen?
Habt ihr bessere Ideen?
Danke!mfg
flo
-
Socket-Programmierung unter C ohne anständige Library ist sehr mühsam. Das hier zu erklären dürfte den Rahmen sprengen. Suche einfach mal nach einer WinSock-Einführung. Es gibt da einiges interessantes im Netz.
Ansonsten möchte ich Dir den IVY-Softwarebus ans Herz legen. Der ist genau für Deine Anwendung gemacht. Die Library gobt es für alle möglichen Sprachen, steht unter der LGPL und ist somit auch kommerziell nutzbar, bietet Monitoring-Lösungen und... funktioniert.
Ivy basiert auf dem Versenden von ASCII-Meldungen per "broadcast"; es gibt also keinen Server. Du initialisierst die Verbindung, und registrierst dich mittels einer "regulare expression" für bestimmte Meldungen. Dann rufst Du in main() die IvyLoop() auf, die dann einem Callback den erhalt der gewünschsten Meldungen mitteilt. Alles was Sockets betrifft wird versteckt.
freshmeat.net schrieb:
Ivy is a simple protocol and a set of libraries that allows applications to broadcast information through text messages, with a subscription mechanism based on regular expressions.
-
hey danke!
werde ich nächste woche gleich mal testen!
danke für den tipp.
mfg flo
-
Hihi,
ich habe das Problem, dass ich nicht wirklich weiß, wie ich die Daten von einer IP lesen kann. Auch in meinem Fall stehen an der IP Daten an, die ich einfach nur lesen will.
Kannst du mir weiterhelfen. Ich habe leider mit der Socket-Programmierung wenig Erfahrung. Vielleicht kannst du mir die wichtigsten Sachen anhand eines Codebsp. erklären?viele liebe Grüße
Andrea
-
Hallo andrea19791,
Die Verwendung von WinSock ist nicht unbedingt einfach. Wenn man keine Library verwendet, die einem die Arbeit erleichtert, dann gibt es einige Details zu beachten. Gerade wenn dann noch eine GUI (z.B. mit der MFC) eingesetzt werden soll.
Schau Dir mal das Tutorial hier an: http://www.c-worker.ch/tuts.html
Wenn's auch in Englisch sein darf, dann ist http://www.codeproject.com eine gute Quelle von Information und Code-Schnipseln.
Ich entwickle eigentlich meistens "cross-platform", sodass ich die API mit einer Library gekapselt habe. So läuft das Programm unter Unix und WIndows. Ein Beispiel wäre SAL (http://www.garret.ru/~knizhnik/sal.html)