Jak skonfigurować „proxy USB” dla / dev / ttyUSB0 przez sieć?

14

Mam testowane urządzenie (DUT) i mierzę jego zużycie energii za pomocą rejestratora danych Power Analyzer na podstawie danych z /dev/ttyUSB0.

Problem polega na tym, że DUT jest teraz zdalnie ze stacji roboczej, z której korzystałem do zbierania danych, ale w tej samej sieci muszę użyć drugiego komputera, który jest bezpośrednio podłączony przez USB do Power Anlayzer jako swego rodzaju proxy USB i ssh aby stworzyć rodzaj symbolicznego łącza na maszynie pomiarowej USB maszyny „proxy”.

wprowadź opis zdjęcia tutaj

Biorąc powyższe pod uwagę schemat jak może 1 st PC dostęp /dev/ttyUSB0z 2 nd komputerze, który jest bezpośrednio podłączony, w taki sposób, że program czyta strumień od 1 st PC nie będzie zauważyć różnicę?

Eduard Florinescu
źródło

Odpowiedzi:

19

socat może tu pracować.

Na drugim komputerze możesz pozwolić na socatnasłuchiwanie danych /dev/ttyUSB0i podawać je do portu TCP, np .:

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

Następnie na 1. komputerze możesz połączyć się z 2. komputerem za pomocą socat i podać dane na pseudo terminalu /dev/ttyVUSB0dla swojej aplikacji:

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

Nie jest to testowane i socatobsługuje wiele opcji, więc może być konieczne dostosowanie.

FloHimself
źródło
3
Dzięki! Środowisko testowe w kontenerze dokera na laptopie -> tunel SSH -> komputer w pomieszczeniu czystym -> programator AVR i rejestrator FTDI w pomieszczeniu czystym
Mark K Cowan
2

Możesz użyć kombinacji ser2neti socat. Na przykład mam robota podłączonego do Raspberry Pi przez port szeregowy. Raspberry pi jest podłączony do mojej sieci lokalnej (odpowiednik drugiego komputera). Mój laptop jest podłączony do tej samej sieci lokalnej (odpowiednik pierwszego komputera). Następnie używam ser2net, aby przekierować port szeregowy przez TCP z 2. komputera i utworzyć plik urządzenia szeregowego proxy za pomocą socatna 1. komputerze.

Ta konfiguracja może również działać dla Ciebie. Proponowane rozwiązanie:

Krok 1: Zainstaluj pakiet ser2net na drugim komputerze (zgodnie ze schematem)

sudo apt-get install ser2net

Ser2net nasłuchuje na porcie TCP i jest w stanie przesyłać dane do i z portu szeregowego za pośrednictwem portu TCP. Możesz skonfigurować porty szeregowe, dla których chcesz utworzyć „proxy” za pomocą pliku konfiguracyjnego /etc/ser2net.conf.

Krok 2: Skonfiguruj ser2net na 2. komputerze

Na przykład, jeśli masz podłączone urządzenie /dev/ttyACM0z szybkością transmisji 115200i chcesz je obsługiwać z portu lokalnego hosta 3333, możesz dodać następujący wiersz do/etc/ser2net.conf

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

Po utworzeniu pliku konfiguracyjnego uruchom ser2net, uruchamiając go na drugim komputerze:

ser2net

lub (jeśli już działa, zrestartuj go jak poniżej)

/etc/init.d/ser2net restart

Jedną ważną rzeczą jest tutaj opcja remctl. Umożliwia stronie klienta (1. komputer na schemacie) połączenie się z urządzeniem i swobodne wybieranie opcji połączenia szeregowego. Myślę, że w ten sposób komunikacja szeregowa jest całkowicie przejrzysta z perspektywy obszaru roboczego gromadzenia danych. Zobacz więcej szczegółów tutaj .

Krok 3: Skonfiguruj plik urządzenia szeregowego proxy na stacji roboczej do gromadzenia danych (1. komputer)

(jeśli nie masz socat, to sudo apt-get install socat)

Na koniec w terminalu na 1. komputerze stwórzmy socatport szeregowy proxy, który będzie nasłuchiwał z portu tcp:

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

Gdzie, w tym przykładzie ip=<2nd-PC-IP-address>i port=3333(lub cokolwiek, co wybierzesz podczas konfiguracji /etc/ser2net.confna 2. komputerze).

Krok 4: Połącz się z MyProxySerialPort

Teraz powinieneś być w stanie normalnie otworzyć połączenie szeregowe z urządzeniem znajdującym się $HOME/MyProxySerialPortna 1. komputerze.

Ten post na blogu zawiera także więcej informacji na temat tej konfiguracji: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/

PsyKongroo
źródło
bardzo szczegółowa odpowiedź +1
Eduard Florinescu
1

W jądrach Linuksa, które używają dowiązania symbolicznego z / dev / bus / usb / BUS_ID / DEV_ID do / dev / char / MAJOR: MINOR socat nie może otworzyć takich urządzeń z powodu niewłaściwego błędu IOCTL!
Więc to podejście nie działa bezpośrednio na urządzeniach USB.

Próbowałem usbip, który jest bliższą implementacją, ale obsługiwany tylko w starszych jądrach.

Ponieważ moje rozwiązanie dotyczyło czytników kart podłączonych przez pcc-lite, było lepsze rozwiązanie wykorzystujące zmienną środowiskową dla klientów libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

W ten sposób można określić inne gniazdo domeny unix. I to można przesłać do gniazda czytnika kart na zdalnym hoście za pomocą socat :

Uruchom to na hoście, aby wymienić czytnik kart

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

uruchom to na hoście CARD_READER_HOST z podłączonym czytnikiem kart pcc

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr
UV
źródło
1
Witam i zapraszam :). Jest to interesująca informacja, ale nie dotyczy pytania /dev/ttyUSB0lub analizatora mocy, który nie korzysta z PCSCLITE. Jeśli chcesz opublikować te informacje, lepiej byłoby jako osobne pytanie. Masz prawo i zachęcasz do zamieszczania pytań na tematy, na które masz natychmiastową odpowiedź.
sourcejedi
3
Próbowałem i stosowna informacja była taka, że ​​proponowana odpowiedź NIE zadziałała! Myślę, że te informacje wymagają udostępniania. Reszta nie ma bezpośredniego znaczenia, ale oferuje inne podejście do powiązanych problemów.
UV
Czy to z powodu :postaci na ścieżce? Strona podręcznika socat, sekcja „SPECYFIKACJE ADRESOWE”, zawiera akapit o tym, jak unikać znaków (wer. 1.5.0).
David Knipe,
interesujący punkt, ale projekt został zakonserwowany, więc nie ma już możliwości, aby go sprawdzić :(
UV