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
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.
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.
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.
Ob das stty der bestehenden Software mit einem pseudo tty funktioniert,
kannst du recht einfach ausprobieren. Die normalen X11 Terminals legen
eines an.
>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
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.
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.
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.
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