Come posso impostare un "proxy USB" per / dev / ttyUSB0 sulla rete?


14

Ho un dispositivo in prova (DUT) e misuro il suo consumo di energia utilizzando un registratore di dati Power Analyzer utilizzando i dati di /dev/ttyUSB0.

Il problema è che il DUT è ora in remoto dalla workstation con cui ho usato per raccogliere i dati, ma nella stessa rete, ho bisogno di usare un secondo PC che è direttamente collegato via USB a Power Anlayzer come una sorta di proxy USB e SSH per creare una sorta di collegamento simbolico sulla macchina di misura dell'USB della macchina "proxy".

inserisci qui la descrizione dell'immagine

Dato il diagramma sopra come può il 1 ° PC l'accesso /dev/ttyUSB0del 2 ° PC che è direttamente collegato, in modo che un programma di lettura del flusso dal 1 ° PC non notare la differenza?

Risposte:


19

socat potrebbe funzionare qui.

Sul 2 ° PC è possibile consentire l' socatascolto dei dati /dev/ttyUSB0e servirli su una porta tcp, ad esempio:

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

Quindi sul primo PC è possibile connettersi al secondo PC con socat e fornire i dati su uno pseudo terminale /dev/ttyVUSB0per la propria applicazione:

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

Questo non è testato e socatsupporta molte opzioni, quindi potrebbe essere necessario modificare.


3
Grazie! Ambiente di prova nel contenitore docker su laptop -> Tunnel SSH -> PC in clean room -> Programmatore AVR e logger FTDI in clean room
Mark K Cowan

2

È possibile utilizzare una combinazione di ser2nete socat. Ad esempio, ho un robot collegato a un Raspberry Pi attraverso una porta seriale. Il raspberry pi è collegato alla mia rete locale (equivalente al tuo secondo PC). E il mio laptop è collegato alla stessa rete locale (equivalente al tuo primo PC). Quindi uso ser2net per inoltrare la porta seriale via TCP dal 2 ° PC e creare un file proxy seriale del dispositivo usando socatsul 1 ° PC.

Questa configurazione potrebbe funzionare anche per te. La soluzione proposta:

Passaggio 1: installa il pacchetto ser2net sul secondo PC (seguendo lo schema)

sudo apt-get install ser2net

ser2net ascolta una porta TCP ed è in grado di reindirizzare i dati da e verso una porta seriale tramite la porta TCP. È possibile impostare per quali porte seriali si desidera creare "proxy" tramite il suo file di configurazione /etc/ser2net.conf.

Passaggio 2: configurare ser2net nel 2 ° PC

Ad esempio, se si dispone di un dispositivo collegato /dev/ttyACM0con baudrate 115200e si desidera servirlo dalla porta 3333 di localhost, è possibile aggiungere la seguente riga a/etc/ser2net.conf

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

Dopo aver creato il file di configurazione, quindi avviare ser2net eseguendo sul secondo PC:

ser2net

oppure (se è già in esecuzione, riavviarlo come di seguito)

/etc/init.d/ser2net restart

Una cosa importante qui è l'opzione remctl. Consente al lato client (1 ° PC nel diagramma) di connettersi al dispositivo e scegliere liberamente le opzioni di connessione seriale. Penso che in questo modo la comunicazione seriale sia completamente trasparente dal punto di vista dell'area di lavoro della raccolta dati. Vedi maggiori dettagli qui .

Passaggio 3: impostare il file del dispositivo seriale proxy sulla workstation di raccolta dati (1 ° PC)

(se non hai socat, quindi sudo apt-get install socat)

Infine, in un terminale sul 1 ° PC, socatcreiamo una porta seriale proxy che ascolterà dalla porta tcp:

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

Dove, in questo esempio ip=<2nd-PC-IP-address>e port=3333(o qualunque cosa tu scelga durante l'installazione /etc/ser2net.confsul 2 ° PC).

Passaggio 4: connettersi a MyProxySerialPort

Ora dovresti essere in grado di aprire normalmente una connessione seriale al dispositivo situato $HOME/MyProxySerialPortsul 1 ° PC.

Questo post sul blog contiene anche ulteriori informazioni su questa configurazione: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/


risposta molto dettagliata +1
Eduard Florinescu,

1

Nei kernel Linux che usano un collegamento simbolico da / dev / bus / usb / BUS_ID / DEV_ID a / dev / char / MAJOR: MINOR socat non può aprire tali dispositivi a causa di un errore IOCTL inappropriato!
Quindi questo approccio non sembra funzionare direttamente sui dispositivi USB.

Ho provato usbip che è un'implementazione più stretta ma supportato solo su kernel più vecchi.

Poiché la mia soluzione riguardava i lettori di schede collegati tramite PCC-Lite, c'era una soluzione migliore che utilizzava la variabile di ambiente per i client libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

In questo modo è possibile specificare un socket di dominio unix diverso. E questo può essere inoltrato alla presa del lettore di schede su un host remoto usando socat :

Esegui questo sull'host per sostituire il lettore di schede

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

eseguirlo sull'host CARD_READER_HOST con il lettore di schede pcc collegato

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr

1
Ciao e benvenuto :). Queste sono informazioni interessanti ma non si riferiscono alla domanda /dev/ttyUSB0o ad un analizzatore di potenza che non utilizza PCSCLITE. Se desideri pubblicare queste informazioni, sarebbe meglio come una domanda separata. Sei autorizzato e incoraggiato a pubblicare domande sull'argomento per le quali hai una risposta immediata di follow-on.
sourcejedi

3
L'ho provato e le informazioni pertinenti erano che la risposta proposta NON ha funzionato! Penso che queste informazioni richiedano la condivisione. Il resto non è veramente direttamente pertinente ma offre un approccio diverso per i problemi correlati.
UV

Questo sarebbe dovuto al :personaggio nel percorso? La pagina man socat, sezione "SPECIFICHE INDIRIZZO", contiene un paragrafo su come sfuggire ai caratteri (dalla v1.5.0 in poi).
David Knipe,

punto interessante, ma il progetto è stato inscatolato, quindi non c'è più modo di controllarlo :(
UV
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.