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