スキャン時にカードリーダーにファイルを生成させるにはどうすればよいですか?

スキャン時にカードリーダーにファイルを生成させるにはどうすればよいですか?

ラズベリーパイ4とHIDオムニキ5427G2。カードをスキャンすると、カードリーダーはキーボードとして機能し、カードに対応する一連の7桁の数字を入力します。これはうまくいきますが、テキストファイルまたはテキストフィールドのキーボードを開いて選択するかのように入力します。

私が望むのは、カードがスキャンされたときにスキャンから得られた番号が "scan.txt"ファイルに保存され、どこかに保存されることです。どうすればいいですか?

また、番号をファイルに保存すると、自動的にシェルスクリプトを呼び出すことを望みます。スクリプトを作成したので、スキャンから呼び出すだけです。

よろしくお願いします!

答え1

「高速で汚れた」解決策は、無限に繰り返されるbashスクリプトを実行することです。

#!/bin/bash
while read scan; do
    scandate=$(date +"%F_%T.%N")
    echo "$scan" >> /tmp/scan_$scandate.log
    cat /tmp/scan_$scandate.log &
done

アプリケーションの代わりにcat /tmp/scan_$scandate.logスキャンされた入力に対していくつかの操作を実行します。このスクリプトでは、スキャンしたデータを処理することもできます。

スキャナー/キーボードから入力を読む機能は、キーボードをブロックし、Piをその機能専用に使用することに注意してください。

答え2

あなたが望むものは基本的に簡単ですキーロガー

お使いのデバイスは次のことができます。キーボードエミュレーション、Linuxでは、キーボードデバイスは次のとおりです。文書だから、できます標準入力リダイレクト

または、次のプログラムを使用できます。ログキー(既にディストリビューションでパッケージとして提供される場合があります。)追加文書ここまた。

システムにインストールされているキーボード以外の特定のデバイスからのみ入力をキャプチャする場合は、デバイスを識別する必要があります。/dev/input/たとえば、パスやIDでデバイスを検索します。

logkeys -d, --device=deviceオプションを使用すると、正しいデバイスでイベントをフィルタリングするのに役立ちます。

正しいデバイス識別子をテストして見つけるのに役立つevtest、xinputなどの他の便利なツールがあります。

以下を設定することもできます。ウデブデバイスが接続されているときにプログラムを実行したり特定のタスクを実行したりするデバイスのルール(紹介udev チュートリアル)。私はudevの経験はあまりありませんが、このようにリダイレクトを設定することは可能です。唯一の障害は、文字の代わりに単純な文字を取得することです。元の入力、またはあなたがそれをデコードする責任があるはずです。

別のオプションは、次のものを使用することです。python-evdevライブラリPythonが好きで、/dev/input/whatever-your-keyboard-is-usingでイベントを監視している場合。

udevルールを試してみましょう。一時的なテキストファイルも気にせず、デバイスのイベントを監視してそれに反応するだけです。


修正する

私はバーコードスキャナーでいくつかのテストを行いましたが、キーボードのように動作するので、システムの観点からは技術的にカードリーダーに似ています。

まず、知っておくべき興味深いのは、次のような結果が得られることです。排他アクセスこの機能を使用してHIDデバイスに接続しますEVIOCGRAB。つまり、アプリが端末に代わって不要な入力を送信したり、他のウィンドウを妨げたりしないようにすることができます。あなたはこれが欲しいかもしれません。

evtest(上記の)--grabパラメータもあることに注意してください。

また、以前はpython-evdevについて言及したことがあり、これはデバイスから入力をキャプチャするために使用できます。grab()機能もあります。

python-evdevを使用するためにrootは必要ありませんが、権限を調整する必要があるかもしれません。彼らから文書:

デバイスが表示されない場合は、ユーザーが読み取り/書き込みアクセス権を持つ正しいグループ(通常は入力グループ)にあることを確認してください。

グループに自分を追加するには:

usermod -a -G input user

その後、もう一度ログインしてください。 (これが完了すると、evtestはroot以外のユーザーにも機能します)。

以下はコード例です。バーコードTTY入力をPythonに「ルーティング」する方法は?私のために働いたもう一つのこと:独自のキーボード-evdev.py

これで、bashだけを使用してこれをエレガントに実行する方法があるかどうかわかりません。しかし、PythonやCは実行可能なアプローチです。

関連情報