通过ssh建立socat连接以连接到远程虚拟COM端口上的设备

问题描述

我正在寻找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

    中使用标准TCP4socat

在这种情况下,我的工作设置正常,但是命令消失了(我记得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"

祝你好运!