Я пытаюсь получить диагностические данные с устройства, к которому я подключаюсь по сети.Он предлагает хороший жесткий протокол, где вы отправляете запрос из 3 или 4 символов и получаете ответ <~ 30 символов.Что нужно учитывать: </p>
- Вы должны ждать 20 мс между запросами (я хочу опрашивать как можно быстрее)
- Вы должны дождаться ответа перед отправкой следующего запроса
- Хотя запрос должен заканчиваться концом строки Unix, ответы идут с концом строки Mac (я знаю)
Я пытаюсь сделать это с помощью netcat.Основные операции просты:
$ echo STA | netcat <IP> <Port>
123498754
Запрос STA даст вам слово состояния, которое netcat записывает в стандартный вывод.Я также могу сделать это
$ cat | netcat <IP> <Port>
STA # <- typed input
12345678 # written by netcat
STA # <- typed input
12345678 # written by netcat
Здесь я вижу, что первый запрос занимает значительно больше времени: несколько секунд без заметной задержки.Я хочу избавиться от задержки.И вот мой квест начинается: Держите netcat открытым !
Я не могу просто передать файл в netcat, потому что мне нужно ждать ответов.Поэтому я пытаюсь сделать это с помощью FIFO.Я создал два (/ d / pc2dev и / d / dev2pc), оба с разрешением rw.Я мог бы написать сценарий, основанный на этом, если бы я мог заставить работать основы.Это работает
#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n'
12345678654 # written by netcat with delay
12345678654 # written by netcat as soon as I send the request on shell 2
12345678654 # ditto
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
(без tr ответы будут записываться поверх друг друга.) Однако это не так:
#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n' > /d/dev2pc
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
#### SHELL 3 #############################
$ cat /d/dev2pc
# expecting output here - none comes!
Запись в обычный файл также не работает:
#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n' > log.txt
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
$ cat log.txt
# nothing
Кажется, что операция записи в FIFO / файл где-то буферизуется, а запись в стандартный вывод выполняется немедленно.(Тем не менее, даже при ctrl + c'ing netcat и др. Этот гипотетический буферизованный вывод не записывается.)
Так или иначе - как я могу заставить это работать?