Команда Rename работает не так, как ожидалось

Самая большая проблема с чем-то вроде этого заключается в том, что если протокол асинхронный (бывают случаи, когда любой конец может отправлять), вам придется делать то, что делает 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        

0
02.07.2015, 14:46
0 ответов

Теги

Похожие вопросы