(Felica/Mifare/NFC チャレンジシリーズ) その他の記事はこちら 「Felica/Mifare/NFC でいろいろ実験」
https://qiita.com/nanbuwks/items/1f416d6e45a87250ee0a
nfcpy は Python で NFC を使うための モジュール。
Sonyの以下のPaSoRiカードリーダーに対応している。
- RC-S330
- RC-S360
- RC-S370
- RC-S380/S
- RC-S380/P
このほか、NXPの以下のNFCチップを使ったカードリーダーにも対応しているらしい(インターフェースやバージョンの確認が必要)。
- PN531, PN532, PN533
を使ったカードリーダーにも対応しているらしい。
なお、 SONY RC-S300 や RC-S300/S、 RC-S350は使えないっぽい?
今回は、RC-S380/Pを使って試してみた。
環境
(2022/03/16追記)
RaspberryPi でも同様に確認できました。
- Raspberry Pi Model B+ V1.2
- Raspberry Pi OS Lite armhf-2020-12-04
- Python 3.7.3
インストール
$ sudo apt install libusb-dev python3-usb
$ sudo pip3 install nfcpy
いろいろと設定
まずは動かしてみると
$ python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
** found usb:054c:06c3 at usb:003:029 but access is denied
-- the device is owned by 'root' but you are 'nanbuwks'
-- also members of the 'root' group would be permitted
-- you could use 'sudo' but this is not recommended
-- better assign the device to the 'plugdev' group
sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
sudo udevadm control -R # then re-attach device
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
USB のアクセスに権限が必要ということなので、とりあえず sudo を使って回避してみる。
Ubuntu 20.04 の場合は、以下のようなメッセージが出ました。
$ sudo python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
** found usb:054c:06c3 at usb:003:004 but it's already used
-- scan sysfs entry at '/sys/bus/usb/devices/3-1.2:1.0/'
-- the device is used by the 'port100' kernel driver
-- this kernel driver belongs to the linux nfc subsystem
-- you can remove it to free the device for this session
sudo modprobe -r port100
-- and blacklist the driver to prevent loading next time
sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf'
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
と出たので、指示通り以下の作業を行う。なお、RaspberryPiではこの作業は必要ありませんでした。
$ sudo modprobe -r port100
これについては、ドキュメント
によると PaSoRi RC-S380/P が NFC チップとして Port100 とある。これは何かな?
RC-S380/P 内部は NXP OM5570 と STM32F103TBU6 が入っていて、 STM32F103TBU6 の USB 機能を使っていました。
このような構成でのドライバが Port100 かな? おそらく Sony の RC-S380/S と RC-S380/P を使うときにこの作業が必要ぽいです。
Port100 は linux-nfc-subsystem でサポートされているらしく自動でドライバモジュールがロードされます。しかし nfcpy は Linux NFC Subsystem を使わないのでドライバモジュールを削除する必要があるらしいです。
以下はカードリーダーつなげていない状態。
$ sudo python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
エラーは消えているみたいなのでカードリーダーつなげて再度実行。
$ sudo python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.8.10
on Linux-5.11.0-43-generic-x86_64-with-glibc2.29
I'm now searching your system for contactless devices
** found SONY RC-S380/P NFC Port-100 v1.11 at usb:003:008
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
カードリーダーが認識されています。
さて、先に出ていたサジェスチョンの通り設定をし直してみます。
$ sudo adduser pi plugdev
$ sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
$ sudo udevadm control -R
sudo adduser pi の pi のユーザ名は適宜変更、また、Ubuntu20.04の場合は以下も作業が必要かな。
$ sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf'
これで適宜再起動や PaSoRi RC-S380/Pを繋ぎ直しなどを行い、再度テストします。
以下は RaspberryPi の場合。
$ python3 -m nfc
This is the 1.0.3 version of nfcpy run in Python 3.7.3
on Linux-5.10.63+-armv6l-with-debian-10.11
I'm now searching your system for contactless devices
** found SONY RC-S380/P NFC Port-100 v1.11 at usb:001:007
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
うまく認識できています。
サンプルプログラムを実行する
以下にある、examples/tagtool.py を使ってみます。
$ sudo python3 examples/tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:003:075
** waiting for a tag **
Type2Tag ID=038B4F03
以下はRaspberryPi上で、nanaco カードをかざしてみた挙動です。
$ python3 tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:007
** waiting for a tag **
[nfc.clf] [Errno 19] No such device
$ python3 tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:010
** waiting for a tag **
Type3Tag 'FeliCa Standard (RC-S960)' ID=0114B4276B115A23 PMM=0F0D23042F7783FF SYS=8B61
$ python3 tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:011
** waiting for a tag **
Type3Tag 'FeliCa Standard (RC-S960)' ID=0114B4276B115A23 PMM=0F0D23042F7783FF SYS=8B61
$ python3 tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:018
** waiting for a tag **
[nfc.clf.transport] USBErrorPipe()
[nfc.clf] [Errno 5] Input/output error
[nfc.clf.transport] USBErrorPipe()
$ python3 tagtool.py
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:024
** waiting for a tag **
Type2Tag ID=F26B7B3E
5回試して成功が2回でした。ちょっと不安定ぽいです。