Felica Library「felicalib.dll」
felicalib.dllは、PaSoRi を使って FeliCa のデータを読み書きするためのライブラリです。対応機種は RC-S380 / S370 / S330 / S320になっています。 FeliCa Libraryから felicalib-0.4.2.zip をダウンロードして下さい。解凍して、felicalib.dll を実行ファイル(exe)と同じフォルダに入れれば完了です。
動作環境
- Windows 7 Professional
- Microsoft Visual Studio Express 2013 for Windows Desktop
- PaSoRi RC-S380
- felicalib-0.4.2.zip
RC-S380 非接触ICカードリーダー/ライター PaSoRi(パソリ)
- ・住民基本台帳カードをかざして確定申告・納税
- 公的個人認証サービスに対応し、自宅からインターネット経由で、確定申告や納税、申請・届出などができます。
- ・ネット入金やネットショッピング
- Edyチャージ(入金)が簡単に利用でき、「楽天Edy」「SuiCa」カード対応のWebサイトでショッピングができます。
- ・交通乗車券の利用履歴や残高確認
- 「Suica」「PASMO」「PiTaPa」などのICカード交通乗車券の利用履歴、残高などが確認できます。
Suicaのフォーマット
Suica/ICOCA/PiTaPa/PASMO/TOICA は基本的に同じフォーマットです。 Suica には入出場記録と履歴の2つのサービスコードがあります。以下の説明は履歴のほうのみで、サービスコードは 0x090fとなります。
各エントリは16バイトで、次にフォーマットを示します。
- 0: 端末種
- 1: 処理
- 2-3: ??
- 4-5: 日付 (先頭から7ビットが年、4ビットが月、残り4ビットが日)
- 6 : 入線区
- 7 : 入駅順
- 8 : 出線区
- 9 : 出駅順
- 10-11: 残高 (little endian)
- 12-14: 連番
- 15: リージョン
残高だけ little endian となります。なお、詳細については、FeliCa Libraryを参照してください。
C#によるSuicaの読み出しソフト
次のプログラムは、C#によるSuicaの読み出しソフトです。Suicaの使用履歴は表形式で表示されます(表形式のformは割愛されています)。
// サービスコード public const int SERVICE_SUICA_INOUT = 0x108f; public const int SERVICE_SUICA_HISTORY = 0x090f; private int readSuica(Felica f) { f.Polling((int)SystemCode.Suica); for (int i = 0; ; i++) { data = f.ReadWithoutEncryption(SERVICE_SUICA_HISTORY, i); if (data == null) break; suica_dump_history(data); } f.Dispose(); return 0; } private void suica_dump_history(byte[] data) { int ctype, proc, date, time, balance, seq, region; int in_line, in_sta, out_line, out_sta; int yy, mm, dd; DataRow row = dt.NewRow(); ctype = data[0]; // 端末種 proc = data[1]; // 処理 date = (data[4] << 8) + data[5]; // 日付 balance = (data[10] << 8) + data[11]; // 残高 balance = ((balance) >> 8) & 0xff | ((balance) << 8) & 0xff00; seq = (data[12] << 24) + (data[13] << 16) + (data[14] << 8) + data[15]; region = seq & 0xff; // Region seq >>= 8; // 連番 out_line = -1; out_sta = -1; time = -1; switch (ctype) { case 0xC7: // 物販 case 0xC8: // 自販機 time = (data[6] << 8) + data[7]; in_line = data[8]; in_sta = data[9]; break; case 0x05: // 車載機 in_line = (data[6] << 8) + data[7]; in_sta = (data[8] << 8) + data[9]; break; default: in_line = data[6]; in_sta = data[7]; out_line = data[8]; out_sta = data[9]; break; } row["Tanmatu"] = consoleType(ctype); row["Proc"] = procType(proc); // 日付 yy = date >> 9; mm = (date >> 5) & 0xf; dd = date & 0x1f; row["Date"] = yy.ToString() + "/" + mm.ToString() + "/" + dd.ToString() + " "; // 時刻 if (time > 0) { int hh = time >> 11; int min = (time >> 5) & 0x3f; row["Date"] += hh.ToString() + ":" + min.ToString(); } row["Iri"] = in_line.ToString("X") + "/" + in_sta.ToString("X"); if (out_line != -1) { row["Iri"] = out_line.ToString("X") + "/" + out_sta.ToString("X"); } row["Zandaka"] = balance.ToString(); row["Renban"] = seq.ToString(); dt.Rows.Add(row); } private string consoleType(int ctype) { switch (ctype) { case 0x03: return "清算機"; case 0x05: return "車載端末"; case 0x08: return "券売機"; case 0x12: return "券売機"; case 0x16: return "改札機"; case 0x17: return "簡易改札機"; case 0x18: return "窓口端末"; case 0x1a: return "改札端末"; case 0x1b: return "携帯電話"; case 0x1c: return "乗継清算機"; case 0x1d: return "連絡改札機"; case 0xc7: return "物販"; case 0xc8: return "自販機"; } return "???"; } private string procType(int proc) { switch (proc) { case 0x01: return "運賃支払"; case 0x02: return "チャージ"; case 0x03: return "券購"; case 0x04: return "清算"; case 0x07: return "新規"; case 0x0d: return "バス"; case 0x0f: return "バス"; case 0x14: return "オートチャージ"; case 0x46: return "物販"; case 0x49: return "入金"; case 0xc6: return "物販(現金併用)"; } return "???"; }
RC-S380 非接触ICカードリーダーでSuicaカードを読み込んだ結果は、次のようになります。
.NetFramework 4.0で使用する場合に必要なFelicaLib.csの変更
C# の関数呼び出し時に、次のエラーが出てしまいます。これは、.NetFramework 3.5 の環境から 4.0 に変更した事により発生するエラーで、提供されているFelicaLib.cs内のDllImportを使用したfelicalib.dllの呼び出しパラメータを変更する必要があります。
マネージ デバッグ アシスタント ‘PInvokeStackImbalance’ が ‘C:\Users\ne\Documents\Visual Studio 2013\Projects\FelicaTool\FelicaTool\bin\Debug\FelicaTool.vshost.exe’ で問題を検出しました。 追加情報:PInvoke 関数 ‘FelicaTool!FelicaLib.Felica::felica_polling’ がスタックを不安定にしています。・・・・
提供されているFelicaLib.csのパラメータの変更方法の詳細を次に示します。
[DllImport(“felicalib.dll”)] private extern static IntPtr pasori_open(String dummy); ↓ ↓(次のように変更) ↓ [DllImport(“felicalib.dll”, CallingConvention = CallingConvention.Cdecl)] private extern static IntPtr pasori_open(String dummy);
SonyのSDK for NFC Starter KitとPaSoRi RC-S380
SonyのSDK for NFC Starter Kitを使用しても、PaSoRiにはアクセスできます。しかし、新型RC-S380からは同もアクセスできないことが話題になっています。NFCタグへのアクセスは、今後はデスクトップUIではPC/SC経由、メトロUIではNFP経由に集約されます。FeliCa Lib.は残るようです。
RC-S330/370はNFC対応ではあるのですが、NFC Forum対応ではないためこの中間解のようなAPIが定義されていたということになり、業界標準であるPC/SCにも完全対応が終わったRC-S380からは、役目を終えたことになります。
実際に、SDK for NFC Starter KitのC#のサンプル((ルート)→ sample → NFC_and_PCSC → ReadingMifareCard → src → Csharp → nfc_sample_01フォルダ内)を、felica_nfc_library.dllを使用して、PaSoRiにアクセスすると次のようなエラーがでます。