Это более ограниченная версия этого вопроса:
У меня есть встроенное устройство ARM с пользовательским образом с ядром Linux 3.10.0.
Единственный физический интерфейс (нет, USB, нет Ethernet) — это оболочка Linux по умолчанию, к которой подключен один из последовательных интерфейсов.
Мой вопрос: есть ли какой-либо встроенный или внешний инструмент, который открывает IP-туннель через это соединение?
Я вижу некоторые общие проблемы:
- Устройство уже используется Linux, поэтому оно должно использовать stdin/out для связи вместо прямого доступа к устройству.
- После запуска приложения туннелирования оно должно ждать подключения клиента туннеля, потому что мне нужно закрыть последовательное соединение на моем компьютере, а затем запустить клиент туннеля.
- Должен быть способ закрыть соединение и вернуться к обычной оболочке.
Фактическое требование состоит в том, что я могу получить доступ к интерфейсу REST, работающему на встроенном устройстве, с компьютера, подключенного к встроенному устройству через последовательный кабель.
Это уже работает на устройствах с физическим Ethernet или Ethernet-over-USB, но это устройство не предлагает этого.
[ОБНОВЛЕНИЕ] Как уже объяснялось, в настоящее время socat недоступен на нашем встроенном устройстве, поэтому в качестве первой попытки я использовал следующее:
- Ноутбук Linux (Ubuntu) с физическим последовательным интерфейсом
- Ноутбук Windows с физическим последовательным интерфейсом и установленным cygwin+socat
- Оба подключены через нуль-модемный кабель
Примечание. С одной стороны я использую ноутбук с Windows, потому что у нас будет клиент socat, работающий на Linux (к сожалению).
- Прямое подключение STDIO
Сервер
socat stdio file:/dev/ttyS0,b115200
Клиент
socat file:/dev/ttyS4,b115200 stdio
В cygwin ttyS0
это COM1
, ttyS4
в данном случае это COM5
.
Используя их, socat работает как небольшая программа для чата. Почему я печатаю на одной стороне, выводится на другой и наоборот.
- TCP-соединение
Следующим шагом является использование TCP-соединения.
Сервер
socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80
Клиент
socat -T2 file:/dev/ttyS4,b115200,crtscts=1,raw,echo=0 tcp-l:7777,reuseaddr
Я указал скорость передачи (115200 бод), использовал необработанную передачу, без эха (в противном случае HTTP-запрос был бы отправлен обратно запрашивающей стороне) с использованием аппаратного управления потоком. Гной, мне пришлось использовать тайм-аут -T2
, который прерывает соединение через 2 секунды. В противном случае curl также не завершает работу и ожидает дополнительных данных.
Когда я использую curl на компьютере с Windows, он успешно передает запрос через последовательное соединение и возвращает полный HTTP-ответ HTTP-сервера на компьютере с Linux:
curl localhost:7777/index.html
Однако это работает только один раз. После завершения запроса и socat
client, и сервер завершают работу.
Более того, когда я использую браузер (Chorme), он использует кодировку g-zip, которая, скорее всего, отправляет двоичные символы. И одним из этих символов будет символ EOF
, который снова завершает socat
перед завершением запроса/ответа.
Затем я попытался добавить fork
на сервер:
socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80,fork
Это поддерживает работу сервера, но curl
возвращает 400 Bad Request
. Таким образом, кажется, что сервер socat
инициировал запрос для каждой строки или фрагмента, поскольку он не понимает HTTP.
- IP-соединение
Затем я подумал о том, чтобы перейти на слой ниже и использовать соединение TUN. Однако это не реализовано в версии socat
для Windows.
- HTTP-соединение
Поправьте меня, если я ошибаюсь, но, насколько я понимаю, socat
не предоставляет тип соединения, который на самом деле понимает HTTP и может правильно сериализовать его через последовательное соединение.
Итак, я не смог найти стабильного способа запуска клиента и сервера и выполнения нескольких HTTP-запросов через последовательное соединение.