Linux가 USB 입력 장치를 키보드로 수신하지 못하도록 방지하면서도 프로그램을 사용하여 이벤트를 계속 캡처할 수 있습니까?

Linux가 USB 입력 장치를 키보드로 수신하지 못하도록 방지하면서도 프로그램을 사용하여 이벤트를 계속 캡처할 수 있습니까?

/dev/input/event0()에 USB 바코드 스캐너가 있고 /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd바코드를 스캔하면 키 누르기 이벤트가 전송됩니다. 나는 다음을 사용하여 이러한 키 누르기를 캡처하고 있습니다.라이브러리 개발 입력Ruby 라이브러리는 훌륭하게 작동합니다. 문제는 각 바코드가 Raspberry Pi에 사용자 이름으로 입력되고 이어서 비밀번호로 입력되어 로그인 시도가 많이 실패한다는 것입니다. (라즈베리 파이에는 헤드가 없으며 전자레인지 안에 들어 있습니다.)

Linux가 바코드 스캐너를 입력 장치로 취급하는 것을 막고 내 프로그램을 유일한 이벤트 소비자로 만들려면 어떻게 해야 합니까? 아니면 다른 더 나은 해결책이 있습니까?

답변1

메일을 보내야 한다는 것을 알았습니다.EVIOCGRAB ioctl을 장치에 연결하여 독점적으로 사용.

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

노트libdevinput: gem ffi과 Linux 헤더를 설치해야 합니다 . 3.2.0과 사이의 Linux 버전을 사용하는 경우 해당 부분을 으로 교체하면 3.6.11또는 Linux 헤더가 필요하지 않습니다.FFI::ConstGeneratorEVIOCGRAB = 1074021776ffi

답변2

비슷한 것 같다이 문제, 그래서 시도해보겠습니다이 솔루션 : 귀하의 질문을 올바르게 이해했다면 이렇게 하면 바코드 스캐너가 "Virtual Core Keyboard"에 대한 슬레이브 포인터로 나타나야 합니다.

xinput --list

그런 다음 ID를 가져와 강제로 부동하도록 하면 도움이 될 수 있습니다.

xinput float <id>

관련 정보