nfcpy と PaSoRi RC-S380/P  をセットアップ

(Felica/Mifare/NFC チャレンジシリーズ)  その他の記事はこちら 「Felica/Mifare/NFC でいろいろ実験」
https://qiita.com/nanbuwks/items/1f416d6e45a87250ee0a

-----


nfcpy は Python で NFC を使うための モジュール。

https://nfcpy.readthedocs.io/en/latest/index.html

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を使って試してみた。

# 環境

- Sony PaSoRi RC-S380/P
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/33edd60e-92a5-30a5-e00d-e00cca90b7c7.png)

- Ubuntu 20.04 LTS AMD64
- Python 3.8.10
- 1.0.3 version of nfcpy


(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
```

これについては、ドキュメント

https://nfcpy.readthedocs.io/en/latest/overview.html#supported-devices

によると PaSoRi RC-S380/P が NFC チップとして Port100 とある。これは何かな？
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8c89182f-1f90-f14b-179f-b545b7dcff7f.png)
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  を使ってみます。
 
https://github.com/nfcpy/nfcpy


手持ちのタグを近づけると反応しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4049e064-1fe2-fe4b-7acd-b889e46870d5.png)

```

$ 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回でした。ちょっと不安定ぽいです。