開発環境
- Ubuntu LTS 20.04
- Python 3.9
- nfcpy 1.0.3
パッケージのインストール
pip install nfcpy
コード
main.py
import nfc # import時はnfcであることに注意
import binascii
NFC_READER_ID = "usb:054c:06c3" # Sony RC-S380は全てこのID. lsusbコマンドで確認可能.
class NFCReader:
def on_connect(self, tag):
self.idm = binascii.hexlify(tag._nfcid).decode()
print(f"IDm detected: {self.idm}")
return True
def read(self):
clf = nfc.ContactlessFrontend(NFC_READER_ID)
try:
clf.connect(rdwr={"on-connect": self.on_connect}) # タッチされた時のみon_connectメソッドが発火
finally:
clf.close()
if __name__ == "__main__":
client = NFCReader()
while True:
client.read()
Ubuntuで実行する際の注意点
Ubuntu環境で上記スクリプトを実行する場合は、予めUbuntuのOSの設定を上書きしておく必要がある。
以下の[方法1] or [方法2]を行うことで、設定を上書きする。
[方法1-1]udevの設定
デフォルトではUSBデバイスにroot
権限でしかアクセスできないような設定になっているので、udevの設定を上書きする必要がある。
/etc/udev/rules.d/90-nfc.rules
SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP="plugdev"
※ファイルは新規作成の必要アリ, 再起動の必要アリ
[方法1-2]ポートのブラックリスト登録
UbuntuでSony RC-S380を利用すると、自動で対応するドライバが適用され、それが競合することによってPythonスクリプトが実行できない場合がある。ブラックリストに登録しておくことで、起動時のドライバ読み込みを無効化することができる。
/etc/modprobe.d/blacklist-nfc.conf
blacklist port100
※ファイルは新規作成の必要アリ, 再起動の必要アリ
[方法2]両方の設定をするスクリプトを実行
init.sh
cat << 'EOS' | sudo tee -a /etc/udev/rules.d/90-nfc.rules
SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP="plugdev"
EOS
cat << 'EOS' | sudo tee -a /etc/modprobe.d/blacklist-nfc.conf
blacklist port100
EOS
sudo udevadm control -R
上記スクリプトを実行することで、両方の設定を上書きすることができる。
※再起動の必要アリ
参考記事