我可以停止Linux作为键盘来监听USB输入设备,但仍通过程序捕获事件吗?


11

我在/dev/input/event0/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd)处有一个USB条形码扫描仪,扫描条形码会使它发送按键事件。我正在使用libdevinput Ruby库捕获这些按键,效果很好。问题在于,每个条形码也要作为用户名输入,然后在Raspberry Pi上输入密码,从而导致很多登录尝试失败。(Raspberry Pi将无头,并且位于微波炉内。)

如何阻止Linux将条形码扫描仪视为输入设备,并使我的程序成为唯一的事件使用者?还是有其他更好的解决方案?


4
我不建议将电子设备放在微波炉中。当然不是一个正在运行的。
Ignacio Vazquez-Abrams

1
那绝对是这个问题最重要的部分。
布拉奇利

1
便宜的法拉第笼?也许该地区有很多RF。
查尔斯布里奇

4
哈哈哈,不是在微波炉里。一切都放在微波炉的控制器PCB后面,我不想煮我的Raspberry Pi。我要添加条形码扫描仪来烹饪,以及语音控制和重新设计的触摸板。
ndbroadbent

Answers:


6

我发现我需要将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

注意:您需要安装libdevinputgem ffi,和Linux标头。如果您正在使用之间的Linux版本的3.2.03.6.11,可以更换FFI::ConstGenerator用零件EVIOCGRAB = 1074021776,然后你不需要ffi或Linux头。


2

听起来在某种程度上类似于此问题,所以我将尝试以下解决方案  :如果我正确理解了您的问题,那么在执行此操作时,条形码扫描仪应显示为“虚拟核心键盘”的从属指针。

xinput --list

然后也许获取其ID并强制其浮动可能会有所帮助:

xinput float <id>

我认为OP在控制台而不是X上看到了这些。但是在X中这应该可以工作。
derobert

嗯对 另外,他已经找到了解决方案……
Skippy le Grand Gourou 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.