LINUX.ORG.RU

двунаправленно связать UDP и tty

 


1

1

Пока что у меня лишь промежуточное решение:

sudo socat PTY,link=/dev/ttyS10 UDP-DATAGRAM:192.168.2.15:5000,broadcast
Я могу открыть ttyS10 при помощи minicom и на каждую букву в терминале minicom отсылается UDP-пакет.

Проблемы:

1) Если допустим открыть при помощи cutecom который отсылает строку лишь по нажатию ввода, то все равно на каждую букву отдельный пакет, например «123<enter>» это четыре пакета 31 32 33 0A. Хотелось бы некоторой группировки символов по некоторому таймауту.

2) При помощи wireshark видно что прилетает ответ на каждую букву (ну, я делаю специальную посылку на другой стороне UDP из нескольких печатаемых ASCII символов), но minicom и cutecom эти ответы не отображают, стало быть связь односторонняя...

Вопрос: как связать UDP и tty чтобы пакеты летали туда сюда, при этом группируя смежные байты? Хочется некоего тоннеля, при этом на одной стороне Linux а на другой лишь UDP и ничего более (самодельное устройство без ОС).

Возможно даже не socat, а другая утилита? В принципе, от безысходности я смогу и программку накатать для этой цели, но хотелось бы что-то стандартненькое...

O_O Связать посылку дейтаграмм и поток байт? Ты какую задачу-то пытаешься решить этим?

Deleted ()
Ответ на: комментарий от I-Love-Microsoft

я попробовал с /dev/pts:

cat /dev/pts/8 | nc -l -p 9999 >> /dev/pts/8

клиент:

nc 127.0.0.1 9999

Теперь нюансы:

1) /dev/pts/8 заменишь на свой tty
2) У некоторых реализаций nc не надо использовать -p при задании -l
3) Если надо ОБЯЗАТЕЛЬНО udp - в man nc есть ключ для использования udp вместо tcp
4) Я понял в целом задачу, но не понял зачем тебе такие сложности, как:

и на каждую букву в терминале minicom отсылается UDP-пакет
«123<enter>» это четыре пакета 31 32 33 0A. Хотелось бы некоторой группировки символов по некоторому таймауту.

я может не так понял задачу, поэтому делал то, что написано в заголовке
5) В моей просто реализации stderr не перенаправляется. Это поправимо.

reprimand ★★★★★ ()

В каком виде посылается ответ?

Возможно не в таком, в каком его ожидает «UDP-DATAGRAM:192.168.2.15:5000,broadcast» Тогда для получения udp и отправки udp можно использовать разные выражения socat, разделив их "!!"

Точного примера увы не покажу - толком не использовал этот режим.

GPFault ★★ ()

Packets arriving on the local socket are checked for the correct remote port and if their source addresses match RANGE or TCPWRAP options.

У меня получилось двустороннее соединение из:

socat PTY,link=$(pwd)/ttyWTF UDP-DATAGRAM:192.168.1.10:5000,broadcast
nc -l -p 5000 -u
screen ./ttyWTF
Всё, что я печатал в screen ./ttyWTF, получал nc. Все строки, которые я отправлял в nc, показывались на screen. Остаётся только поиграть с stty для настройки правильного перевода на новую строку.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

У меня это не работает, а в wireshark видна куча пакетов TCP, но есть и UDP, однако они какие-то огромные. Придется программу писать...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Если что, у меня netcat-traditional. Ещё можно попробовать ncat от разработчиков nmap, там опции почти такие же (ncat -u -l 5000).

AITap ★★★★★ ()
Ответ на: комментарий от Deleted

Связать посылку дейтаграмм и поток байт? Ты какую задачу-то пытаешься решить этим?

Надо тупо чтобы программа, которая работала раньше с устройством напрямую по RS-485, то теперь в цепочку добавляется нечто с Ethernet/UDP и имеет в том числе RS-485. Всё просто ;)

Таким образом программа будет работать со своим любимым последовательным портом как ни в чем не бывало...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от AITap

К сожалению socat не хочет передавать ответные UDP-пакеты при работе в живой сети, хотя wireshark говорит что прилетают корректные UDP-пакеты в ответ...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от AITap

И всё же это было рабочее решение! Была ошибка в формировании UDP-ответа с моей стороны, поэтому wireshark видел ответ, но в программы он не поступал. После исправления моей ошибки заработала как и моя программа, так и стандартный путь:

socat PTY,link=/home/<username>/ttyWTF UDP-DATAGRAM:192.168.2.15:5000,broadcast
Так ttyWTF становится тупо удаленным последовательным портом и всё идеально работает без модификации программы, которая ожидала обычный ttyS* или ttyUSB* порт... :)

Топик решен. Причем пакеты не разбиваются на отдельные байты, что приятно!

Хотя конечно это не позволяет изменять скорость или параметры порта RS-485 на той стороне, но это и не требовалось.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.