RaspberryPiでRC-S380を複数使用してみる
以前のエントリーでRC-S380を使用しました。
その後、とあることで、複数の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}))
このようなプログラムをデバイスごとに複数立ち上げることで動作できるようになります。 コマンドライン引数でデバイスを与えられるようにサンプルを後ほど変更しておきます。