Show page source of suica #12309

= Suica

参考情報 : page3.nifty.com/slokar/pasori/gsuica

Suica には入出場記録と履歴の2つのサービスコードがある。Felica2Moneyなどで必要になるのは履歴のほう。サービスコード 0x090f。

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

 * 0: 端末種
 * 1: 処理
 * 2-3: ??
 * 4-5: 日付 (先頭から7ビットが年、4ビットが月、残り5ビットが日)
 * 6-7: 時刻 (先頭から5ビットが時,6ビットが分,下5ビットは不明(秒にしてはビット数が足りない?))
 * 6 : 入線区
 * 7 : 入駅順
 * 8 : 出線区
 * 9 : 出駅順
 * 10-11: 残高 (little endian)
 * 12-14: 連番
 * 15: リージョン

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

時刻と入線区/駅順が同じフィールドであることに注意。物販のときは時刻がはいるけど、そうじゃないときは入情報になる。
さらに、車載端末(バス)の場合、入線区/入駅順が各16ビットになる(それぞれ 6-7, 8-9バイト目)

端末種の値は以下の通り (主に Gsuica より抜粋)

* 0x03 => '精算機',
* 0x05 => '車載端末',
* 0x07 => '券売機',
* 0x08 => '券売機',
* 0x12 => '券売機',
* 0x16 => '改札機',
* 0x17 => '簡易改札機',
* 0x18 => '窓口端末',
* 0x1A => '改札端末',
* 0x1B => '携帯電話',
* 0x1C => '乗継精算機',
* 0x1D => '連絡改札機',
* 0xC7 => '物販端末',
* 0xC8 => '自販機',


処理の値は以下の通り

* 0x01 => '運賃支払',
* 0x02 => 'チャージ',
* 0x03 => '券購',
* 0x04 => '精算',
* 0x07 => '新規',
* 0x0D => 'バス',
* 0x0F => 'バス',
* 0x14 => 'オートチャージ',
* 0x46 => '物販',
* 0x49 => サンクスチャージ
* 0x4a => 物販取消
* 0xC6 => '物販(現金併用)',

== 駅コード/店舗コード

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

=== 駅名

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

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

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

=== 店舗名

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

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

=== 車載端末(バス)

端末種が 0x05 の場合。

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