Чи можу я зупинити Linux від прослуховування USB-пристрою введення як клавіатури, але все ж фіксувати події за допомогою програми?


11

У мене є сканер штрих-коду USB за адресою /dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd), і сканування штрих-коду змушує його надсилати події клавіші. Я фіксую ці натискання клавіш за допомогою бібліотеки libdevinput Ruby, яка чудово працює. Проблема полягає в тому, що кожен штрих-код також вводиться як ім'я користувача, а згодом і пароль на Raspberry Pi, викликаючи безліч невдалих спроб входу. (Raspberry Pi буде без голови, а всередині мікрохвильовки.)

Як я можу перешкодити Linux бачити сканер штрих-коду як пристрій введення, а моя програма є єдиним споживачем подій? Або є інше, краще рішення?


4
Не рекомендую ставити електроніку в мікрохвильову піч. Звичайно, не працює.
Ігнасіо Васкес-Абрамс

1
Це, безумовно, сама "wtf" частина цього питання.
Братчлі

1
Дешева клітка Фарадея? Можливо, в цьому районі багато РФ.
charlesbridge

4
Ха-ха, не в мікрохвильовій піч. Все сидить за платою контролера мікрохвильової печі, і я не збираюся готувати свій Raspberry Pi. Я додаю сканер штрих-коду для інструкцій з приготування їжі, а також голосовий контроль та перероблений сенсорний панель.
ndbroadbent

Відповіді:


6

Я дізнався, що мені потрібно надіслати йоктл EVIOCGRAB на пристрій, який захоплює його для виключного використання .

Ось як це зробити в Ruby:

#!/usr/bin/env ruby
BARCODE_SCANNER = "/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd"

require 'rubygems'
require 'libdevinput'
require 'ffi'
require 'ffi/tools/const_generator'

# We need access to the file
DevInput.class_eval { attr_reader :dev }

# Look up value of EVIOCGRAB constant
cg = FFI::ConstGenerator.new('input') do |gen|
  gen.include('linux/input.h')
  gen.const(:EVIOCGRAB, '%u', '(unsigned)')
end
EVIOCGRAB = cg['EVIOCGRAB'].to_i

scanner = DevInput.new(BARCODE_SCANNER)
# Send EVIOCGRAB to scanner, which grabs it for exclusive use by our process
scanner.dev.ioctl(EVIOCGRAB, 1)


puts "Waiting for events..."
scanner.each do |event|
  # Ignore everything except key press events
  next unless event.type == 1 && event.value == 1
  puts "Key: #{event.code_str}"
end

Примітка . Вам потрібно буде встановити заголовки libdevinputgem ffi, та Linux. Якщо ви використовуєте версію Linux між 3.2.0і 3.6.11, ви можете замінити її FFI::ConstGeneratorчастину EVIOCGRAB = 1074021776, і тоді вам не потрібні ffiзаголовки або Linux.


2

Звучить якось подібне до цієї проблеми , тому я б спробував це рішення  : якщо я правильно розумію вашу проблему, сканер штрих-коду повинен з’являтися як підпорядкований покажчик "Віртуальної основної клавіатури", коли ви робите

xinput --list

Тоді, можливо, отримання ідентифікатора та змушення його плавати може допомогти:

xinput float <id>

Я думаю, що OP бачить це на консолі, а не X. Але в X це має працювати.
derobert

Ага, правильно. Плюс він уже знайшов рішення…
Skippy le Grand Gourou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.