Назад | Перейти на главную страницу

Socat для обмена последовательной связью между несколькими процессами

У меня есть сценарий, в котором несколько процессов в одном устройстве хотят взаимодействовать с последовательным устройством. Процессу A требуется двусторонняя связь с последовательным портом, а процессу B требуется только возможность записи в последовательный порт. Последовательное устройство непрерывно извергает данные, в то время как два процесса периодически записывают в порт. Среда - это Cygwin в Windows (процессы - это процессы Windows), но последовательный порт можно перенести на виртуальную машину * nix, если у кого-то есть решение только для Linux.

Моя "сетевая диаграмма" выглядит следующим образом:

                                         /--<->--[Process A]
[serial device]-ttyS0--<->--[socat]-udp-<
                                         \--<<<--[Process B]

Моей первой попыткой было настроить экземпляр socat с udp-recvfrom и опцией fork. Это работает для первого пакета - процесс отключается от socat, отправляет данные на последовательное устройство и начинает считывать данные обратно с последовательного устройства. Однако этот разветвленный процесс теперь имеет последовательный порт, открытый для чтения-записи, так что никакие вилки больше не запускаются.

Может ли кто-нибудь придумать способ заставить это работать? Я могу думать о следующих возможностях, но я не нашел настроек, чтобы заставить их работать:

Я нашел решение. Он включает 4 экземпляра socat, представленных на сетевой диаграмме ниже:

                               /-<-[A - udp receiver] <=udp= [D - udp sender]-<-\
ttyS0 <--> [B - serial adapter]                                                  [C - tcp adapter] <=tcp=> Process A
                               \->-------------------------------------------->-/
  • Socat «B» обращается к последовательному порту, принимает ввод на стандартный ввод и вывод на стандартный вывод.
  • Socat «A» прослушивает UDP-пакеты отовсюду и выводит их через стандартный вывод, откуда они направляются в socat «B».
  • Socat «C» прослушивает TCP-соединение от процесса A. Данные, поступающие от socat «A», поступают в стандартный ввод и направляются в процесс A. Данные из процесса A отправляются из стандартного вывода на socat «D».
  • Socat «D» берет данные со стандартного ввода и отправляет их через UDP на socat «A».

Процесс B отправляет пакеты UDP в socat «B», когда он хочет ввести трафик.

Команда bash для создания этого чудовища выглядит следующим образом:

socat -d -d -d -lpA_udp_rxr -u -T5 udp-recv:1111 - 2>>log.txt |
socat -d -d -d -lpB_serial_adapter -t5 - /dev/ttyS0,raw 2>>log.txt |
socat -d -d -d -lpC_tcp_adapter -T5 - tcp4-listen:3333 2>>log.txt |
socat -d -d -d -lpD_udp_sender -u -T5 - udp:localhost:1111,sourceport=2222 2>>log.txt 

Это также устанавливает тайм-аут в 5 секунд и записывает много деталей в "log.txt". Номера портов заменены в целях безопасности.