RC-S380からFeliCaカードの製造IDを読み込むプログラムを作った(Python3)
最近、FeliCaなどの非接触カードを活用したアプリに興味を持っている。
先日、非接触カードリーダーRC-S380をPythonで制御するプログラムを作成したのだが、少し困った問題が起こった。
www.sony.co.jp
FeliCaカード等とデータ通信を行うためのPythonライブラリにnfcpyがあるのだが、これはPython2でしか動作せず、Python3では動作しない。
nfcpy.readthedocs.io
しかし、Python3で動作させたいため、nfcpyを使わず自作することにした。
そこで、USB通信のためのライブラリlibusb1を使ってRC-S380と直接USB通信してFeliCaの製造IDを読み込むプログラムを作成した。
処理の流れはnfcpyを参考にしている。
そのプログラムを下記に置いておく。
github.com
RC-S380に関する参考情報
- Windows環境であれば、PC/SCという規格を使ってRC-S380を制御できるため、USB通信を制御するプログラムを書く必要はない
nfcpyに関する参考情報
ソースを解析したので、その結果を書いておく。
github.com
- RC-S380を用いてFelica-Standardカードを読み込む際のシーケンスをまとめる
- わかりやすくするため、適当に省略する
全体のシーケンス
- モジュールについて
- TagToolがユーザ側プログラム(サンプルプログラム)
- ContactlessFrontendがライブラリのフロント部分
- ライブラリの処理は主に「リーダー初期化(connect)」、「カード情報読み取り(sense)」、「読み込んだカード情報の解析(activate)」の3つの処理からなる
- これらの詳細については後述する
リーダー初期化(connect)
- リーダーに対して、libusbライブラリを介して初期設定のためのコマンドを投げている
- send_commandは、リーダーへのコマンド送信関数であるが、実際には3ステップの送受信からなる。そのシーケンスについては後述する。
カード情報読み取り(sense)
- リーダーに対して、いくつかの設定コマンドを投げた後、カード捕捉命令を投げている
- InCommRFコマンドが実際にカードと通信するためのコマンドだと思われる