Как настроить «USB-прокси» для / dev / ttyUSB0 по сети?

14

У меня есть тестируемое устройство (DUT), и я измеряю его энергопотребление с помощью регистратора данных Power Analyzer, используя данные из /dev/ttyUSB0.

Проблема в том, что DUT теперь удаленно с рабочей станции, с которой я собирал данные, но в той же сети мне нужно использовать второй компьютер, который напрямую подключен через USB к Power Anlayzer, в качестве своего рода USB-прокси и SSH создать своеобразную символическую ссылку на измерительной машине USB «прокси» машины.

введите описание изображения здесь

Учитывая вышеприведенную диаграмму, как 1- й ПК может получить доступ /dev/ttyUSB0к 2- му ПК, который подключен напрямую, таким образом, что программа, считывающая поток с 1- го ПК, не заметит разницы?

Эдуард Флоринеску
источник

Ответы:

19

socat может работать здесь.

На втором компьютере вы можете socatпрослушивать данные /dev/ttyUSB0и передавать их на TCP-порт, например:

socat /dev/ttyUSB0,raw,echo=0 tcp-listen:8888,reuseaddr

Затем на первом ПК вы можете подключиться ко второму ПК с помощью socat и предоставить данные на псевдотерминале /dev/ttyVUSB0для вашего приложения:

socat PTY,raw,echo=0,link=/dev/ttyVUSB0 tcp:<ip_of_pc2>:8888

Это не проверено и socatподдерживает много опций, поэтому может потребоваться настройка.

FloHimself
источник
3
Благодарность! Тестовая среда в док-контейнере на ноутбуке -> SSH-туннель -> ПК в чистой комнате -> Программатор AVR и регистратор FTDI в чистой комнате
Марк К Коуэн,
2

Вы можете использовать комбинацию ser2netи socat. Например, у меня есть робот, подключенный к Raspberry Pi через последовательный порт. Raspberry Pi подключен к моей локальной сети (эквивалентно вашему второму ПК). И мой ноутбук подключен к той же локальной сети (аналог вашего первого компьютера). Затем я использую ser2net для переадресации последовательного порта через TCP со 2-го ПК и создания файла последовательного прокси-устройства socatна 1-м ПК.

Эта настройка также может работать для вас. Предложенное решение:

Шаг 1: Установите пакет ser2net на ваш второй компьютер (следуя вашей схеме)

sudo apt-get install ser2net

ser2net прослушивает порт TCP и может передавать данные в последовательный порт через порт TCP и обратно. Вы можете установить, для каких последовательных портов вы хотите создать «прокси», через его файл конфигурации /etc/ser2net.conf.

Шаг 2: настроить ser2net на втором ПК

Например, если у вас есть устройство, подключенное к сети /dev/ttyACM0со скоростью передачи данных 115200и вы хотите обслуживать его через локальный порт 3333, вы можете добавить следующую строку в/etc/ser2net.conf

3333:raw:0:/dev/ttyACM0:115200,remctl

Создав файл конфигурации, запустите ser2net, запустив его на втором ПК:

ser2net

или (если он уже запущен, просто перезапустите его, как показано ниже)

/etc/init.d/ser2net restart

Одна важная вещь здесь - опция remctl. Это позволяет клиентской стороне (1-й компьютер на диаграмме) подключаться к устройству и свободно выбирать параметры последовательного подключения. Я думаю, что таким образом последовательная связь полностью прозрачна с точки зрения рабочей области сбора данных. Подробнее смотрите здесь .

Шаг 3: Настройте файл последовательного прокси-устройства на рабочей станции сбора данных (1-й компьютер)

(если у вас нет соцата, то sudo apt-get install socat)

Наконец, в терминале на 1-м ПК давайте socatсоздадим последовательный порт прокси, который будет прослушивать порт tcp:

socat pty,link=$HOME/MyProxySerialPort,waitslave tcp:$ip:$port,forever,reuseaddr,keepalive

Где, в этом примере ip=<2nd-PC-IP-address>и port=3333(или что вы выбрали при настройке /etc/ser2net.confна втором ПК).

Шаг 4. Подключитесь к MyProxySerialPort

Теперь вы сможете открыть последовательное соединение с устройством, расположенным на $HOME/MyProxySerialPort1-м ПК.

В этом блоге также есть дополнительная информация об этой настройке: http://techtinkering.com/2013/04/02/connecting-to-a-remote-serial-port-over-tcpip/

PsyKongroo
источник
очень подробный ответ +1
Эдуард Флоринеску
1

В ядрах Linux, использующих символическую ссылку из / dev / bus / usb / BUS_ID / DEV_ID в / dev / char / MAJOR: MINOR socat не может открыть такие устройства из-за неуместной ошибки IOCTL!
Так что, похоже, этот подход не работает напрямую на USB-устройствах.

Я попробовал usbip, который является более близкой реализацией, но поддерживается только на старых ядрах.

Поскольку мое решение касалось считывателей карт, подключенных через pcsc-lite, было лучшее решение, использующее переменную окружения для клиентов libpcsclite .

export PCSCLITE_CSOCK_NAME=$HOME/.pcscd.comm

Таким образом, может быть указан другой сокет домена unix. И этот можно переслать в гнездо устройства чтения карт на удаленном хосте с помощью socat :

Запустите это на хосте, чтобы заменить кард-ридер

socat tcp:$CARD_READER_HOST:8888 UNIX-LISTEN:$PCSCLITE_CSOCK_NAME,fork

запустите это на хосте CARD_READER_HOST с подключенным устройством чтения карт pcsc

socat UNIX-CONNECT:/var/run/pcscd/pcscd.comm tcp-listen:8888,fork,reuseaddr
ультрафиолетовый
источник
1
Привет и добро пожаловать :). Это интересная информация, но она не относится к вопросу об /dev/ttyUSB0анализаторе мощности, который не использует PCSCLITE. Если вы хотели бы опубликовать эту информацию, это было бы лучше, как отдельный вопрос. Вам разрешается и рекомендуется размещать вопросы по теме, на которые у вас есть немедленный ответ.
sourcejedi
3
Я попробовал это, и соответствующая информация состояла в том, что предложенный ответ НЕ работал! Я думаю, что эта информация требует обмена. Остальное действительно не имеет непосредственного отношения, но предлагает другой подход для связанных проблем.
UV
Будет ли это из-за :характера в пути? Страница man socat, раздел «ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ АДРЕСА», содержит параграф о том, как экранировать символы (начиная с версии 1.5.0).
Дэвид Книп
Интересно отметить, однако проект был консервированный так не способ проверить его больше :(
UV