Считыватель карт linux

В настоящее время у меня есть устройство USB-карт, подключенное к встроенной машине Linux, и, насколько я могу судить, и из того, что я исследовал, оно действует как клавиатура и вводит все данные, как если бы я печатал. Теперь у меня есть Perl-скрипт, который берет все эти данные и сохраняет их в файл. Единственная проблема заключается в том, что он знает, что нужно брать данные только тогда, когда Perl-скрипт выполняется на переднем плане, в противном случае, куда вводит "клавиатура".

У меня вопрос, как я могу заставить эту карту смахивать запускать скрипт каждый раз, когда он читает ввод? Или я мог бы как-то захватить данные с приложением, работающим в фоновом режиме. IE в программе на С ++, работающей в фоновом режиме, будет читать любой ввод на машине?

Я никогда не возился с кард-ридером, поэтому я не уверен на 100%, как они работают.

Любые предложения по этому вопросу будут оценены!

4 ответа

Решение

У меня есть идея, но она очень общая.

Можете ли вы постоянно отслеживать данные в другой программе, буферизировать их, а затем направлять результаты в ваш Perl-скрипт, когда буфер достигает определенного размера или работает в течение определенного периода времени без активности? Если вы передадите его по конвейеру, вам не нужно будет модифицировать свой Perl-скрипт, так как он все еще будет на STDIN.

Итак, это было бы так:

Программа мониторинга -> собирает данные -> передает их в вашу программу Perl

Я надеюсь, что эта идея полезна.

Брайан Дж. Стинар

Я сделал почти точно это (кроме USB-считывателя штрих-кода, который появился как клавиатура).

В моей системе есть настраиваемое правило горячей замены USB, которое определяет USB-устройство, когда оно подключено, на основании его поставщика и идентификатора продукта. Это правило создает символическую ссылку на соответствующий event устройство в /dev/input/,

Затем у меня есть демон C, который работает постоянно. Это смотрит /dev/input/ каталог, и когда он видит символическую ссылку, он открывает event устройство. Затем он использует EVIOCGRAB IOCTL для захвата устройства событий для исключительного использования (это предотвращает появление данных в виде ввода с клавиатуры в других приложениях) и считывает события ввода, соответствующие нажатиям клавиш. Демон преобразует нажатия клавиш в символы и сохраняет их в базе данных.

cin будет считывать ввод с подключенного терминального устройства ввода. Не зная больше о дизайне вашего программного обеспечения, моя первая догадка - чтение данных из сценария Perl - не лучший выбор дизайна. Я могу читать ИК-пульты на встроенных устройствах Linux, используя скрипт Perl, как вы описываете, но в целом я взаимодействую напрямую с аппаратным обеспечением или предоставленным поставщиком API из моего основного приложения. Был ли предоставлен API для вашего картридера?

Как называется устройство чтения карт памяти, когда оно подключено к вашей машине (/dev/*)? Я бы открыл это и прочитал бы так.

Я никогда не имел дело с этим в Linux. Однако это звучит очень похоже на то, что я видел в Windows.

По моему опыту, многие из этих типов устройств автоматически определяются операционной системой как устройства типа клавиатуры. Таким образом, любой ввод от считывателя подается в тот же поток клавиатуры, который использует настоящая клавиатура. К тому времени, когда это достигнет реальных программ, уже невозможно будет определить разницу между вводом данных с карт-ридера и тем, что пользователь просто очень быстро печатает.

Как следствие, вы получаете поведение, описанное в первоначальном вопросе: ввод устройства чтения карт идет только туда, куда поступает нормальный ввод с клавиатуры - в фокусе программы.

Лучшим вариантом будет изучить веб-сайт производителя (или иным образом связаться с ним) и выяснить, предоставляют ли они какой-либо драйвер, который позволил бы программе перехватывать этот ввод полностью отдельно от потока клавиатуры.

Если производитель не предоставляет такую ​​вещь, возможно, некоторые сторонние производители. Но, к сожалению, я никогда не исследовал это, поэтому я не знаю, где вам сказать, чтобы даже начать искать.

Другие вопросы по тегам