क्या मैं एक कीबोर्ड के रूप में USB इनपुट डिवाइस को सुनने से लिनक्स को रोक सकता हूं, लेकिन फिर भी एक कार्यक्रम के साथ घटनाओं पर कब्जा कर सकता हूं?


11

मेरे पास /dev/input/event0( /dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd) पर एक यूएसबी बारकोड स्कैनर है , और बारकोड को स्कैन करने से यह कीपर ईवेंट को भेजने का कारण बनता है। मैं libdevinput रूबी लाइब्रेरी का उपयोग करके इन कीपर्स को कैप्चर कर रहा हूं , जो बहुत अच्छा काम करता है। मुद्दा यह है कि प्रत्येक बारकोड को एक उपयोगकर्ता नाम के रूप में भी दर्ज किया जाता है, और बाद में रास्पबेरी पाई पर एक पासवर्ड होता है, जिसके कारण बहुत से लॉगिन प्रयास विफल हो जाते हैं। (रास्पबेरी पाई हेडलेस होगी, और एक माइक्रोवेव के अंदर।)

मैं बारकोड स्कैनर को इनपुट डिवाइस के रूप में देखने से लिनक्स को कैसे रोक सकता हूं, और क्या मेरा प्रोग्राम एकमात्र इवेंट उपभोक्ता है? या कोई अलग, बेहतर उपाय है?


4
मैं इलेक्ट्रॉनिक्स को माइक्रोवेव में रखने की सलाह नहीं देता। निश्चित रूप से एक नहीं चल रहा है।
इग्नासियो वाज़केज़-अब्राम्स

1
यह निश्चित रूप से इस सवाल का सबसे "wtf" हिस्सा है।
ब्राचली

1
सस्ते फैराडे पिंजरे? शायद इस क्षेत्र में बहुत सारे आरएफ हैं।
charlesbridge

4
हाहाहा, माइक्रोवेव में नहीं। सब कुछ माइक्रोवेव के नियंत्रक पीसीबी के पीछे बैठता है, और मैं अपने रास्पबेरी पाई को पकाने का इरादा नहीं कर रहा हूं। मैं खाना पकाने के निर्देशों के लिए एक बारकोड स्कैनर और साथ ही साथ आवाज नियंत्रण और एक पुन: डिज़ाइन किया गया टच पैड जोड़ रहा हूं।
ndbroadbent

जवाबों:


6

मुझे पता चला कि मुझे डिवाइस में एक EVIOCGRAB ioctl भेजने की आवश्यकता है, जो इसे अनन्य उपयोग के लिए पकड़ लेता है

रूबी में यह कैसे करना है:

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

नोट : आपको libdevinputमणि ffi, और लिनक्स हेडर स्थापित करना होगा । यदि आप 3.2.0और के बीच लिनक्स संस्करण का उपयोग कर रहे हैं 3.6.11, तो आप उस FFI::ConstGeneratorहिस्से को बदल सकते हैं EVIOCGRAB = 1074021776, और फिर आपको ffiलिनक्स हेडर की जरूरत नहीं है ।


2

किसी भी तरह से इस मुद्दे के समान लगता है , इसलिए मैं इस समाधान की कोशिश करूँगा  : यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो बारकोड स्कैनर को "वर्चुअल कोर कीबोर्ड" के एक गुलाम सूचक के रूप में दिखाई देना चाहिए।

xinput --list

तब शायद इसकी आईडी प्राप्त करना और इसे तैरने के लिए मजबूर करना मदद कर सकता है:

xinput float <id>

मुझे लगता है कि ओपी इन्हें कंसोल पर देख रहा है, एक्स पर नहीं। लेकिन एक्स में यह काम करना चाहिए।
derobert

ठीक है। इसके अलावा वह पहले से ही एक समाधान मिल गया है ...
Skippy le Grand Gourou
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.