Suica

以下の情報は、でんのすけさんにいただいた情報、および guisaの実装(page3.nifty.com/slokar/pasori/gsuica)をベースにしています。

Suica/ICOCA/PiTaPa/PASMO/TOICA は基本的に同じフォーマットです。 Suica には入出場記録と履歴の2つのサービスコードがある。以下の説明は履歴のほうのみ。サービスコードは 0x090f。 (なお、IruCa はシステムコードが 0xde80 に変わるが、フォーマットは基本的に Suica 系と同じ)

各エントリは16バイト。フォーマットは以下の通り。

  • 0: 端末種
  • 1: 処理
  • 2-3: ??
  • 4-5: 日付 (先頭から7ビットが年、4ビットが月、残り5ビットが日)
  • 6 : 入線区
  • 7 : 入駅順
  • 8 : 出線区
  • 9 : 出駅順
  • 10-11: 残高 (little endian)
  • 12-14: 連番
  • 15: リージョン

残高だけ little endian なので注意。

なお、物販とバスの場合、以下のようにフォーマットが変わる。

  • 物販 : 6-7バイト目が時刻となる。先頭から5ビットが時,6ビットが分,下5ビットは不明(秒にしてはビット数が足りない?)
    • 物販とは処理の値が 70, 73, 74, 75, 198, 203 のときである。
  • バス : 入線区/入駅順がなくなり、出線区/出駅順が各16ビットになる(それぞれ 6-7, 8-9バイト目)
    • バスとは、処理の値が 13, 15, 31, 35 のときである。

端末種の値は以下の通り

  • 3 : 精算機
  • 4 : 携帯型端末
  • 5 : 車載端末
  • 7 : 券売機
  • 8 : 券売機
  • 9 : 入金機
  • 18 : 券売機
  • 20 : 券売機等
  • 21 : 券売機等
  • 22 : 改札機
  • 23 : 簡易改札機
  • 24,25 : 窓口端末
  • 26 : 改札端末
  • 27 : 携帯電話
  • 28 : 乗継精算機
  • 29 : 連絡改札機
  • 31 : 簡易入金機
  • 70 : VIEW ALTTE
  • 72 : VIEW ALTTE
  • 199 : 物販端末
  • 200 : 自販機

処理の値は以下の通り

  • 1 : 運賃支払(改札出場)
  • 2 : チャージ
  • 3 : 券購(磁気券購入)
  • 4 : 精算
  • 5 : 精算 (入場精算)
  • 6 : 窓出 (改札窓口処理)
  • 7 : 新規 (新規発行)
  • 8 : 控除 (窓口控除)
  • 13 : バス (PiTaPa系)
  • 15 : バス (IruCa系)
  • 17 : 再発 (再発行処理)
  • 19 : 支払 (新幹線利用)
  • 20 : 入A (入場時オートチャージ)
  • 21 : 出A (出場時オートチャージ)
  • 31 : 入金 (バスチャージ)
  • 35 : 券購 (バス路面電車企画券購入)
  • 70 : 物販
  • 72 : 特典 (特典チャージ)
  • 73 : 入金 (レジ入金)
  • 74 : 物販取消
  • 75 : 入物 (入場物販)
  • 198 : 物現 (現金併用物販)
  • 203 : 入物 (入場現金併用物販)
  • 132 : 精算 (他社精算)
  • 133 : 精算 (他社入場精算)

駅コード/店舗コード

http://www.denno.net/SFCardFan/ にあるサイバネ駅コードデータベースで調べられる。

駅名

端末種が 0xc7, 0xc8, 0x05 以外の場合。

駅名については地区コード(AreaCode)、線区コード(LineCode)、駅順コード(StationCode)から調べる。 ここで、地区コードは以下のように求める。

  • 線区が 0x7f 以下のとり : 0 (JR線)
  • 線区が 0x80 以上でリージョンが 0 のとき : 1 (関東公営・私鉄)
  • 線区が 0x80 以上でリージョンが 1 のとき : 2 (関西公営・私鉄)

店舗名

端末種が 0xc7, 0xc8 の場合。

店舗については、エリア(AreaCode)、端末(TerminalCode)、線区(LineCode)、駅順(StationCode)の4バイトで検索する。 エリアコードは 1:Suica/PASMO, 2:ICOCA, 4:IruCa となっている。しかし、履歴にはエリアコードは記録されておらず、 さらに Suica/PASMO 間でコード重複があるので、100% 確実に店舗名を知ることは不可能。

車載端末(バス)

端末種が 0x05 の場合。

このときは、線区/駅順をキーに IruCa停留所コードテーブルを見れば良い。