如何实现以太网调制解调器

How to implement an ethernet modem

好的,作为训练练习,我想做的是实现这样的东西

客户端 --以太网--> 调制解调器1 --GPIO--> 调制解调器2 --以太网--> 我的家用路由器

客户端使用以太网电缆连接到调制解调器 1。
Modem1 是一个 Raberry PI,转换信号并通过 GPIO
中继 Modem2 是一个 Raberry PI,从 GPIO 接收数据,并通过以太网电缆将其发送到我的家庭路由器

我想实现调制解调器,但不知道从哪里开始。

我已经阅读了一些关于以太网编程的知识,但仍然找不到 "simple stuff" 之类的答案。

  1. 我如何实现调制解调器 1,以便当它连接到客户端时,客户端发现它是互联网连接。

  2. 在 Modem2 端,如何让 "My Home Router" 将发往 "client" 的数据包发送到 Modem2,以便 Modem2 转发它们。

可能还有我没有想到的事情....

那么,具体来说,我该如何实施呢?最好在 c.

我敢说您可以编写某种自定义 GPIO 中间层。

读取以太网->封装->写入GPIO->|->读取GPIO->解封装->写入以太网

(反之亦然)

问题就变成了:两个调制解调器如何充当 "Ethernet proxies"?

调制解调器 1 作为路由器的代理。调制解调器 2 充当客户端的代理。如果您的 Raspberry Pi 可以欺骗 MAC 地址,您就可以欺骗以太网对等点与调制解调器的以太网端口进行通信。您需要欺骗 MAC 地址的原因是在 TCP/IP 网络中,存在 ARP table,它将远程 IP 地址映射到可以路由 IP 的 MAC 地址将它们打包 to/from。这就是允许您的客户端通过 TCP/IP.

与您的路由器通信的原因

另一个潜在的陷阱是您的调制解调器通信引入的延迟会干扰以太网层对协议的处理。例如,以太网协议可能具有实时限制,如果引入延迟,这些限制可能会被打破...

但是让我们假设在一个完美的世界里一切皆有可能...

您需要为 reading/writing 以太网消息编写代码(我在 Linux 中看到 reading/writing 原始套接字上的以太网数据包的开源代码)

您需要为 GPIO 通信编写自定义驱动程序。 这意味着实施一个经过深思熟虑的协议来管理引脚状态、消息开始、消息结束、数据有效负载、校验和等等...

最后,您需要编写一个顶层通信层来实现:

以太网转GPIO进程:

a) 从以太网端口读取,将以太网数据包封装成自定义消息(或消息片段)

b) 使用您的自定义 GPIO 协议驱动程序将此自定义消息传达给外部 GPIO 对等方

GPIO转以太网进程:

a) 使用自定义驱动程序代码从 GPIO 读取 b) 解封装以太网数据包 c) 将以太网数据包写入以太网端口。

这两个进程运行永远...

同样,一切都取决于您的调制解调器是否可以在不干扰以太网协议的自然流动的情况下将自己插入对等连接中...

至于'C'部分...

如果您通过原始套接字为 reading/writing 原始以太网使用开源库(或代码片段),那很可能是用 C 语言编写的。

您的 GPIO 代码将通过以下两种方式之一从 GPIO 引脚进行读写:从内存映射 H/W 地址,或在该 H/W 地址上使用 ioport 调用。

Receive raw Ethernet frames in Linux

Send a raw Ethernet frame in Linux

祝你好运