Como posso configurar um "proxy USB" para / dev / ttyUSB0 na rede?


14

Eu tenho um dispositivo em teste (DUT) e meço seu uso de energia usando um Datalogger do Power Analyzer usando os dados de /dev/ttyUSB0.

O problema é que o DUT agora está remotamente da estação de trabalho com a qual eu costumava coletar dados, mas na mesma rede, preciso usar um segundo PC que esteja diretamente conectado via USB ao Power Anlayzer como uma espécie de proxy USB e ssh para criar um tipo de link simbólico na máquina de medição do USB da máquina "proxy".

insira a descrição da imagem aqui

Dado o diagrama acima, como o PC pode acessar /dev/ttyUSB0o PC diretamente conectado, de forma que um programa que esteja lendo o fluxo do PC não notará a diferença?

Respostas:


19

socat pode funcionar aqui.

No 2º PC, você pode socatouvir dados /dev/ttyUSB0e servi-los em uma porta tcp, por exemplo:

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

Em seguida, no 1º PC, você pode conectar-se ao 2º PC com socat e fornecer os dados em um pseudo terminal /dev/ttyVUSB0 para sua aplicação:

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

Isso não é testado e socatsuporta muitas opções, portanto, pode ser necessário fazer ajustes.


3
Obrigado! Ambiente de teste no recipiente janela de encaixe no laptop -> túnel SSH -> PC no quarto limpo -> AVR programador e FTDI logger no quarto limpo
Mark K Cowan

2

Você pode usar uma combinação de ser2nete socat. Por exemplo, eu tenho um robô conectado a um raspberry pi através de uma porta serial. O raspberry pi está conectado à minha rede local (equivalente ao seu segundo PC). E meu laptop está conectado à mesma rede local (equivalente ao seu primeiro PC). Então eu uso o ser2net para encaminhar a porta serial via TCP a partir do 2º PC e criar um arquivo de dispositivo serial proxy usando socatno 1º PC.

Essa configuração também pode funcionar para você. Solução proposta:

Etapa 1: Instale o pacote ser2net no seu 2º PC (seguindo o seu diagrama)

sudo apt-get install ser2net

O ser2net escuta uma porta TCP e pode canalizar dados de e para uma porta serial via porta TCP. Você pode configurar para quais portas seriais deseja criar "proxies" através do arquivo de configuração/etc/ser2net.conf .

Etapa 2: configurar o ser2net no 2º PC

Por exemplo, se você tem um dispositivo conectado /dev/ttyACM0com baudrate 115200e deseja atendê-lo da porta 3333 do host local, é possível adicionar a seguinte linha a/etc/ser2net.conf

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

Após criar o arquivo de configuração, inicie o ser2net executando o segundo PC:

ser2net

ou (se já estiver em execução, basta reiniciá-lo como abaixo)

/etc/init.d/ser2net restart

Uma coisa importante aqui é a opção remctl. Ele permite que o lado do cliente (1º PC no seu diagrama) se conecte ao dispositivo e escolha as opções de conexão serial livremente. Penso que desta maneira a comunicação serial é completamente transparente da perspectiva do espaço de trabalho da coleta de dados. Vejo mais detalhes aqui .

Etapa 3: configurar o arquivo de dispositivo serial proxy na estação de trabalho de coleta de dados (1º PC)

(se você não tem socat, então sudo apt-get install socat )

Finalmente, em um terminal no 1º PC, vamos socatcriar uma porta serial proxy que escutará da porta tcp:

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

Onde, neste exemplo ip=<2nd-PC-IP-address>eport=3333 (ou o que você escolher ao instalar /etc/ser2net.confno 2º PC).

Etapa 4: conectar-se ao MyProxySerialPort

Agora você deve conseguir abrir uma conexão serial normalmente com o dispositivo localizado no $HOME/MyProxySerialPort1º PC.

Esta publicação no blog também tem mais algumas informações sobre essa configuração: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/


resposta muito detalhada +1
Eduard Florinescu

1

Nos kernels do linux que estão usando um link simbólico de / dev / bus / usb / BUS_ID / DEV_ID para / dev / char / MAJOR: MINOR SOCAT não pode abrir esses dispositivos devido a um erro IOCTL inadequado!
Portanto, essa abordagem não parece funcionar diretamente em dispositivos USB.

Eu tentei o usbip, que é uma implementação mais próxima, mas suportada apenas em kernels antigos.

Como minha solução era sobre leitores de cartão conectados via pcsc-lite, havia uma solução melhor usando a variável de ambiente para clientes libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

Dessa forma, um soquete de domínio unix diferente pode ser especificado. E este pode ser encaminhado para o soquete do leitor de cartão em um host remoto usando socat :

Execute isso no host para substituir o leitor de cartão

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

execute isso no host CARD_READER_HOST com o leitor de cartão pcsc conectado

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

1
Olá e bem-vindo :). Esta é uma informação interessante, mas não está relacionada à pergunta /dev/ttyUSB0ou a um analisador de energia que não usa o PCSCLITE. Se você gostaria de postar essas informações, seria melhor como uma pergunta separada. Você tem permissão e é incentivado a postar perguntas sobre tópicos para as quais você tem uma resposta imediata imediata.
68617 java # 18:

3
Eu tentei e a informação relevante foi que a resposta proposta NÃO funcionou! Eu acho que essa informação requer compartilhamento. O restante não é diretamente relevante, mas oferece uma abordagem diferente para problemas relacionados.
UV)

Isso seria por causa do :personagem no caminho? A página de manual socat, seção "ESPECIFICAÇÕES DE ENDEREÇO", possui um parágrafo sobre como escapar de caracteres (v1.5.0 em diante).
David Knipe

ponto interessante, mas o projeto foi enlatado, então não há mais como verificar :(
UV
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.