Linuxがキーボード入力としてUSB入力デバイスをリッスンするのを止めても、プログラムでイベントをキャプチャできますか?


11

/dev/input/event0/dev/input/by-id/usb-Metrologic_Metrologic_Scanner-event-kbd)にUSBバーコードスキャナーがあり、バーコードをスキャンするとキープレスイベントが送信されます。私はlibdevinput Rubyライブラリを使用してこれらのキープレスをキャプチャしています。問題は、各バーコードがユーザー名としても入力され、続いてRaspberry Piでパスワードが入力されるため、ログイン試行が何度も失敗することです。(Raspberry Piはヘッドレスで、電子レンジ内にあります。)

Linuxがバーコードスキャナーを入力デバイスとして認識しないようにして、プログラムを唯一のイベントコンシューマーにするにはどうすればよいですか?または、別のより良い解決策はありますか?


4
電子機器を電子レンジに入れることはお勧めしません。確かに実行中のものではありません。
Ignacio Vazquez-Abrams 2013年

1
それは間違いなくこの質問の最も「wtf」の部分です。
Bratchley 2013年

1
安いファラデーケージ?たぶん、その地域にはたくさんのRFがあります。
チャールズブリッジ2013年

4
ははは、電子レンジではありません。すべてが電子レンジのコントローラーPCBの後ろにあり、Raspberry Piを調理するつもりはありません。料理の指示用のバーコードスキャナーと、音声コントロールと再設計されたタッチパッドを追加します。
ndbroadbent 2013年

回答:


6

デバイスにEVIOCGRAB ioctlを送信する必要があることがわかりました。

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ヘッダーをインストールする必要があります。3.2.0との間のLinuxバージョンを使用している場合は3.6.11FFI::ConstGeneratorパーツをEVIOCGRAB = 1074021776で置き換えることができますffi。そうすると、またはLinuxヘッダーは不要になります。


2

どういうわけかこの問題に似ているので、私はこの解決策を試してみます  :あなたの問題を正しく理解していれば、バーコードスキャナーは「仮想コアキーボード」のスレーブポインターとして表示されるはずです

xinput --list

次に、おそらくそのIDを取得してフロートさせると、

xinput float <id>

OPはXではなくコンソールでこれらを表示していると思います。しかし、Xではこれでうまくいくはずです。
derobert 2013年

ああ、そうです。さらに、彼はすでに解決策を見つけました…
Skippy le Grand Gourou 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.