ndb*_*ent 11 linux debian devices events
我在/dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd)处有一个 USB 条码扫描器,扫描条码会导致它发送按键事件。我正在使用libdevinput Ruby 库捕获这些按键,这很好用。问题是每个条形码也作为用户名输入,随后在 Raspberry Pi 上输入密码,导致大量登录尝试失败。(Raspberry Pi 将是无头的,并在微波炉内。)
如何阻止 Linux 将条码扫描器视为输入设备,并使我的程序成为唯一的事件使用者?或者有不同的更好的解决方案吗?
我发现我需要向设备发送一个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
Run Code Online (Sandbox Code Playgroud)
注意:您需要安装libdevinputgem ffi、 和 Linux 头文件。如果您在3.2.0和之间使用 Linux 版本3.6.11,则可以用 替换该FFI::ConstGenerator部分EVIOCGRAB = 1074021776,然后就不需要ffi或 Linux 头文件。