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.dllとrw.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サービスコード : [0x80 0xCD]
- 全てのFeliCa ICチップを対象 : [0xFF 0xFF]
相互認証無しの書き込み
FeliCaチップとの通信には、相互認証を行うものと行わないものの2種類がある。
当然相互認証を行うものの方がセキュリティ性は高く、金融サービスなどを提供する場合はこちらを使うのが普通である。
しかし、モバイルFeliCaと転送を行う程度であれば、相互認証無しの通信で十分である。
Write Block Without Encryptionコマンドで相互認証無しの書き込みを行うことができる。
一度のコマンドで、最大10ブロック分のデータを書き込むことができる。
書き込みの際にはポーリングで得たIDm(チップのシリアル番号)とサービスコードが必要になる。
相互認証無しの読み込み
Read Block Without Encryptionコマンドで相互認証無しの読み込みを行うことができる。
一度のコマンドで、最大12ブロック分のデータを読み込むことができる。
読み込みの際にはポーリングで得たIDm(チップのシリアル番号)とサービスコードが必要になる。
リーダ/ライタのクローズとライブラリの破棄
FeliCaチップとの通信が終了した後に、リーダ/ライタとの接続を閉じる。
13.56MHzの高周波を放出しているのだから、何もしていない時は閉じるに越したことはない。
また、FeliCaチップとの通信を以後行わないという状態に達した場合は、ライブラリも破棄するべきである。
破棄しないとリーダ/ライタが壊れるというわけではないが、ライブラリ初期化の際に多数の変数をmallocしているので、ライブラリ破棄のAPIを呼び出しておいた方が好ましい。