テスト対象のデバイス(DUT)があり、/dev/ttyUSB0
からのデータを使用して Power Analyzer Datalogger を使用してその電力使用量を測定しています。
問題は、DUTがデータの収集に使用したワークステーションからリモートになっていることですが、同じネットワークで、USB経由でPower Anlayzerに直接接続されている2台目のPCを一種のUSBプロキシおよびsshとして使用する必要があります。 「プロキシ」マシンのUSBの測定マシンに一種のシンボリックリンクを作成します。
上記の図を考えると、どのように1st PCアクセス/dev/ttyUSB0
of the 2nd 直接接続されているPCから、プログラムがストリームを読み取る方法で1st PCは違いに気付かないのでしょうか?
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
は多くのオプションをサポートしているため、微調整が必要になる場合があります。
ser2net
とsocat
を組み合わせて使用できます。たとえば、シリアルポートを介してロボットを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/
/ 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