Tôi có thể ngăn Linux nghe thiết bị đầu vào USB dưới dạng bàn phím nhưng vẫn ghi lại các sự kiện bằng chương trình không?


11

Tôi có một máy quét mã vạch USB tại /dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd) và quét mã vạch khiến nó gửi các sự kiện nhấn phím. Tôi đang chụp những phím bấm này bằng thư viện libdevinput Ruby, hoạt động rất tốt. Vấn đề là mỗi mã vạch cũng được nhập dưới dạng tên người dùng và sau đó là mật khẩu trên Raspberry Pi, gây ra nhiều lần thử đăng nhập thất bại. (Raspberry Pi sẽ không đầu và bên trong lò vi sóng.)

Làm cách nào tôi có thể ngăn Linux xem máy quét mã vạch là thiết bị đầu vào và chương trình của tôi là người tiêu dùng sự kiện duy nhất? Hoặc có một giải pháp khác, tốt hơn?


4
Tôi không khuyên bạn nên đặt thiết bị điện tử trong lò vi sóng. Chắc chắn không phải là một chạy.
Ignacio Vazquez-Abrams

1
Đó chắc chắn là phần "wtf" nhất của câu hỏi này.
Bratchley

1
Lồng Faraday giá rẻ? Có lẽ có rất nhiều RF trong khu vực.
charlesbridge

4
Hahaha, không phải trong lò vi sóng. Mọi thứ nằm sau bộ điều khiển PCB của lò vi sóng và tôi không có ý định nấu Raspberry Pi. Tôi đang thêm một máy quét mã vạch để hướng dẫn nấu ăn, cũng như điều khiển giọng nói và bàn phím cảm ứng được thiết kế lại.
ndbroadbent

Câu trả lời:


6

Tôi phát hiện ra rằng tôi cần gửi một ioctl EVIOCGRAB đến thiết bị để lấy nó để sử dụng độc quyền .

Đây là cách thực hiện trong 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

Lưu ý : Bạn sẽ cần cài đặt các tiêu đề libdevinputđá quý ffivà Linux. Nếu bạn đang sử dụng phiên bản Linux giữa 3.2.03.6.11, bạn có thể thay thế FFI::ConstGeneratorphần đó bằng EVIOCGRAB = 1074021776, và sau đó bạn không cần ffihoặc tiêu đề Linux.


2

Âm thanh nào đó tương tự như vấn đề này , vì vậy tôi sẽ thử giải pháp này  : nếu tôi hiểu chính xác vấn đề của bạn, máy quét mã vạch sẽ xuất hiện dưới dạng con trỏ nô lệ của "Bàn phím lõi ảo" khi bạn thực hiện

xinput --list

Sau đó, có thể nhận được ID của nó và buộc nó nổi có thể giúp:

xinput float <id>

Tôi nghĩ OP đang nhìn thấy những thứ này trên bảng điều khiển, không phải X. Nhưng trong X thì nó sẽ hoạt động.
derobert

À, đúng rồi. Thêm vào đó, anh ta đã tìm thấy một giải pháp
Skippy le Grand Gourou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.