-3

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

客户端--ethernet--> Modem1 --GPIO--> Modem2 --ethernet-->我的家庭路由器

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

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

我已经阅读了一些关于以太网编程的内容,但仍然找不到“简单的东西”之类的答案。

  1. 如何实现 Modem1,以便当它连接到客户端时,客户端会发现它是 Internet 连接。

  2. 在调制解调器 2 端,如何让“我的家庭路由器”将用于“客户端”的数据包发送到调制解调器 2,以便调制解调器 2 可以转发它们。

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

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

4

1 回答 1

0

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

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

(反之亦然)

那么问题就变成了:两个调制解调器如何充当“以太网代理”?

Modem1 充当路由器的代理。Modem2 充当客户端的代理。如果您的 Raspberry Pi 可以欺骗 MAC 地址,您可能能够欺骗以太网对等体与调制解调器的以太网端口进行通信。您需要欺骗 MAC 地址的原因是,在 TCP/IP 网络中,有一个 ARP 表,它将远程 IP 地址映射到可以将 IP 数据包路由到/来自它们的 MAC 地址。这就是允许您的客户端通过 TCP/IP 与您的路由器通信的原因。

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

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

您需要编写用于读取/写入以太网消息的代码(我已经看到了用于在 Linux 中通过原始套接字读取/写入以太网数据包的开源代码)

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

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

以太网到 GPIO 过程

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

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

GPIO 到以太网的过程

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

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

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

至于“C”部分...

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

您的 GPIO 代码将以以下两种方式之一从 GPIO 引脚读取写入:从内存映射的硬件地址,或在该硬件地址上使用 ioport 调用。

在 Linux 中接收原始以太网帧

在 Linux 中发送原始以太网帧

祝你好运

于 2015-06-05T21:18:24.187 回答