nfcpyにおけるタイムアウト処理
nfcpyを利用してカード情報を読み取る際のタイムアウト処理について考えます。
nfcpy
nfcpyと非接触型のデバイスを使って、NFC対応のカードから情報を読み取ることができます。
今回はPaSoRiのRC-S380を利用しています。対応デバイスは公式を確認してください。
カード情報を読み取る簡単なコードは以下のようになります。
これだとカードの読み取りが行われるまで(カードが置かれ、離されるまで)待ち続けてしまいます。
nfcpyにおいて、以下のように実装されていることで読み込み待機が発生しています。
# nfc/clf/__init__.py
...
...
= # (1)
...
# (2)
...
...
(1) デフォルトのterminateはlambda: Falseと設定されています。
(2) これにより、terminate()がFalseを返し続け、永遠に読み取りを行おうとします。
timeout
つまり、connectの引数にterminate=を与えることで、タイムアウト処理を実装できます。
公式のサンプルを参考に、5秒後に待機をやめるようにするには以下のようになります。
nfcpy : nfc.clf.ContactlessFrontend.connect
return - >
=
= 5
”読み取りを開始した時間(started)から、5秒後(wait_s)にTureが返るような関数”をterminateに渡すことでタイムアウト処理を実装することができました。
これだとカードを置いている状態でも、タイムアウトが実行されてしまいます。
そこで、カードが置かれている場合はタイムアウト処理を停止させます。
= False
= True
return True
= False
return True
return - > and not
=
=
'on-connect'と'on-release'のオプションを追加してあげることで、カードの読み込み開始と終了を確認できます。
これでon_cardがTrueの際(カードが置かれたままの状態)には、タイムアウト処理が停止します。
外部制御
このterminateを利用することで、別の場所から読み込み待機を解除することが可能になります。
= False
=True
外からflagをTrueにすることで、読み込み待機を解除できました。
この実装により、カード読み込みとカード登録などを一台の非接触形のデバイスでカバーできるようになります。