我经历了在 Linux 上通过 USB 执行 TCP/IP 的最佳方法是什么?,并希望了解更多有关通过 USB 让两个 Linux 机器进行 IP 通信的可行性/程序。几年前,我通过串行链路轻松地做到了这一点,而且它非常稳定和成熟。
这个想法是拥有相关的命名网络设备(,,,eth0
.. ),然后能够使用/命令,就像任何其他用于 IP 地址分配、路由、 ping 的网络设备一样......但这是简单的最后部分。usb0
wlan0
/sys/class/net
ifconfig
route
为了实现这一点,我看到了不同的问题/步骤:
HW:布线。我猜两台电脑只有“主机”USB A 型连接器,而通常的 USB 电缆有一个 A 型连接器和一个 B 型连接器:电缆应精心准备,以防止交换电源,但只允许传输数据。对吗?(我在这里只介绍 USB <=2.0 协议,因为我知道 USB 3.x 可以执行全双工布线)
当然,如果我想将 PC(主机/USB)连接到“设备”(rasbpi、mini2440、arduino 等),我实际上会有一个 B 型端,并且可以使用“愚蠢的”USB 电缆。对吗?
内核/驱动程序:内核中有什么可以分配网络设备到 USB 端口?类似于 IP over
/dev/ttySxx
?如果另一端的 USB 内核驱动程序尚未准备好怎么办?端口/连接器的识别:内核应如何知道我实际使用的是哪个端口(特别是如果专用电缆上的电源线被切断)?如何识别我的端口?
最后,从网络层的角度来看,我应该期待什么?以太网的简单桥梁?还是每个 USB 端都会有一个分配的 IP 地址?
我希望这不会太令人困惑,并且您明白我试图实现的目标。但由于过去通过串行链路进行 IP(以太网?)非常简单,我希望 USB 也是如此。
答案1
1) USB 的问题在于它是一种主/从协议。PC 是主机,您无法将两个主机直接连接在一起,因此直接哑电缆不起作用。
你可以使用类似https://www.amazon.co.uk/Ethernet-Network-Adapter-Converter-Connection/dp/B003Q85EEA但你也可以直接使用以太网。任何其他硬件解决方案都是类似的:
pc <--usb--> usb slave ic/microcontroller <--common protocol--> usb slave ic/microcontroller <--usb--> pc
2)对于上述 USB 网络适配器之类的东西,它应该已经有一个内核驱动程序,它将为您设置一个网络设备,您可以像与 eth0 或 wlan0 一样与其进行交互,但可能具有不同的名称。
与内置内核模块一起工作的正确设计的 IC(比如上面提到的设备中的 IC)不会关心另一端的设备是否准备就绪,就像以太网电缆被拔掉了一样。
3)该设备应该像任何其他网络适配器一样公开,ip addr
或者ifconfig
一旦连接就应列出它。
4)您应该像任何其他设备一样看待网络设备,您可以将其视为直接从一台计算机到另一台计算机的以太网电缆。
您不能为此使用树莓派,它是像 PC 一样的主机设备。
Arduino 可以工作,但你需要两个。leonardo 更好,因为它内置了 USB 支持,因此速度更快。但是 arduino 没有支持 USB 网络的软件,所以你必须自己编写(这并不容易)。许多微控制器也是如此。最好的办法是找到一个支持从属网络的微控制器,我认为 mbed 可以做到这一点,但你仍然需要编写代码来桥接两个微控制器。
但最简单/最便宜的方法是使用两个类似的东西https://www.amazon.co.uk/Ethernet-Network-Adapter-Converter-Connection/dp/B003Q85EEA。然后移除外壳,拆焊接头并将以太网电缆直接焊接到端口。但这不会比仅使用以太网电缆带来太多优势,如果有什么的话,它会成为一种稍微不那么灵活的解决方案(尽管可能不那么笨重)。您可以创建自己的带有 IC 的电路板并将它们桥接到单个 PCB 上,但这将需要做更多的工作而没有真正的好处。