web-dev-qa-db-ja.com

ネットワーク経由で/ dev / ttyUSB0の「USBプロキシ」を設定するにはどうすればよいですか?

テスト対象のデバイス(DUT)があり、/dev/ttyUSB0からのデータを使用して Power Analyzer Datalogger を使用してその電力使用量を測定しています。

問題は、DUTがデータの収集に使用したワークステーションからリモートになっていることですが、同じネットワークで、USB経由でPower Anlayzerに直接接続されている2台目のPCを一種のUSBプロキシおよびsshとして使用する必要があります。 「プロキシ」マシンのUSBの測定マシンに一種のシンボリックリンクを作成します。

enter image description here

上記の図を考えると、どのように1st PCアクセス/dev/ttyUSB0 of the 2nd 直接接続されているPCから、プログラムがストリームを読み取る方法で1st PCは違いに気付かないのでしょうか?

14

socatはここで機能する可能性があります。

2台目のPCでは、socat/dev/ttyUSB0でデータをリッスンさせ、tcpポートに提供することができます。例:

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

次に、1番目のPCでsocatを使用して2番目のPCに接続し、アプリケーションの疑似端末/dev/ttyVUSB0にデータを提供できます。

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

これはテストされておらず、socatは多くのオプションをサポートしているため、微調整が必​​要になる場合があります。

19
FloHimself

ser2netsocatを組み合わせて使用​​できます。たとえば、シリアルポートを介してロボットをRaspberry Piに接続しています。 Raspberry Piは私のローカルネットワークに接続されています(2台目のPCに相当)。そして、私のラップトップは同じローカルネットワーク(1台目のPCと同等)に接続されています。次に、ser2netを使用して、2番目のPCからTCP=経由でシリアルポートを転送し、1番目のPCでsocatを使用してプロキシシリアルデバイスファイルを作成します。

この設定はあなたのためにも働くかもしれません。提案されたソリューション:

ステップ1:2番目のPCにser2netパッケージをインストールします(図に従ってください)

Sudo apt-get install ser2net

ser2netはTCPポートをリッスンし、TCPポートを介してシリアルポートとの間でデータをパイプすることができます。必要なシリアルポートを設定できます。構成ファイル/etc/ser2net.confを使用しての「プロキシ」を作成します。

ステップ2:2台目のPCでser2netを構成します

たとえば、/dev/ttyACM0にボーレート115200で接続されているデバイスがあり、localhostポート3333からサービスを提供する場合は、次の行を/etc/ser2net.confに追加できます。

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

構成ファイルを作成したら、2番目のPCで実行してser2netを起動します。

ser2net

または(すでに実行されている場合は、以下のように再起動します)

/etc/init.d/ser2net restart

ここで重要なのは、remctlオプションです。クライアント側(図の最初のPC)がデバイスに接続し、シリアル接続オプションを自由に選択できるようにします。この方法では、シリアル通信はデータ収集ワークスペースの観点から完全に透過的だと思います。 詳細はこちら を参照してください。

ステップ3:データ収集ワークステーション(1台目のPC)にプロキシシリアルデバイスファイルをセットアップします

(socatがない場合は、Sudo apt-get install socat

最後に、1台目のPCのターミナルで、socatにtcpポートからリッスンするプロキシシリアルポートを作成させます。

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

ここで、この例ではip=<2nd-PC-IP-address>およびport=3333(または2台目のPCで/etc/ser2net.confを設定するときに選択したもの)。

ステップ4:MyProxySerialPortに接続します

これで、最初のPCの$HOME/MyProxySerialPortにあるデバイスへのシリアル接続を正常に開くことができるはずです。

このブログ投稿には、このセットアップに関する詳細情報も含まれています。 http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/

2
PsyKongroo

/ dev/bus/usb/BUS_ID/DEV_IDから/ devへのシンボリックリンクを使用しているLinuxカーネル/ char/MAJOR:MINORsocatは、不適切なIOCTLエラーのためにそのようなデバイスを開くことができません!
そのため、このアプローチはUSBデバイスでは直接機能しないようです。

私は試しましたsbipこれはより近い実装ですが、古いカーネルでのみサポートされています。

私のソリューションはpcsc-lite経由で接続されたカードリーダーに関するものだったので、libpcscliteクライアントの環境変数を使用するより良いソリューションがありました。

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

このようにして、異なるUNIXドメインソケットを指定できます。そして、これはsocatを使用してリモートホストのカードリーダーソケットに転送できます。

ホストでこれを実行してカードリーダーを交換します

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

pcscカードリーダーが接続されているCARD_READER_Hostホストでこれを実行します

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