Wie kann ich einen „USB-Proxy“ für / dev / ttyUSB0 über das Netzwerk einrichten?

13

Ich habe ein zu testendes Gerät (DUT) und messe dessen Stromverbrauch mit einem Power Analyzer-Datenlogger unter Verwendung der Daten von /dev/ttyUSB0.

Das Problem ist, dass der Prüfling jetzt von der Workstation entfernt ist, mit der ich Daten gesammelt habe, aber im selben Netzwerk muss ein zweiter PC verwendet werden, der direkt über USB mit dem Power Anlayzer als eine Art USB-Proxy und SSH verbunden ist eine Art symbolische Verknüpfung auf der Messmaschine des USB-Geräts der "Proxy" -Maschine zu erstellen.

Bildbeschreibung hier eingeben

In Anbetracht der obigen Diagramm wie kann die 1 st PC Zugang /dev/ttyUSB0des 2 nd PC , der direkt verbunden ist, in einer Weise , dass ein Programm , um den Strom aus dem 1 Lesen st PC nicht den Unterschied bemerken?

Eduard Florinescu
quelle

Antworten:

18

socat könnte hier funktionieren.

Auf dem 2. PC können Sie socatDaten abhören lassen /dev/ttyUSB0und an einen TCP-Port liefern , zB:

socat /dev/ttyUSB0,raw,echo=0 tcp-listen:8888,reuseaddr

Auf dem 1. PC können Sie sich dann mit socat mit dem 2. PC verbinden und die Daten auf einem Pseudoterminal /dev/ttyVUSB0für Ihre Anwendung bereitstellen:

socat PTY,raw,echo=0,link=/dev/ttyVUSB0 tcp:<ip_of_pc2>:8888

Dies wird nicht getestet und socatunterstützt viele Optionen, so dass möglicherweise Anpassungen erforderlich sind.

FloHimself
quelle
3
Vielen Dank! Testumgebung in Docker-Container auf Laptop -> SSH-Tunnel -> PC im Reinraum -> AVR-Programmierer und FTDI-Logger im Reinraum
Mark K Cowan
2

Sie können eine Kombination aus ser2netund verwenden socat. Ich habe zum Beispiel einen Roboter, der über eine serielle Schnittstelle mit einem Himbeer-Pi verbunden ist. Der Himbeer-Pi ist mit meinem lokalen Netzwerk verbunden (entspricht Ihrem 2. PC). Mein Laptop ist mit demselben lokalen Netzwerk verbunden (entspricht Ihrem ersten PC). Dann verwende ich ser2net, um die serielle Schnittstelle über TCP vom 2. PC weiterzuleiten und eine Proxy-Datei für serielle Geräte mit socatdem 1. PC zu erstellen .

Dieses Setup funktioniert möglicherweise auch für Sie. Vorgeschlagene Lösung:

Schritt 1: Installieren Sie das ser2net-Paket auf Ihrem 2. PC (gemäß Ihrem Diagramm)

sudo apt-get install ser2net

ser2net lauscht an einem TCP-Port und kann über den TCP-Port Daten von und zu einem seriellen Port leiten. Sie können über die Konfigurationsdatei festlegen, für welche seriellen Ports Sie "Proxies" erstellen möchten /etc/ser2net.conf.

Schritt 2: ser2net im 2. PC konfigurieren

Wenn Sie beispielsweise ein Gerät /dev/ttyACM0mit Baudrate angeschlossen haben 115200und es über den lokalen Host- Port 3333 bedienen möchten, können Sie die folgende Zeile hinzufügen/etc/ser2net.conf

3333:raw:0:/dev/ttyACM0:115200,remctl

Nachdem Sie die Konfigurationsdatei erstellt haben, starten Sie ser2net entweder auf dem zweiten PC:

ser2net

oder (wenn es bereits läuft, dann starte es einfach neu wie unten)

/etc/init.d/ser2net restart

