Linux'un USB giriş cihazını klavye olarak dinlemesini engelleyebilir, ancak yine de bir programla olay yakalayabilir miyim?


11

/dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd) Konumunda bir USB barkod tarayıcım var ve bir barkodu taramak tuşa basma olayları göndermesine neden oluyor. Bu keypressleri , harika çalışan libdevinput Ruby kütüphanesini kullanarak yakalıyorum . Sorun, her barkodun bir kullanıcı adı olarak girilmesi ve daha sonra Raspberry Pi'ye bir şifre girerek birçok başarısız giriş denemesine neden olmasıdır. (Raspberry Pi başsız ve mikrodalga içinde olacaktır.)

Linux'un barkod tarayıcıyı bir giriş cihazı olarak görmesini nasıl engelleyebilirim ve programımın tek olay tüketicisi olmasını nasıl sağlayabilirim? Yoksa farklı, daha iyi bir çözüm var mı?


4
Elektroniği mikrodalga fırına koymanızı tavsiye etmiyorum. Kesinlikle çalışan bir tane değil.
Ignacio Vazquez-Abrams

1
Bu kesinlikle bu sorunun en "wtf" kısmıdır.
Bratchley

1
Ucuz Faraday kafesi? Belki bölgede çok fazla RF var.
charlesbridge

4
Hahaha, mikrodalgada değil. Her şey mikrodalga fırınının PCB'sinin arkasında oturuyor ve Raspberry Pi'mi pişirmek istemiyorum. Pişirme talimatları için bir barkod tarayıcı, ses kontrolü ve yeniden tasarlanmış bir dokunmatik yüzey ekliyorum.
ndbroadbent

Yanıtlar:


6

Cihaza özel kullanım için bir EVIOCGRAB ioctl göndermem gerektiğini öğrendim .

Ruby'de şu şekilde yapabilirsiniz:

#!/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

Not : libdevinputgem ffive Linux başlıklarını yüklemeniz gerekir . Eğer arasında bir Linux sürümü kullanıyorsanız 3.2.0ve 3.6.11, sen yerini alabilecek FFI::ConstGeneratorolan kısmını EVIOCGRAB = 1074021776ve sonra gerek yoktur ffiveya Linux başlıkları.


2

Bu soruna bir şekilde benziyor, bu yüzden bu çözümü denerdim  : Sorununuzu doğru anlarsam, barkod tarayıcısı "Sanal çekirdek klavye" nin köle işaretçisi olarak görünmelidir.

xinput --list

O zaman belki kimliğini almak ve yüzmeye zorlamak yardımcı olabilir:

xinput float <id>

Bence OP bunları X üzerinde değil konsolda görüyor. Ama X'te bu işe yaramalı.
derobert

Ah doğru. Artı zaten bir çözüm buldu…
Skippy le Grand Gourou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.