PaSoRiを接続してカードIDを読む

今のところ少々使いづらい方法しか見つかっていないのですが、
ソニー製カードリーダーライターPaSoRi RC-S380を接続してSuicaなど
NFCのカードID(IDm)を読む方法について説明します。

nfcpyはpython2のみ対応

pythonでNFCを読むならnfcpyということらしいのですが、これはpython3非対応です。
ですのでpython3のPaPeRo iの制御スクリプトとは別プロセスで動かすことになります。
ただ、nfcpyは EUPLというライセンスで、こちらはGPLライクなコピーレフトライセンス
とのことなので、ソース公開を回避したい場合にはどちらにしても別プロセスで
動かすことになるかと思います。
(GPLの場合は別プロセスで動かしてパイプなどで通信するならGPLの影響は及ばないと
思いますが、EUPLも同様かについては確認していません。製品に適用する場合には
個々にご確認をお願いします。)

インストール手順

opkgで用意出来ているpython2はOpenWRT12.09のパッケージにあった2.7.3と古いせいか
pipが正常に動作せず、試行錯誤の結果インストール手順は以下の様になりました。

# opkg update
# opkg install python python-openssl python-readline
# mkdir /tmp/test
# cd /tmp/test
# curl -k -O peak.telecommunity.com/dist/ez_setup.py
# python2.7 ez_setup.py
# easy_install-2.7 libusb1
# easy_install-2.7 pyserial
# easy_install-2.7 nfcpy

setuptoolsをインストールするためのez_setup.pyについては、pypiで紹介されている
https://bootstrap.pypa.io/ez_setup.pyではダメでした。上記のものは
こちらで紹介されていたもので、素性は不明です。

動作確認

nfcpyのソースをlaunchpadのページからダウンロードして展開するとexamplesの下に
tagtool.pyがあります。
これをpython2で動かすためには、opkgの依存関係でうまく行っていない部分があるようで、
LD_LIBRARY_PATHを以下の様に変更して実行するとちゃんと動作しました。
あらかじめRC-S380は接続しておいて下さい。

# LD_LIBRARY_PATH=/lib:/usr/lib:/Extension/pkgroot/lib:/Extension/pkgroot/usr/lib python2.7 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:016
** waiting for a tag **
Type3Tag 'FeliCa Standard (RC-S???)' ID=01010310XXXXXXXX PMM=100B4B42XXXXXXXX SYS=0003

これは一度IDを読むと終了してしまいますので、そのままPaPeRo iの制御側で使用する場合は、
読みたいタイミングでsubprocess/communicateでプロセス起動と読み出しを行う事になります。

セキュリティについて

IDmは偽装可能なので、偽装されると困るようなアプリケーションには使用できませんのでご注意下さい。

※ PaSoRi(パソリ)はソニー株式会社の登録商標です。