Eine wichtige Sache ist hier die Option remctl. Hiermit kann der Client (der erste PC in Ihrem Diagramm) eine Verbindung zum Gerät herstellen und die seriellen Verbindungsoptionen frei wählen. Ich denke, auf diese Weise ist die serielle Kommunikation aus Sicht des Datenerfassungsarbeitsbereichs vollständig transparent. Sehen Sie hier weitere Informationen .

Schritt 3: Einrichten der Datei für das serielle Proxy-Gerät auf der Datenerfassungs-Workstation (1. PC)

(wenn du kein socat hast, dann sudo apt-get install socat)

socatErstellen Sie schließlich in einem Terminal auf dem ersten PC einen seriellen Proxy-Port, der vom TCP-Port abhört:

socat pty,link=$HOME/MyProxySerialPort,waitslave tcp:$ip:$port,forever,reuseaddr,keepalive

Wo, in diesem Beispiel ip=<2nd-PC-IP-address>und port=3333(oder was auch immer Sie beim Einrichten /etc/ser2net.confauf dem 2. PC gewählt haben).

Schritt 4: Stellen Sie eine Verbindung zu MyProxySerialPort her

Jetzt sollten Sie in der Lage sein, eine serielle Verbindung zu dem Gerät $HOME/MyProxySerialPortauf dem ersten PC herzustellen .

Dieser Blog-Beitrag enthält auch weitere Informationen zu diesem Setup: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/

PsyKongroo
quelle
sehr detaillierte Antwort +1
Eduard Florinescu
1

In Linux-Kerneln, die eine symbolische Verbindung von / dev / bus / usb / BUS_ID / DEV_ID zu / dev / char / MAJOR verwenden: MINOR socat kann solche Geräte aufgrund eines unangemessenen IOCTL-Fehlers nicht öffnen!
Dieser Ansatz scheint also nicht direkt auf USB-Geräten zu funktionieren.

Ich habe usbip ausprobiert, was eine engere Implementierung darstellt, aber nur auf älteren Kerneln unterstützt wird.

Da es sich bei meiner Lösung um Kartenleser handelte, die über pcsc-lite verbunden waren, gab es eine bessere Lösung, die die Umgebungsvariable für libpcsclite- Clients verwendete.

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

Auf diese Weise kann ein anderer Unix-Domain-Socket angegeben werden. Und dieser kann mit socat an die Kartenleser-Buchse eines Remote-Hosts weitergeleitet werden :

Führen Sie dies auf dem Host aus, um den Kartenleser zu ersetzen

socat tcp:$CARD_READER_HOST:8888 UNIX-LISTEN:$PCSCLITE_CSOCK_NAME,fork

Führen Sie dies auf dem CARD_READER_HOST-Host mit angeschlossenem PC-Kartenleser aus

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr
UV
quelle
1
Hallo und herzlich willkommen :). Dies ist eine interessante Information, die sich jedoch nicht auf die Frage nach /dev/ttyUSB0oder einen Leistungsanalysator bezieht, der kein PCSCLITE verwendet. Wenn Sie diese Informationen veröffentlichen möchten, ist es besser, wenn Sie eine separate Frage stellen. Sie dürfen und werden ermutigt, themenbezogene Fragen zu stellen, auf die Sie umgehend eine Antwort erhalten.
Sourcejedi
3
Ich habe es versucht und die relevante Information war, dass die vorgeschlagene Antwort NICHT funktioniert hat! Ich denke, diese Informationen müssen geteilt werden. Der Rest ist nicht direkt relevant, bietet aber einen anderen Ansatz für verwandte Probleme.
UV
Wäre das wegen des :Charakters im Pfad? Die socat-Manpage, Abschnitt "ADRESSEN-SPEZIFIKATIONEN", enthält einen Absatz über das Escape von Zeichen (ab v1.5.0).
David Knipe
Interessanter Punkt, aber das Projekt wurde eingemacht, so dass es nicht mehr überprüft werden kann :(
UV