【发布时间】:2015-01-08 10:15:29
【问题描述】:
这是this问题的更受限制的版本:
我有一个嵌入式 ARM 设备,它运行带有 Linux 3.10.0 内核的自定义映像。
唯一的物理接口(没有、USB、没有以太网)是连接到串行接口之一的默认 Linux shell。
我的问题是:是否有任何内置或外部工具可以通过此连接打开 IP 隧道?
我看到了一些一般性问题:
- 该设备已被 Linux 使用,因此必须使用 stdin/out 进行通信,而不是直接访问该设备。
- 启动隧道应用程序后,应用程序必须等待隧道客户端连接,因为我需要关闭计算机上的串行连接,然后再启动隧道客户端。
- 应该有办法关闭连接并回到正常的shell
实际要求是,我可以从通过串行电缆连接到嵌入式设备的计算机访问在嵌入式设备上运行的 REST 接口。
这已经适用于具有物理以太网或 USB 以太网的设备,但此设备不提供。
[更新] 如前所述,socat 目前在我们的嵌入式设备上不可用,因此作为第一次尝试,我使用了以下内容:
- 具有物理串行接口的 Linux (Ubuntu) 笔记本电脑
- 一台装有物理串行接口并安装了 cygwin+socat 的 Windows 笔记本电脑
- 两者均通过 Null 调制解调器电缆连接
注意:我在一侧使用的是 Windows 笔记本电脑,因为我们将在 Linux 上运行 socat 客户端(不幸的是)。
- 直接 STDIO 连接
服务器
socat stdio file:/dev/ttyS0,b115200
客户
socat file:/dev/ttyS4,b115200 stdio
在 cygwin 中,ttyS0 是 COM1,ttyS4 在这种情况下是 COM5。
使用这些,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
但是,它只能工作一次。请求完成后,socatclient 和 server 都终止。
此外,当我使用浏览器 (Chorme) 时,它使用最有可能发送二进制字符的 g-zip 编码。其中一个字符将是EOF 字符,它在完成请求/响应之前再次终止socat。
然后我尝试将fork添加到服务器:
socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80,fork
这使服务器保持活动状态,但curl 返回400 Bad Request。因此,似乎socat 服务器对每一行或每一块都发起了一个请求,因为它不理解 HTTP。
- IP 连接
然后我想到了下一层并使用 TUN 连接。但是,这在 socat 的 Windows 版本上没有实现。
- HTTP 连接
如果我错了,请纠正我,但据我了解,socat 没有提供真正理解 HTTP 并且能够通过串行连接正确序列化它的连接类型。
所以,我找不到任何稳定的方法来启动客户端和服务器并通过串行连接运行多个 HTTP 请求。
【问题讨论】:
标签: linux serial-port ip tunnel