好的,作为一个训练练习,我想做的是实现像这样的东西
——以太网——> Modem1 ——GPIO> Modem2 ——以太网——> 我家路由器
客户端使用以太网线连接到Modem1。
Modem1是一个berry PI,转换信号并通过GPIO中继。Modem2是一个berry PI,从GPIO接收数据,并通过以太网电缆将其发送到我的家庭路由器
我想实现调制解调器,但不知道从哪里开始。
我已经阅读了一些关于以太网编程的内容,但是仍然找不到诸如"简单的东西"的答案。
-
我如何实现Modem1,以便当它连接到客户端时,客户端发现它是一个互联网连接
-
在Modem2端,我如何使"我的家庭路由器"发送给"客户端"的数据包到Modem2,以便Modem2可以转发它们
和可能我没有想到的东西....
那么,具体来说,我该如何实现这个呢?最好是c.
我冒昧地说,你可能能够编写某种自定义的GPIO中间层。
读取以太网->封装->写入GPIO->|->读取GPIO->解封装->写入以太网
(反之亦然)
问题就变成了:两个调制解调器如何作为"以太网代理"?
Modem1作为路由器的代理。Modem2充当客户机的代理。如果您的树莓派可以欺骗MAC地址,那么您可能能够欺骗以太网对等体与调制解调器的以太网端口进行通信。你需要欺骗MAC地址的原因是,在TCP/IP网络中,有一个ARP表,它将远程IP地址映射到可以路由IP数据包的MAC地址。这允许您的客户端通过TCP/IP与路由器通信。
另一个潜在的陷阱是调制解调器通信引入延迟,干扰以太网层对协议的处理。例如,以太网协议可能具有实时约束,如果您引入延迟,可能会破坏这些约束…
但是让我们假设在一个完美的世界里一切皆有可能…
您需要编写读取/写入以太网消息的代码(我已经看到在Linux中通过原始套接字读取/写入以太网数据包的开源代码)
你需要为你的GPIO通信编写一个自定义驱动程序。这意味着实现一个经过深思熟虑的协议来管理引脚状态、消息开始、消息结束、数据有效负载、校验和等等…
最后,您需要编写一个顶层通信层来实现:
Ethernet-to-GPIO过程:
a)从以太网端口读取,将以太网数据包封装成自定义消息(或消息片段)
b)使用自定义GPIO协议驱动程序将此自定义消息传递给外部GPIO对等体
GPIO-to-Ethernet过程:
a)从GPIO读取,使用自定义驱动程序代码b)解封装以太网报文c)写以太网报文到以太网端口。
这两个进程永远运行…
再一次,一切都取决于你的调制解调器能否在不干扰以太网协议的自然流动的情况下插入点对点连接。
关于"C"部分…
如果您使用开源库(或代码片段)通过原始套接字读取/写入原始以太网,那么很可能是用c编写的。
您的GPIO代码将以两种方式之一从GPIO引脚读写:从内存映射的H/W地址,或在该H/W地址上使用iport调用。
在Linux中接收原始以太网帧
在Linux下发送原始以太网帧
好运