Назад | Перейти на главную страницу

Передача файла устройства по протоколу UDP с помощью netcat

Надеюсь, это лучший сайт 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 также дает те же результаты, что имеет смысл. Мне не нужно читать по одному кадру за раз.