Forum: PC-Programmierung [Linux] Virtuelle Serielle Schnittstelle und Konvertierung auf TCPIP-Socket


von Manfred (Gast)


Lesenswert?

Ich suche nach einer (Freeware-)Linux-Anwendung möglichst mit 
Source-Code oder einer Möglichkeit mit Linux-Hausmitteln (z.B. bash) dem 
System eine virtuelle Schnittstelle auf der einen Seite zur Verfügung 
stellen zu können und diese auf der anderen über TCPIP-Socket-Verbindung 
mit einem Hardware-Konverter verbinden zu können. Meine Internet-Suche 
diesbezüglich hat mir für Linux keinen Erfolg gebracht. com0com unter 
sourceforge scheint nur für Windows bestimmt zu sein. Gibt es etwas 
entsprechendes kostenlos auch für Linux?

Hintergrund ist folgender: Eine Anwendung, dessen Umprogrammierung 
kostspielig oder sogar unmöglich wäre, spricht einen Barcode-Scanner 
über serielle Schnittstelle an. Das Protokoll ist echtzeitunkritisch, 
sehr einfach und ohne Hardware-Handshake. Nun hat der Rechner, auf dem 
diese zum Laufen kommen wird aber nur eine einzige serielle 
Schnittstelle und die wird bereits durch eine andere, wesentlich 
aufwendigere Verbindung, blockiert. Eine Erweiterung ist 
bauformspezifisch nicht möglich. Die Lösung wäre eine entsprechende 
Proxy-Anwendung, die einen Konverter über Ethernet anbindet.

Hat jemand für mich eine Lösung?

von Sven P. (Gast)


Lesenswert?

socat oder dog. Oder ein USB-nach-Seriell-Konverter für 5 Euro von HAMA?

von Manfred (Gast)


Lesenswert?

Sven, danke. USB-Serial geht leider nicht, da der Hardware-Konverter 
verwendet werden muß. Der hat den physischen Com-Port und stellt selbst 
über Ethernet einen TCPIP-Socket zur Verfügung. Entweder als Listener 
oder als Client.
Socat klingt sehr interessant und ich werde versuchen mehr darüber zu 
erfahren. Beim googlen nach dog finde ich aber nichts brauchbares. Hast 
Du einen Link für mich zum Nachlesen?

Ich denke, socat kann eine Fragestellung lösen aber ich habe immer noch 
die nach der Bereitstellung eines virtuellen Ports, damit ich die 
fertige Anwendung damit verbinden lassen kann anstatt sich direkt mit 
/dev/ttyS0 zu verbinden. Wie sieht ein entsprechendes Beispiel aus?

(Ich bin noch Linux-Anfänger)

von Sven P. (Gast)


Lesenswert?

Naja, "dog" ist quasi eine Weiterentwicklung von "cat"... oder evtl. 
"war" eine Weiterentwicklung, ich finds auch nirgendwo mehr.

Als Ersatz für dein tty-Dingens reicht vermutlich schon eine einfache 
Pipe:
1
man mkfifo

von Manfred (Gast)


Lesenswert?

Habe ich das richtig verstanden, daß ich mit mkfifo() z.B. mit 
pathname="/dev/ttyS99" eine "virtuelle Schnittstelle" für meine 
Anwendung zur Verfügung stellen kann, die ich dann mit socat "anzapfen" 
kann? Also die eine Seite von socat auf "device" und die andere auf "TCP 
socket" einstellen? Diese Lösung klingt für mich wirklich gut und 
einfach, wenn es wirklich so geht.

Ist mkfifo auch als command line tool verfügbar oder muß ich den Aufruf 
in meine eigene Anwendung mit aufnehmen? Und wie bekommt man eine solche 
als Device erscheinende Pipe-Datei wieder weg? Mit dem Ende meiner 
Anwendung als Prozeß?

Worin unterscheiden sich mkfifo und mknod? Beides scheint FIFO's in 
ähnlicher Weise erzeugen zu können.

von Manfred (Gast)


Lesenswert?

Und gibt es keine Probleme, wenn die Anwendung sich mit 
Lese-Schreib-Zugriff mit /dev/tty99 verbindet? Wie können Senden und 
Empfangen dann mit socat auseinander gehalten werden? Eine FIFO ist 
scheinbar nicht ausreichend, es wird eine für jede Datenrichtung 
benötigt. Da gibt es aber das Problem, daß die Anwendung die 
bidirektionale Kommunikation mit nur einem Device-Namen aufbaut.

von Manfred (Gast)


Lesenswert?

Ich habe nun in den Manual-pages von socat folgendes gelesen:
1
PTY
2
  Generates a pseudo terminal (pty) and uses its master side.
3
  Another process may open the pty's slave side using it like
4
  a serial line or terminal.
Das klingt so, als wenn es meine Frage nach einer virtuellen seriellen 
Schnittstelle beantworten könnte. Aber die Frage lautet nun: Wie geht 
das, die "pty's slave side" nutzen? Entsteht vielleicht ein Device-File 
/dev/ptyXX, das man dann anstatt eines /dev/ttyS99 verwenden könnte? Und 
wenn das so ist, wie kann man den Namen vorherbestimmen?

Sven, hast Du socat selbst schon einmal verwendet und hast damit 
vielleicht auch eigene Erfahrungen? Die würden mich interessieren. Meine 
Lösung muß nämlich, einmal getestet und vielfach implementiert, die 
nächsten ca 20 Jahre in produktiver Industrieumgebung zuverlässig 
funktionieren.

von Sven P. (Gast)


Lesenswert?

