FeliCa読み書き手順の紹介


SDK for FeliCaの中の上位API、felica.hを使用したFeliCaチップと通信する手順を紹介する。
SDK for FeliCaにはfelica.h等のヘッダファイルは宣言のみを行っており、API自体はLIBファイルかDLLファイルにて定義されている。

実際のFeliCaには、リーダ/ライタとの相互認証・待機状態への変更・トランザクションIDの管理・暗号化などなど、やたら面倒臭い処理が多いのだが、SDK for FeliCaのライブラリを使う分には特に気にしないで問題は無い。
って言うかそのためのSDKだし。




ライブラリの初期化

まず初めに、felica.hのAPIを使うためにDLLの読み込みを行う必要がある。
DLLを読み込むために、felica.dllrw.dllの2つのDLLへパスが通っている必要がある。
プログラム側でパスを指定して読み込む方法もあるが、こいつをインストールしておけば
ProgramFile/SONY/〜以下にFeliCa.dllをインストールするだけでなく、環境変数にパスを通してくれるので楽である。

ライブラリを初期化するためのAPIは、FeliCaと通信する前に実行しておかなければいけない。



リーダ/ライタのオープン

FeliCaのリーダ/ライタは、特に奇妙な事情が無ければ、USBのPaSoRi(RC-S320)を使用すると思われる。
リーダ/ライタをオープンするには、APIにもいくつか種類があるが、普通に使う分であれば自動でオープンしてくれるAPIを使えばよい。
デバイスへのポートの解放やリーダ/ライタとの認証などを全て勝手に行ってくれる。



ポーリング(ICカードの検出)

FeliCaのICカードを検索することをポーリングと言う。
ポーリングを行う際には、FeliCaサービスの種類タイムアウト時間リトライ回数等を設定する必要がある。
タイムアウトとリトライ回数は別に多少異なっても問題は無いが、ポーリングの対象とするFeliCaサービス種類の設定は行わなければならない。
例えば、[0x80 0xCD]を指定すると、モバイルFeliCaのみをポーリング対象とする。
SDK for FeliCaに同封されているサンプルカードを対象とするコードは無いので、{0xFF,0xFF}を使用する。



相互認証無しの書き込み

FeliCaチップとの通信には、相互認証を行うものと行わないものの2種類がある。
当然相互認証を行うものの方がセキュリティ性は高く、金融サービスなどを提供する場合はこちらを使うのが普通である。
しかし、モバイルFeliCaと転送を行う程度であれば、相互認証無しの通信で十分である。

Write Block Without Encryptionコマンドで相互認証無しの書き込みを行うことができる。
一度のコマンドで、最大10ブロック分のデータを書き込むことができる。
書き込みの際にはポーリングで得たIDm(チップのシリアル番号)とサービスコードが必要になる。



相互認証無しの読み込み

Read Block Without Encryptionコマンドで相互認証無しの読み込みを行うことができる。
一度のコマンドで、最大12ブロック分のデータを読み込むことができる。
読み込みの際にはポーリングで得たIDm(チップのシリアル番号)とサービスコードが必要になる。



リーダ/ライタのクローズとライブラリの破棄

FeliCaチップとの通信が終了した後に、リーダ/ライタとの接続を閉じる。
13.56MHzの高周波を放出しているのだから、何もしていない時は閉じるに越したことはない。

また、FeliCaチップとの通信を以後行わないという状態に達した場合は、ライブラリも破棄するべきである。
破棄しないとリーダ/ライタが壊れるというわけではないが、ライブラリ初期化の際に多数の変数をmallocしているので、ライブラリ破棄のAPIを呼び出しておいた方が好ましい。