RaspberryPiでRC-S380を複数使用してみる

RaspberryPiでRC-S380を複数使用してみる

以前のエントリーでRC-S380を使用しました。

uepon.hatenadiary.com

その後、とあることで、複数のFelicaリーダを使用することが必要なネタがでてきました。 一般的には複数使用することなんてないと思いますが、メモとして残しておきます。


複数デバイスがあった時の判別

USBデバイスはたとえ同一のデバイスが接続されたとしてもlsmodで判別することができます。 lsmodコマンドを実行すると以下のようになります。

~ $ lsusb
Bus 001 Device 005: ID 054c:06c3 Sony Corp. 
(以降略)

この時に表示されるBusとDeviceの値を使えばよいのです(Deviceの数値に関しては環境によって異なります)。 この表示はRC-S380を一つ接続した時の表示で、自分の環境で2つ接続した場合には下記のようになります。

~ $ lsusb
Bus 001 Device 006: ID 054c:06c3 Sony Corp. 
(以降略)
Bus 001 Device 005: ID 054c:06c3 Sony Corp. 
(以降略)

この値を使用することでどちらのデバイスを使っているのかわかります。

tagtoolでデバイス指定して実験する

以前も使用したnfcpyライブラリを使用してFelicaの読み取り実験するのですが、nfcpyはGitでCloneする便利なツールである tagtoolも同時にインストールしてくれます。

まずは実行してみます。

$ python ./nfcpy-0.11.0/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:001:006

特にオプションスイッチをつけないで実行すると、 usb:001:006という表示になっていることからもわかるように、後からつけたリーダーをターゲットにしているようです。

tagtoolのドキュメントを確認すると…

tagtool.py — nfcpy latest documentation

--device PATHというオプションスイッチがあるので、lsmodの情報を使って指定を行えば、個別で使えるようです。

$ python ./nfcpy-0.11.0/examples/tagtool.py --device usb:001:005
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:005

となり、複数の使い分けができることがわかります。


pythonからnfcpyで複数のデバイスを使用する

コマンドラインツールからできるのはわかったので今度は自作のpythonプログラムから使い分けができるか確認したいと思います。

pythonの対話側のインターフェースで確認をしていきます。

>>> import sys
>>> sys.path.insert(1, '/home/pi/nfcpy-0.11.0')
>>> import nfc
>>> clf = nfc.ContactlessFrontend('usb:001:005')
>>> print(clf)
SONY RC-S380/P on usb:001:005
>>> def connected(tag): print(tag); return False
...
>>> clf.connect(rdwr={'on-connect': connected})
>>> a = clf.connect(rdwr={'on-connect': connected})
Type3Tag 'FeliCa Standard (RC-S???)' ID=XXXXXXXXXXXXXXXX PMM=XXXXXXXXXXXXXXXX SYS=0003

(注意)XXXXXXXXXXXXXXXXはIDなどを伏字にしていますが、実際にはちゃんとした値が表示されます。

ContactlessFrontend()の引数にBusとDeviceのIDを指定することで動作します。

【サンプル: readIDm.py】

#!/usr/bin/env python

import sys
sys.path.insert(1, '/home/pi/nfcpy-0.11.0')
import nfc
clf = nfc.ContactlessFrontend('usb:001:005')
def connected(tag): tag; return False
print(clf.connect(rdwr={'on-connect': connected}))

このようなプログラムをデバイスごとに複数立ち上げることで動作できるようになります。 コマンドライン引数でデバイスを与えられるようにサンプルを後ほど変更しておきます。