Koike's Lemma

ITやビジネスに関する雑記

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通信を制御するプログラムを書く必要はない

www.orangetags.jp

nfcpyに関する参考情報

ソースを解析したので、その結果を書いておく。
github.com

  • RC-S380を用いてFelica-Standardカードを読み込む際のシーケンスをまとめる
  • わかりやすくするため、適当に省略する

全体のシーケンス

  • モジュールについて
    • TagToolがユーザ側プログラム(サンプルプログラム)
    • ContactlessFrontendがライブラリのフロント部分
  • ライブラリの処理は主に「リーダー初期化(connect)」、「カード情報読み取り(sense)」、「読み込んだカード情報の解析(activate)」の3つの処理からなる
    • これらの詳細については後述する

f:id:koikezlemma:20190505224542p:plain
全体シーケンス

リーダー初期化(connect)

  • リーダーに対して、libusbライブラリを介して初期設定のためのコマンドを投げている
  • send_commandは、リーダーへのコマンド送信関数であるが、実際には3ステップの送受信からなる。そのシーケンスについては後述する。

f:id:koikezlemma:20190505224614p:plain
connectシーケンス

カード情報読み取り(sense)

  • リーダーに対して、いくつかの設定コマンドを投げた後、カード捕捉命令を投げている
  • InCommRFコマンドが実際にカードと通信するためのコマンドだと思われる
    • カードとの通信については以下のページにある「FeliCaカード ユーザーズマニュアル 抜粋版」の「4.4節 コマンド」に詳細がまとまっている


f:id:koikezlemma:20190505224703p:plain
senseシーケンス

読み込んだカード情報の解析(activate)

f:id:koikezlemma:20190505224827p:plain
activateシーケンス

カードリーダーへのコマンド送信(send_command)

f:id:koikezlemma:20190505233929p:plain
send_commandシーケンス