Надеюсь, это лучший сайт Stack Exchange для этого - я думаю, что это в первую очередь вопрос netcat.
Я разрабатываю индивидуальное устройство для сбора данных. Это, вероятно, лучше всего рассматривать как модную звуковую карту. В настоящее время он работает на Ubuntu 14.04. Я пытаюсь проверить его производительность в MATLAB в другой системе, и самое простое решение - это потоковая передача необработанных данных из драйвера в MATLAB через UDP.
Я могу генерировать сигналы в MATLAB и отправлять их через UDP на устройство с помощью прослушивателя netcat:
nc -ul 10000 > /dev/evio
Но у меня проблемы с получением данных в другом направлении:
nc -u devhost 10000 < /dev/evio
Этот и другие варианты, которые я пробовал, просто терпят неудачу. В соответствии с pv
никакие данные не передаются по конвейеру вообще. Устройство реализует только read
, write
, open
, и release
fops, а также несколько кастомных ioctl
. Если входной буфер пуст, вызов чтения блокируется до тех пор, пока от оборудования не поступит кадр данных, и он возвращает либо столько, сколько было запрошено, либо весь кадр, если было запрошено слишком много.
Если я просто проведу простой тест вроде hexdump /dev/evio | less
Я вижу данные, которые ожидаю.
Отправка обычного файла через NC, похоже, работает нормально, согласно pv
.
На самом деле у меня нет настроенного слушателя на другой стороне, но это не имеет значения, потому что это UDP, верно? Я планирую, что это будет просто спамить мой компьютер разработчика необработанными данными на этом порту, чтобы MATLAB мог запускать прослушиватель и подключаться, когда это необходимо. (Я знаю, что в долгосрочной перспективе это плохое решение, но я просто ищу простое устройство для моста MATLAB для проверки оборудования.)
Обновить:
Использование dd, кажется, немного не работает, но я не знаю, почему он работает по-другому. Я установил чтение в соответствии с размером кадра устройства:
dd if=/dev/evio bs=6144 | pv | nc -u devhost 10000
16kB 0:00:00 [1.57MB/s] [<=>
А потом мне пришлось нажать ctrl + C, чтобы закрыть его. Вывод nc из цикла, кажется, позволяет ему работать должным образом навсегда:
dd if=/dev/evio bs=6144 | pv > /dev/null
Выдает постоянно обновляемый результат PV с точно той скоростью, которую, как я знаю, генерирует устройство. pv < /dev/evio > /dev/null
также дает те же результаты, что имеет смысл. Мне не нужно читать по одному кадру за раз.