2015-05-29 6 views
-3

Хорошо, что я хочу сделать, в качестве учебного упражнения, чтобы осуществить что-то вроде этогоКак реализовать сетевой модем

клиента --ethernet ->modem1 --GPIO ->modem2 --ethernet ->My Home Router

Если клиент подключается к modem1 используя сетевой кабель.
modem1 является Raberry PI, преобразование сигнала и передача его через GPIO
modem2 является Raberry PI, получает данные из GPIO, и отправить его через сетевой кабель на мой домашний маршрутизатор

Я хочу внедряйте модемы, но не знаете, с чего начать.

Я немного поработал над программированием на Ethernet, но до сих пор не могу найти ответы на «простые вещи».

  1. Как реализовать Modem1, чтобы при его подключении к клиенту клиент обнаружил его как подключение к Интернету.

  2. На модеме 2, как мне сделать «Мой домашний маршрутизатор», отправляют пакеты, предназначенные для «клиента», на Modem2, так что Modem2 может пересылать их.

и, возможно, вещи, которые я не хотя ....

Итак, как же конкретно я могу осуществить это? предпочтительно в c.

+0

Этот вопрос не по теме. Попробуйте суперпользователя или serverfault. – EJP

+0

Я не согласен. Я мог бы сказать плохо, полагаю, что это действительно вопрос программирования. Не могли бы вы рассказать о том, почему вопрос может быть вне темы? – sigsve

+0

Вне темы: поиск учебника. – Olaf

ответ

0

Я бы рискнул сказать, что вы можете написать какой-то пользовательский промежуточный уровень GPIO.

Читать Ethernet-> Encapsulate-> Написать GPIO-> | -> Read GPIO-> Decapsulate-> Написать Ethernet

(и наоборот)

Проблема становится: Как может как модемы действуют как "Ethernet-прокси"?

Модем1 действует как прокси-сервер для маршрутизатора. Модем2 действует как прокси-сервер для клиента. Если ваш Raspberry Pi может обманывать MAC-адреса, вы можете обмануть одноранговые сети Ethernet в общении с портом Ethernet модемов. Причина, по которой вам нужно обманывать MAC-адреса, является то, что в сетях TCP/IP есть таблица ARP, которая отображает удаленные IP-адреса на MAC-адрес, который может маршрутизировать IP-пакеты в/из них. Это позволяет клиенту связываться с вашим маршрутизатором через TCP/IP.

Еще одна потенциальная ошибка заключается в том, что ваше модемное сообщение вводит задержки, которые мешают работе протокола Ethernet. Например, протокол Ethernet может иметь ограничения в режиме реального времени, которые могут быть разрушены, если вы вводите задержки ...

Но давайте предположим, что все возможно в идеальном мире ...

Вам нужно написать код для чтения/записи сообщений Ethernet (я видел открытый исходный код для чтения/записи пакетов Ethernet над сокетов в Linux)

Вам нужно написать пользовательский драйвер для ваших сообщений GPIO. Это означает реализацию тщательно продуманного протокола для управления состоянием контактов, начального сообщения, окончательного сообщения, данных-полезной нагрузки, контрольной суммы, независимо от того, ...

Наконец, вам нужно написать коммуникации слой верхнего уровня, который реализует:

Ethernet к GPIO процесс:

а) считываются из порта Ethernet, инкапсулирует Ethernet пакет в пользовательское сообщение (или фрагменты сообщений)

б) обмениваться этим пользовательским сообщением, используя свой собственный профиль GPIO водитель токола, к внешнему GPIO сверстников

GPIO-к-Ethernet процесс:

а) Чтение из GPIO, используя свой собственный код драйвера б) Decapsulate Ethernet пакета с) Написать Ethernet пакет Ethernet порт.

эти два процесса запуска навсегда ...

Опять же, все петли на, могут ли ваши модемы внедриться в связи с равный-равному не нарушая естественный поток протокола Ethernet ...

что касается части «с» ...

Если вы используете библиотеки с открытым исходным кодом (или фрагменты кода) для чтения/записи необработанного Ethernet через сокетов, что, скорее всего, написан на C.

Ваш код GPIO будет читать запись f оставьте контакты GPIO одним из двух способов: с адреса H/W с отображением памяти или с помощью вызовов ioport на этом H/W-адресе.

Receive raw Ethernet frames in Linux

Send a raw Ethernet frame in Linux

Успехов

+0

Я все еще неясен, как маршрутизатор создает таблицу ARP. Я предполагаю, что клиент должен отправить сообщение, чтобы сообщить о своем присутствии маршрутизатору, чтобы маршрутизатор мог назначить ему IP. Как выглядит это «рукопожатие»? Существует ли универсальный протокол для этого? Если да, то как называется протокол, поэтому я могу его прочитать. – sigsve

+0

ARP сокращен для протокола разрешения адресов. Узел, пытающийся отправить фрейм, отправляет широковещательную рассылку с запросом на адрес уровня 2. – tomato

+0

Квитирование объясняется в ARP RFC826: [link] (https://tools.ietf.org/html/rfc826). Короче говоря, узел делает ARP-запрос равным. Если одноранговый узел знает, какой MAC-адрес имеет данный IP-адрес, он возвращает ответ ARP, который вызывает обновление таблицы ARP. –