Самая большая проблема с чем-то вроде этого заключается в том, что если протокол асинхронный (бывают случаи, когда любой конец может отправлять), вам придется делать то, что делает socat
и создайте цикл событий вокруг select (2)
, чтобы иметь возможность читать того, кто отправляет. Для этого потребуется какой-то реальный язык программирования (Python, Perl?), И может потребоваться некоторое время, чтобы к нему привыкнуть.
Однако, если протокол является синхронным (в любой момент времени может разговаривать только одна сторона), вы можете использовать программу, которая читает с одного конца за раз. Программа должна будет интерпретировать протокол, чтобы знать, какая сторона должна разговаривать в любой момент, иначе она может застрять в ожидании ввода с неправильного конца, не проходя никаких дальнейших операций записи.
Чтобы общаться с вашей программой из сети, вы можете запустить ее с помощью socat tcp-l: 60128, reuseaddr exec: / path / to / my_filter_prog
(или реализовать сетевой сокет в самой программе.) А на другом конце либо вызовите другой socat
из программы для связи с последовательным портом, либо откройте последовательный порт непосредственно из программы.
Макет сценария Bash может выглядеть примерно так: coproc
открывает два канала к другому socat
для связи с последовательным портом. (Обратите внимание, что я действительно не смотрел на фактическое описание протокола.)
coproc socat - file:/dev/ttyUSB0,nonblock,raw,echo=0,crnl,waitlock=/ttyUSB0.lock
serin=${COPROC[0]}
serout=${COPROC[1]}
# assume we have stdin/stdout connected to the other end,
# as with socat tcp-listen:... exec:./this
while true ; do
# read a command from stdin, pass it through to serial
read -r cmd
echo "$cmd" >&$serout
# do we need to read and pass another line at this point?
# might depend on the command, but we need to know that.
# read the reply and pass it through
read -r reply <&$serin
# add/modify something based on the command or the reply?
echo "$reply"
if [ "$cmd" = "!xECNQSTN" ] ; then
echo "!1ECNTX-NR609/60128/DX"
fi
done