ฉันสามารถหยุดลีนุกซ์จากการฟังอุปกรณ์อินพุต USB เป็นแป้นพิมพ์ แต่ยังจับภาพเหตุการณ์ด้วยโปรแกรมได้หรือไม่?


11

ฉันมีเครื่องสแกนบาร์โค้ด USB ที่/dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd) และการสแกนบาร์โค้ดทำให้มันส่งกิจกรรมกดปุ่ม ฉันจับปุ่มกดเหล่านี้โดยใช้ไลบรารี libdevinput Ruby ซึ่งใช้งานได้ดี ปัญหาคือบาร์โค้ดแต่ละอันถูกป้อนเป็นชื่อผู้ใช้และรหัสผ่านใน Raspberry Pi ทำให้เกิดความพยายามในการเข้าสู่ระบบล้มเหลวเป็นจำนวนมาก (ราสเบอร์รี่ Pi จะไม่มีหัวและอยู่ในไมโครเวฟ)

ฉันจะหยุด Linux ไม่ให้มองเห็นเครื่องสแกนบาร์โค้ดเป็นอุปกรณ์ป้อนข้อมูลและให้โปรแกรมของฉันเป็นผู้ใช้งานกิจกรรมได้หรือไม่? หรือมีวิธีอื่นที่ดีกว่า


4
ฉันไม่แนะนำให้วางอุปกรณ์อิเล็กทรอนิกส์ลงในไมโครเวฟ ไม่แน่นอนอย่างใดอย่างหนึ่งที่ทำงานอยู่
Ignacio Vazquez-Abrams

1
นั่นเป็นส่วนที่ "wtf" ที่สุดของคำถามนี้
Bratchley

1
กรงฟาราเดย์ราคาถูก อาจมี RF จำนวนมากในพื้นที่
charlesbridge

4
ฮ่าฮ่าฮ่าไม่ใช่ในไมโครเวฟ ทุกอย่างอยู่ด้านหลัง PCB คอนโทรลเลอร์ของไมโครเวฟและฉันไม่ได้ตั้งใจจะปรุงราสเบอร์รี่ Pi ของฉัน ฉันกำลังเพิ่มเครื่องสแกนบาร์โค้ดสำหรับคำแนะนำในการปรุงอาหารรวมถึงการควบคุมด้วยเสียงและทัชแพดที่ออกแบบใหม่
ndbroadbent

คำตอบ:


6

ฉันพบว่าฉันจะต้องส่งIOCTL EVIOCGRAB ไปยังอุปกรณ์ที่คว้ามันสำหรับการใช้งานพิเศษ

นี่คือวิธีการทำใน 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.0และ3.6.11คุณสามารถแทนที่FFI::ConstGeneratorส่วนด้วยEVIOCGRAB = 1074021776แล้วคุณไม่ต้องการffiหรือส่วนหัว Linux


2

ฟังดูคล้ายกับปัญหานี้ดังนั้นฉันจะลองวิธีแก้ปัญหานี้  : ถ้าฉันเข้าใจปัญหาของคุณอย่างถูกต้องเครื่องสแกนบาร์โค้ดควรปรากฏเป็นตัวชี้สลาฟของ "แป้นพิมพ์เสมือนจริง" เมื่อคุณทำ

xinput --list

จากนั้นอาจได้รับ ID และการบังคับให้ลอยอาจช่วย:

xinput float <id>

ฉันคิดว่า OP เห็นสิ่งเหล่านี้บนคอนโซลไม่ใช่ X แต่ใน X สิ่งนี้น่าจะใช้ได้
Derobert

อ่าใช่มั้ย รวมทั้งเขาได้ค้นพบวิธีการแก้ปัญหา ...
Skippy le Grand Gourou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.