レッドインパルスのたかけんです。
こちら、IoTLT Advent Calendar 2018 、16日目の記事になります!
はじめに
ラズパイとQRコードを組み合わせ作品例って、多いですよね。
勤怠管理とか蔵書管理とか。
Raspberry Pi 3 QRコードリーダー - Qiita
実装方法として、カメラを取り付けて画像認識でQRを読み取る方法があります。
しかしこの方法の場合、QRの読み取りの精度やそこまで良くなかったり読み取るまでに時間がかかったりなどの問題もあります。
USB接続のバーコードスキャナを使う
USB接続のバーコードスキャナを使うと、ちょっと値段はしますが、素早く、かつ正確に読み取ることができます。
構成としては、こんな感じになります。
問題
USB接続のバーコードスキャナは、外付けのキーボードとして認識されます。
なので、ラズパイでそのまま使おうとすると、入力待ちのターミナルやブラウザなどの入力フォームにカーソルがフォーカスされていないと、入力できないです。
IoTデバイスなので、ラズパイの起動が完了したらフォーカスとか気にしないで、QRコードが読めるようにしたいですね。
バックグラウンドのキー入力を取得する
バックグラウンドのキー入力を取得できるpythonライブラリを使います。
以下、サンプルコードです。
from pynput.keyboard import Key, Listener
def on_press(key):
global qr_data
# 1文字ずつqr_dataに
if str(key) != 'Key.enter':
try:
qr_data += key.char[0:1]
return
except AttributeError:
return
# 最後はenter入力になる
else:
print(qr_data)
qr_data = ''
if __name__ == '__main__':
with Listener(
on_press=on_press,
) as listener:
listener.join()
バックグラウンドのキー入力が取れるようになったら、後はカメラの場合と同じですね。
私はこの後は、pynputとWebSocketサーバをThreadで立ち上げ、キー入力の結果をWebSocketで送り、結果をラズパイに取り付けたモニタのブラウザに表示させつつ、Kintoneにデータを送るようなプログラムに作成し、Supervisorでデーモン化し、systemdで自動起動するようにしました。
余談
バックグラウンドでキー入力を取れるということは、悪用もできそう...。
使い方にはご注意ください!!
追記
MacOSだと、sudoで実行してもキー取得できなかったです。
おそらくセキュリティ対策が講じられているのかと。