Dapatkah saya menghentikan Linux dari mendengarkan perangkat input USB sebagai keyboard, tetapi masih menangkap acara dengan program?

11

Saya memiliki pemindai kode batang USB di /dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd), dan pemindaian kode batang menyebabkannya mengirim acara yang menekan tombol. Saya menangkap penekanan tombol ini menggunakan pustaka Ruby libdevinput , yang bekerja sangat baik. Masalahnya adalah bahwa setiap barcode juga dimasukkan sebagai nama pengguna, dan selanjutnya kata sandi pada Raspberry Pi, menyebabkan banyak upaya login yang gagal. (The Raspberry Pi akan tanpa kepala, dan di dalam microwave.)

Bagaimana saya bisa menghentikan Linux dari melihat pemindai barcode sebagai perangkat input, dan program saya menjadi konsumen acara tunggal? Atau adakah solusi yang berbeda dan lebih baik?

ndbroadbent
sumber
4
Saya tidak merekomendasikan memasukkan elektronik ke dalam microwave. Tentu saja bukan yang berjalan.
Ignacio Vazquez-Abrams
1
Itu jelas bagian yang paling "wtf" dari pertanyaan ini.
Bratchley
1
Kandang Faraday murah? Mungkin ada banyak RF di daerah tersebut.
charlesbridge
4
Hahaha, bukan DI microwave. Semuanya ada di belakang PCB pengontrol gelombang mikro, dan saya tidak bermaksud memasak Raspberry Pi saya. Saya menambahkan pemindai barcode untuk instruksi memasak, serta kontrol suara dan panel sentuh yang dirancang ulang.
ndbroadbent

Jawaban:

6

Saya mengetahui bahwa saya perlu mengirim EVIOCGRAB ioctl ke perangkat, yang mengambilnya untuk penggunaan eksklusif .

Berikut cara melakukannya di 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

Catatan : Anda harus menginstal libdevinputgem ffi,, dan header Linux. Jika Anda menggunakan versi Linux antara 3.2.0dan 3.6.11, Anda dapat mengganti FFI::ConstGeneratorbagian dengan EVIOCGRAB = 1074021776, dan kemudian Anda tidak perlu ffiatau header Linux.

ndbroadbent
sumber
2

Kedengarannya mirip dengan masalah ini , jadi saya akan mencoba solusi ini  : jika saya memahami dengan benar masalah Anda, pemindai barcode akan muncul sebagai penunjuk slave "Virtual core keyboard" ketika Anda melakukannya.

xinput --list

Maka mungkin mendapatkan ID-nya dan memaksanya mengapung dapat membantu:

xinput float <id>
Skippy le Grand Gourou
sumber
Saya pikir OP melihat ini di konsol, bukan X. Tapi di X ini seharusnya bekerja.
derobert
Ah benar Ditambah lagi dia sudah menemukan solusi ...
Skippy le Grand Gourou