У меня есть сценарий, в котором несколько процессов в одном устройстве хотят взаимодействовать с последовательным устройством. Процессу 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
\->-------------------------------------------->-/
Процесс 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". Номера портов заменены в целях безопасности.