Forum: PC-Programmierung Linux dev loopback


von Werner (Gast)


Lesenswert?

Hallo,

ich möchte mit einer bestehende Software unter Linux, welche 
üblicherweise über eine einzutragende serielle Schnittstelle 
kommuniziert (etwa /dev/ttyS0), direkt auf der selben Maschine sprechen. 
Das andere Ende ist eine selbst zu schreibende Software in Python oder 
C. Gibt es eine Art Loopback-device, welches ich in beiden Programmen 
angeben kann so das die Daten von Programm A zu B gehen und umgekehrt?

Schöne Grüße
Werner

von Gerd E. (robberknight)


Lesenswert?

pseudo tty.

Oder Du verwendest socat.

von nada (Gast)


Lesenswert?


von Rolf M. (rmagnus)


Lesenswert?

nada schrieb:
> https://en.wikipedia.org/wiki/Named_pipe

Da dürften aber die Versuche des Programms, die Schnittstellenparameter 
(Baudrate und so) einzustellen, fehlschlagen. Man kann natürlich mal 
ausprobieren, ob es trotzdem weitermacht. Außerdem ist eine Named Pipe, 
soweit ich weiß, nicht bidirektional. Da müsste man eher einen unix 
domain socket nehmen.

von nada (Gast)


Lesenswert?

Rolf M. schrieb:
> Außerdem ist eine Named Pipe,
> soweit ich weiß, nicht bidirektional.

Wahrscheinlich richtig. Unter Linux können zwar beliebig viele Prozesse 
in den FIFO mit O_RDWR nutzen, aber vermutlich ist es dann reine 
Glückssache, ob man sein eigenes echo ausliest oder Nachrichten vom 
anderen Prozess.
Schnittstellenparamter aber sollte man besser extern mit stty tweaken, 
wenn es sein muss, denke ich. Das verkompliziert doch sonst nur unnötig 
ein Programm, das dazu eigentlich gar nicht gedacht ist.

von Rolf M. (rmagnus)


Lesenswert?

nada schrieb:
> Schnittstellenparamter aber sollte man besser extern mit stty tweaken,
> wenn es sein muss, denke ich. Das verkompliziert doch sonst nur unnötig
> ein Programm, das dazu eigentlich gar nicht gedacht ist.

Soweit ich verstanden habe, geht es hier aber genau um das umgekehrte: 
Ein Programm, das eigentlich für die serielle Schnittstelle gedacht ist, 
ohne eine solche zu betreiben.
Und da ist es nicht so unwahrscheinlich, dass das Programm versucht, die 
Schnittstellenparameter einzustellen und dann mit Fehlermeldung 
abbricht, wenn das nicht geht.

: Bearbeitet durch User
von Noch einer (Gast)


Lesenswert?

Ob das stty der bestehenden Software mit einem pseudo tty funktioniert, 
kannst du recht einfach ausprobieren. Die normalen X11 Terminals legen 
eines an.
1
$ tty
2
/dev/pts/0
3
$ stty -F /dev/pts/0
4
speed 38400 baud; line = 0;
5
eol = M-^?; eol2 = M-^?; swtch = M-^?;
6
ixany iutf8
7
$ stty -F /dev/pts/0 9600
8
$ stty -F /dev/pts/0
9
speed 9600 baud; line = 0;
10
eol = M-^?; eol2 = M-^?; swtch = M-^?;
11
ixany iutf8

von Werner (Gast)


Lesenswert?

>Ein Programm, das eigentlich für die serielle Schnittstelle gedacht ist,
>ohne eine solche zu betreiben.

Ja Rolf, so ist es.

Ich habe mit die pseudo TTYs inzwischen angesehen, allerdings werde ich 
da nicht so recht schlau draus; in Python gibts es pty.openpty(), dann 
erhalte ich die die beiden Handles eines neuen Pseudo-TTYs, aber was 
soll mir das nun bringen?

Konkret geht es um einen Geräteemuator für FHEM. Die (Pseudo-) 
Schnittstelle muss es schon geben, wenn FHEM startet (Autostart), und 
der Name muss bekannt sein. Andersum: Gibt es die Möglichkeit ein Gerät 
mit dem Namen "/dev/meinemulator" zu definieren, und so Daten hin- und 
herzuschicken?

Werner

von Daniel A. (daniel-a)


Lesenswert?

Womit willst du es denn kommunizieren lassen? Ein anderes Programm? Ein 
eigenes Program? Oder eine Console?

Die modernen pseudoterminals funktionieren grob gesagt, indem /dev/ptmx 
geöffnet wird, das ist dan das master device (ptm), und der Kernel 
erstellt dann automatisch ein slave device (pts) in /dev/pts/<nummer>. 
Befor man das das pts verwenden kann muss muss man dieses über das ptm 
mit einem ioctl freischalten. Es gibt einen weiteren ioctl um den Pfad 
des pts zu ermitteln. Diese ioctls haben in c funktionen welche diese 
astrahieren, nämlich grantpt, unlockpt, und ptsname.

Wenn du ein Programm hast, welches ein pts erstellt, und du willst 
diesem einen festen Namen geben, könntest du wenn du dieses erstellst 
zusätzlich noch einen symlink darauf erstellen.

Man könnte alternativ auch ein programm erstellen, welches das pts 
erstellt, öffnet, mit dup2() auf einen fixen filedescriptor legt, und 
dann das FHEM programm öffnet. Im FHEM programm könnte man dann 
/dev/fd/<nummer> oder /proc/self/fd/<nummer> als tty eintragen, wobei 
die nummer die ist, die man für den file descriptor gewählt hat.

Es gibt viele Programme, die ein pts erzeugen. Dazu gehören 
Terminalemulatoren, screen, ssh, etc. Deren pts kann man wie jedes tty 
mit dem tty kommando ermitteln. Das tty kommando schaut dafür nur den 
filedescriptor 0, stdin an.

: Bearbeitet durch User
von Werner (Gast)


Lesenswert?

Ich möchte mit einem eigenen Programm kommunizieren. So wie das klingt 
müsste ich mir ein (C-) Programm schreiben, welche vor FHEM im Autostart 
als Daemon gestartet wird, und dann zwei Geräte mit bestimmten Namen 
nach obigem Vorgehen erzeugt. Dann hätte ich /dev/meinshin und 
/dev/meinsher und würde im FHEM /dev/meinshin angeben, und in meinem 
Programm /dev/meinsher.

von Noch einer (Gast)


Lesenswert?

Du könntest es auch aus einem alten Programm wie dem rlogind kopieren.

Diese Generation war noch kompakt und übersichtlich aufgebaut. Rlogind 
hatte der Shell und allen Programmen vorgegaukelt, sie würden an einem 
realen vt100 Terminal an einer seriellen Schnittstelle hängen.

von Martin S. (strubi)


Angehängte Dateien:

Lesenswert?

Socat wurde doch schon genannt. Das ist die einfachste Methode. Siehe 
angehängtes Script..

von Werner (Gast)


Lesenswert?

Martin,

Danke, das sieht schon mal sehr vielverpsrechend aus. Allerdings kann 
ich den FHEM (das Ende welches eigentlich die echte serielle 
Schnittstelle erwartet) nicht zum Dialog überreden. Womöglich hat das 
mit den Rechten zu tun. Der FHEM Daemon läuft unter dem Benutzer "fhem". 
Am anderen Ende (ssh als Benutzr "pi") muss ich ein sudo vor das Minicom 
stellen, damit ich /tmp/virtualcom geöffnet bekomme. Kann jemand helfen?

Werner

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.