问题描述
我正在寻找socat命令组合,以通过ssh建立到远程虚拟COM端口的连接,以便本地虚拟usb端口的行为与将设备连接到本地USB端口的行为完全相同。我已经尝试了以下组合:
socat -v PTY,link=$HOME/ttyVirt,raw,echo=0,b9600 EXEC:'ssh pi@192.168.5.30 socat - /dev/ttyACM0,pty,echo=0'
socat -v PTY,icanon=1,b9600,crlf EXEC:'ssh pi@192.168.5.30 socat - /dev/ttyACM0,crlf'
与设备的初始连接似乎部分起作用-我收到了一些有意义的反馈信息。但比它卡住。我的猜测是,socat将一些额外的控制命令添加到通过socat中继的数据中。
有人知道如何使用socat在ssh上建立这种“干净的”虚拟COM端口连接吗?
解决方法
据我所知socat
不会向流中添加任何控制命令。我敢打赌,这里存在一些计时问题(网络链接会增加很多延迟,而许多串行协议都无法很好地处理这些延迟)。
最好使用一些基于RFC 2217的重定向器(该重定向器支持更多的串行API调用,例如速度更改等)。我只测试了ser2net,效果很好。
如果您坚持使用socat
,请尽量避免使用标准输入/输出:
-
使用
stty
预配置端口(例如stty -F /dev/ttyACM0 9600 raw
),然后在GOPEN:/dev/ttyACM0
中使用socat
-
考虑使用SSH Port Forwarding而不是通过ssh远程运行
中使用标准socat
。然后在TCP4-LISTEN
TCP4
和socat
在这种情况下,我的工作设置正常,但是命令消失了(我记得PTY
使用了socat
来分配虚拟串行端口)。
编辑>
Socat manual page提供了此功能(适合您的情况):
socat PTY,link=$HOME/ttyVirt,rawer,wait-slave EXEC:"ssh pi@192.168.5.30 socat - /dev/ttyACM0,nonblock,rawer"
祝你好运!