Manfred wrote:
> Ich habe nun in den Manual-pages von socat folgendes gelesen:
>
1
PTY
2
>   Generates a pseudo terminal (pty) and uses its master side.
3
>   Another process may open the pty's slave side using it like
4
>   a serial line or terminal.
> Das klingt so, als wenn es meine Frage nach einer virtuellen seriellen
> Schnittstelle beantworten könnte.
Jubb.

> Aber die Frage lautet nun: Wie geht
> das, die "pty's slave side" nutzen?
Naja, wie du schon erkannt hast, hat eine normale PIPE zwei Enden: In 
eines schreibste rein (Schreibzugriff), und das genau solange, wie am 
anderen Ende jemand rausliest (Lesezugriff).

Ein PTY hat dagegen quasi vier Enden, zwei "innen" (Master) und zwei 
"außen" (Slave). Normalerweise werden die beiden inneren Enden vom 
Gerätetreiber bedient und die äußeren beiden siehst du dann als 
Gerätedatei in /dev.

In diesem Fall bedient SOCAT die inneren beiden Enden (z.B. durch 
Weiterleitung) und konstruiert dir eine Gerätedatei (/dev/pty..) für die 
äußeren beiden Enden.

> Entsteht vielleicht ein Device-File
> /dev/ptyXX, das man dann anstatt eines /dev/ttyS99 verwenden könnte?
Ja, in /dev/pty...

> Und wenn das so ist, wie kann man den Namen vorherbestimmen?
Vorbestimmen garnicht, aber SOCAT kann dir zusätzlich einen Link 
konstruieren, der auf die Gerätedatei zeigt. Dessen Namen kannste dann 
angeben.

> Sven, hast Du socat selbst schon einmal verwendet und hast damit
> vielleicht auch eigene Erfahrungen? Die würden mich interessieren.
Jo, lieb bislang immer recht problemlos -- genaueres Studium der 
Anleitung natürlich vorausgesetzt. Gerade der Fork- und Reuse-Kram ist 
wichtig, damit SOCAT nicht nach der ersten erfolgreichen Verbindung 
abschaltet.


> Meine
> Lösung muß nämlich, einmal getestet und vielfach implementiert, die
> nächsten ca 20 Jahre in produktiver Industrieumgebung zuverlässig
> funktionieren.
Testen kannst nur du sie.

Vielfache Implementierung gestaltet sich relativ simpel, du musst dich 
nur an die GNU General Public License halten, unter der SOCAT vertrieben 
wird.

Inwieweit SOCAT funktioniert, wirst du dann selbst beurteilen müssen.

Und in 20 Jahren wirst du mit SOCAT auch keine Probleme kriegen. Der 
Entwickler wird SOCAT schon so bald nicht aufgeben. Wenns dann doch hart 
auf hart kommt, hast du in jedem Fall die Quelltexte des Programms, 
sodass du selbst Fehler beheben (lassen) kannst und das Programm auf 
andere Betriebssysteme portieren kannst.
Im Gegensatz zu kommerziellen Programmen hast du halt was Brauchbares in 
den Händen.

Literatur:
http://www.dest-unreach.org/socat/doc/socat-ttyovertcp.txt
http://lists.infodrom.org/linux-stammtisch/2006/0680.html

von Michael H. (mah)


Lesenswert?

http://ser2net.sourceforge.net/ hat mir schon mal geholfen

-Michael

von Manfred (Gast)


Lesenswert?

Vielen Dank an alle, die mir Tips gegeben haben. Auch für die Hinweise 
auf fork, reuse, die zwei Enden innen und außen und die GNU 
Lizenzbedingungen; muß ich mir für meine Zwecke noch einmal genau 
durchlesen, ob das bereits abgedeckt ist oder ob ich noch individuell 
anfragen muß.

socat ist tatsächlich die Antwort auf alle meine Fragen zum Thema.

von Manfred (Gast)


Lesenswert?

socat ist echt gut. Habe ich außer unter Fedora Linux sogar schon 
unter cygwin compiliert und gebunden. Einfach nur ausgepackt, 
*./configure* aufgerufen und danach make und schon war das Ergebnis 
einsatzbereit. Das mit pty für bidirektionale Kommunikation 
funktioniert wie gewünscht. - Auch wenn ich das jetzt doch nicht mehr 
brauche, zum Testen und Zusammenführen von Log-Dateien sowie zum 
"Füttern" meiner pipe, mit der mein Tool "von außen" im laufenden 
Betrieb gesteuert werden kann, werde ich socat weiterhin verwenden 
können.
Nochmals danke für den Tip mit socat.
inetd bzwl xinetd werde ich demnächst auch noch kennenlernen, damit 
kann man wohl auch einen Teil dessen tun, was socat auch kann. Hat damit 
vielleicht auch schon jemand Erfahrungen gesammelt?

von yalu (Gast)


Lesenswert?

[x]inetd ist etwas anderes. Es kommuniziert nicht selbst, sondern
startet bei Verbindungsanfragen aus dem Netzwerk andere Programme, die
dann die eigentliche Kommunikation übernehmen. Diese anderen Programme
sind typischerweise Server für die einzelnen Netzwerkprotokolle, also
bspw. FTP- oder Telnet-Server. Für spezielle Anwendungen könnte solch
ein Server auch socat bzw. ein anderes Programm, dem mit Hilfe von socat
eine Socket-Schnittstelle verpasst wurde, sein.

  http://de.wikipedia.org/wiki/Inetd
  http://www.xinetd.org/

von Manfred (Gast)


Lesenswert?

Danke für die Info. Scheint sich ja dann ganz gut zu ergänzen, um nicht 
alle Prozesse gleichzeitig laufen lassen zu müssen sondern nur nach 
Bedarf jeweils zu starten - von einem einzigen Prozeß ausgehend.

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.