这是this问题的更受限版本:

我有一个嵌入式ARM设备,运行带有Linux 3.10.0内核的自定义镜像。

唯一的物理接口(interface)(无,USB,无以太网)是默认的Linux shell,它连接了串行接口(interface)之一。

我的问题是:是否有任何内置或外部工具可以通过此连接打开IP隧道?

我看到一些一般性问题:

  • 该设备已被Linux使用,因此它必须使用stdin/out进行通信,而不是直接访问该设备。
  • 启动隧道应用程序后,该应用程序必须等待隧道客户端连接,因为我需要关闭计算机上的串行连接,然后启动隧道客户端。
  • 应该有一种方法可以关闭连接并返回到普通shell

  • 实际要求是,我可以从通过串行电缆连接到嵌入式设备的计算机访问嵌入式设备上运行的REST接口(interface)。

    这已经在具有物理以太网或USB以太网的设备上运行,但是该设备不提供。

    [更新]
    如前所述,socat目前在我们的嵌入式设备上不可用,因此,我首先尝试使用以下方法:
  • 具有物理串行接口(interface)
  • 的Linux(Ubuntu)笔记本电脑
  • 具有物理串行接口(interface)和cygwin + socat安装的Windows笔记本电脑
  • 两者均通过Null-modem电缆连接

  • 注意:我在一侧使用Windows笔记本电脑,因为我们将在Linux上运行socat客户端(不幸的是)。
  • 直接STDIO连接

  • 服务器
    socat stdio file:/dev/ttyS0,b115200
    

    客户
    socat file:/dev/ttyS4,b115200 stdio
    

    在cygwin中,ttyS0COM1,在这种情况下ttyS4COM5

    使用这些,socat就像一个小的聊天程序一样工作。为什么我在一侧键入的内容会在另一侧输出,反之亦然。
  • TCP连接

  • 下一步是使用TCP连接。

    服务器
    socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80
    

    客户
    socat -T2 file:/dev/ttyS4,b115200,crtscts=1,raw,echo=0 tcp-l:7777,reuseaddr
    

    我使用硬件流控制指定了波特率(115200),使用了原始传输,没有回声(否则HTTP请求将被发送回请求者)。我不得不使用超时-T2的猫在2秒后终止连接。否则,curl也不终止,并等待更多数据。

    当我在Windows计算机上使用curl时,它将通过串行连接成功传输请求,并返回Linux计算机上HTTP服务器的完整HTTP响应:
    curl localhost:7777/index.html
    

    但是,它只能运行一次。请求完成后,socat客户端和服务器均终止。

    而且,当我使用浏览器(Chorme)时,它使用的g-zip编码很可能会发送二进制字符。这些字符之一将是EOF字符,该字符在完成请求/响应之前再次终止socat

    然后,我尝试将fork添加到服务器:
    socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80,fork
    

    这样可以使服务器保持 Activity 状态,但是curl返回400 Bad Request。似乎socat服务器似乎对每行或每个块都发起了一个请求,因为它不理解HTTP。
  • IP连接

  • 然后,我考虑在其下进行一层并使用TUN连接。但是,这在Windows版本的socat上未实现。
  • HTTP连接

  • 如果我错了,请纠正我,但据我所知,socat没有提供实际理解HTTP的连接类型,而是能够通过串行连接正确地对其进行序列化。

    因此,我找不到启动客户端和服务器并通过串行连接运行多个HTTP请求的任何稳定方法。

    最佳答案

    在普通的Linux上,您可以使用socat

    该程序允许您连接几种流类型(文件,套接字,tcp,udp等)。在您的情况下,将文件归档为tcp或更确切地说是将端口xx处的tcp套接字归档到/dev/ttyUSB1。您应该在两侧启动socat来建立隧道。

    编辑1:
    对不起,我也对socat感到失望。我找不到能使TCP侦听器为多个连续连接保持 Activity 状态,但一次仅处理一个连接的解决方案。

    我的解决方案是使用4个线程的简单C#程序:
    1.等待标准输入,例如退出命令
    2. TCP侦听器
    3.用于 Activity 连接的TCP工作线程
    4.如果TCP打开,它将为COM打开另一个线程

    线程3从TCP读取并写入COM,而线程4从COM读取并写入TCP。如果线程获得TCP关闭事件,它将停止线程4,该线程4关闭COMx,并自行退出。现在,线程2可以接受一个新的连接。如果线程1读取stdin上的exit,它将消息传递给所有线程以停止和关闭。

    也许您可以在没有socat的嵌入式系统上使用pthreads在C中实现如此短的程序。

    EOF问题:
    我试图用Google搜索某个程序,该程序可以转义特殊字符或将数据流从ASCII重新编码为ANSI或base64或其他任何内容。...如果可以找到这样的程序或也可以用C编写,则可以在两者之间使用管道传输

    Server <=> reencode <=> socat <--serial--> socat <=> reencode <=> client
    

    关于linux - Linux串行默认 shell 上的IP隧道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27837627/

    10-12 20:21