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停留所コードテーブルを見れば良い。