¿Cómo puedo configurar un "proxy USB" para / dev / ttyUSB0 a través de la red?

14

Tengo un dispositivo bajo prueba (DUT) y mido su consumo de energía usando un Datalogger de Power Analyzer usando los datos de /dev/ttyUSB0.

El problema es que el DUT ahora está remotamente desde la estación de trabajo con la que solía recopilar datos, pero en la misma red, necesito usar una segunda PC que está directamente conectada a través de USB al Power Anlayzer como una especie de proxy USB y SSH para crear una especie de enlace simbólico en la máquina de medición del USB de la máquina "proxy".

ingrese la descripción de la imagen aquí

Dado el diagrama anterior, ¿cómo puede el 1 st PC el acceso /dev/ttyUSB0de la 2 ª PC que está conectado directamente, de manera que un programa de lectura de la corriente desde el 1 st PC no notará la diferencia?

Eduard Florinescu
fuente

Respuestas:

19

socat Podría funcionar aquí.

En la segunda PC, puede dejar socatescuchar datos /dev/ttyUSB0y enviarlos a un puerto TCP, por ejemplo:

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

Luego, en la primera PC, puede conectarse a la segunda PC con socat y proporcionar los datos en un pseudo terminal /dev/ttyVUSB0para su aplicación:

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

Esto no se prueba y socatadmite muchas opciones, por lo que puede ser necesario ajustar.

Flo Mismo
fuente
3
¡Gracias! Entorno de prueba en el contenedor acoplable en la computadora portátil -> Túnel SSH -> PC en sala limpia -> Programador AVR y registrador FTDI en sala limpia
Mark K Cowan
2

Puede usar una combinación de ser2nety socat. Por ejemplo, tengo un robot conectado a una frambuesa pi a través de un puerto serie. El raspberry pi está conectado a mi red local (equivalente a su segunda PC). Y mi computadora portátil está conectada a la misma red local (equivalente a su primera PC). Luego uso ser2net para reenviar el puerto serie a través de TCP desde la 2da PC, y creo un archivo de dispositivo serial proxy usando socaten la 1ra PC.

Esta configuración también puede funcionar para usted. Solución propuesta:

Paso 1: Instale el paquete ser2net en su 2da PC (siguiendo su diagrama)

sudo apt-get install ser2net

ser2net escucha un puerto TCP y puede canalizar datos hacia y desde un puerto serie a través del puerto TCP. Puede configurar para qué puertos serie desea crear "proxies" a través de su archivo de configuración /etc/ser2net.conf.

Paso 2: configurar ser2net en la 2da PC

Por ejemplo, si tiene un dispositivo conectado /dev/ttyACM0con velocidad de transmisión 115200y desea servirlo desde el puerto local 3333, puede agregar la siguiente línea a/etc/ser2net.conf

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

Una vez creado el archivo de configuración, inicie ser2net ejecutándose en la segunda PC:

ser2net

o (si ya se está ejecutando, simplemente reinícielo como se muestra a continuación)

/etc/init.d/ser2net restart

Una cosa importante aquí es la opción remctl. Permite que el lado del cliente (primera PC en su diagrama) se conecte al dispositivo y elija las opciones de conexión en serie libremente. Creo que de esta manera la comunicación en serie es completamente transparente desde la perspectiva del espacio de trabajo de recopilación de datos. Ver más detalles aquí .

Paso 3: configure el archivo del dispositivo serie proxy en la estación de trabajo de recopilación de datos (primera PC)

(si no tienes socat, entonces sudo apt-get install socat)

Finalmente, en un terminal en la primera PC, socatcreemos un puerto serie proxy que escuche desde el puerto tcp:

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

Dónde, en este ejemplo ip=<2nd-PC-IP-address>y port=3333(o lo que elija al configurar /etc/ser2net.confen la 2da PC).

Paso 4: Conéctese a MyProxySerialPort

Ahora debería poder abrir una conexión en serie normalmente al dispositivo ubicado en $HOME/MyProxySerialPortla primera PC.

Esta publicación de blog también tiene más información sobre esta configuración: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/

PsyKongroo
fuente
respuesta muy detallada +1
Eduard Florinescu
1

En los núcleos de Linux que usan un enlace simbólico desde / dev / bus / usb / BUS_ID / DEV_ID a / dev / char / MAJOR: ¡MENOR socat no puede abrir dichos dispositivos debido a un error IOCTL inapropiado!
Por lo tanto, este enfoque no parece funcionar directamente en dispositivos USB.

Probé usbip que es una implementación más cerca, pero sólo está soportado en los núcleos antiguos.

Como mi solución era sobre lectores de tarjetas conectados a través de pcsc-lite, había una mejor solución usando la variable de entorno para clientes libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

De esta manera, se puede especificar un socket de dominio unix diferente. Y este puede reenviarse al socket del lector de tarjetas en un host remoto usando socat :

Ejecute esto en el host para reemplazar el lector de tarjetas

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

ejecute esto en el host CARD_READER_HOST con el lector de tarjetas pcsc conectado

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr
UV
fuente
1
Hola y bienvenidos :) Esta es información interesante, pero no se relaciona con la pregunta /dev/ttyUSB0o con un analizador de potencia que no utiliza PCSCLITE. Si desea publicar esta información, sería mejor como una pregunta por separado. Se le permite y alienta a publicar preguntas sobre el tema para las cuales tiene una respuesta inmediata de seguimiento.
sourcejedi
3
Lo intenté y la información relevante fue que la respuesta propuesta ¡NO FUNCIONÓ! Creo que esta información requiere compartir. El resto realmente no es directamente relevante, pero ofrece un enfoque diferente para los problemas relacionados.
UV
¿Sería esto por el :personaje en el camino? La página de manual de socat, sección "ESPECIFICACIONES DE DIRECCIÓN", tiene un párrafo sobre cómo escapar de los caracteres (v1.5.0 en adelante).
David Knipe el
punto interesante, pero el proyecto ha sido enlatado, así que no hay forma de verificarlo más :(
UV