считыватель карт памяти - PullRequest
0 голосов
/ 15 сентября 2010

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

Мой вопрос: как я могу заставить эту карту смахивать запускать скрипт каждый раз, когда он читает ввод? Или я мог бы как-то захватить данные с приложением, работающим в фоновом режиме. И.Е. в программе на c ++, работающей в фоновом режиме, будет ли cin читать ЛЮБОЙ ввод на машину?

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

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

Ответы [ 4 ]

5 голосов
/ 16 сентября 2010

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

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

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

1 голос
/ 15 сентября 2010

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

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

1 голос
/ 16 сентября 2010

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

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

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

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

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

1 голос
/ 15 сентября 2010

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

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

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

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

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

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

...