13
15

More than 5 years have passed since last update.

OpenSCでSuicaの利用履歴を読む方法と履歴データのフォーマット解析

Posted at

はじめに

OpenSCを使ってSuicaから利用履歴を読み出します。
・読み出すためのAPDUコマンドを説明します。
・読み出した履歴データの見方を説明します。

環境

  • OS=Windows10
  • カードリーダー=PaSoRi RC-S380
  • ICカード= Suica(Felica)

OpenSCとは

さっそくやってみる

  • コマンドプロンプトを立ち上げる。
  • opensc-tool.exe のフォルダに移動して以下コマンド実行する。
  • opensc-tool.exe -s FF:A4:00:01:02:0F:09
  • opensc-tool.exe -s FF:B0:00:00:00
  • Received の次の行に出た値(16 01 00 04 24 99 E3 59 E3 5E 71 0B 00 1B 08 00)が利用履歴です。
サンプル-最新の利用履歴を読む
C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool.exe -s FF:A4:00:01:02:0F:09
Using reader with a card: Sony FeliCa Port/PaSoRi 3.0 0
Sending: FF A4 00 01 02 0F 09
Received (SW1=0x90, SW2=0x00)

C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool.exe -s FF:B0:00:00:00
Using reader with a card: Sony FeliCa Port/PaSoRi 3.0 0
Sending: FF B0 00 00 00
Received (SW1=0x90, SW2=0x00):
16 01 00 04 24 99 E3 59 E3 5E 71 0B 00 1B 08 00

opensc-tool.exeとは

  • ICカードリーダーと通信するツール。
  • 詳細はコチラを参照。

opensc-tool.exe -s FF:A4:00:01:02:0F:09

  • FF:A4:00:01:02:0F:09 がカードに送信するAPDUコマンド。
  • Suicaの利用履歴サービスを操作する指定コマンド(Select File)
  • 利用履歴サービスコードは 0x090f
  • サービスコードの指定はリトルエンディアン。(つまり、コマンドでは0f-09と指定する)
  • 応答 SW1=0x90, SW2=0x00 で正常終了という意味。

Select File APDUコマンド

byte no 項目名 指定値 説明
0 CLA FF 命令クラス FF固定
1 INS A4 Select File
2 P1 00 エリア数 00固定
3 P2 01 サービス数 01固定
4 Le 02 データサイズ 02固定
5 Data 0F Selectするサービス
6 Data 09 Selectするサービス

opensc-tool.exe -s FF:B0:00:00:00

  • FF:B0:00:00:00 がカードに送信するAPDUコマンド
  • ?APDU?という人は、下でリンク貼っているEternalWindowsというサイトを読むといいかと思います。
  • 利用履歴の1件目を取得するAPDUコマンド(Read Binary)
  • P2(ブロックNo)に00~指定することで履歴のx件目を取得することができる
  • 応答 SW1=0x90, SW2=0x00 で正常終了で、その次の行で履歴データが取れます
  • 履歴データは16byte

Read Binary APDUコマンド

byte no 項目名 指定値 説明
0 CLA FF 命令クラス FF固定
1 INS B0 Read Binary
2 P1 00 Block開始位置指定 00固定
3 P2 00 Blockリスト指定 ブロックNo
4 Le 00 00固定

補足

FF:B0:00:01:00 とすると履歴の2件目、
FF:B0:00:02:00 とすると履歴の3件目が取れます。
※何件までとれるかはカードによって違う?のか、正確な情報が見つけられませんでした。(テストに使ったカードは13件まで取れた)

履歴データの形式

さて、Read Binaryで取得したデータの形式はどうなっているのでしょうか。
16 01 00 04 24 99 E3 59 E3 5E 71 0B 00 1B 08 00

SUICA利用履歴ブロックフォーマット

2018/4/25に乃木坂から代々木上原まで乗って、残高が¥2929だったってことですね。

byte no 項目名 取れた値 値の意味
0 端末種 16 改札機
1 処理 01 運賃支払
2 支払種別 00 現金/なし
3 入出場種 04 入場/定期出場
4-5 日付 24:99 2018/4/25
6 入線区 E3 乃木坂
7 入駅順 59 乃木坂
8 出線区 E3 代々木上原
9 出駅順 5E 代々木上原
10-11 残高 71:0B ¥2929
12-14 連番 0B:00:1B
15 地域コード 00

端末種、処理

それぞれ1byteのコードで表現されています。
コチラのサイト参照ください。

支払種別、入出場種

それぞれ1byteのコードで表現されています。
コチラのサイトを参照ください。

日杖

2byteで表現されています。
先頭から7ビットが年、4ビットが月、残り5ビットが日。
0x24:0x99 をビットにすると、
0010-0100-1001-1001 となりますので、以下のようになります。

  • 7bit=0010-010 → 10進数に変換する → 18(年)
  • 4bit=0-100 → 10進数に変換する → 4(月)
  • 5bit=1-1001 → 10進数に変換する → 25(日)

入選区、入駅順、出線区、出駅順

区と順で駅コードとなります。以下のcsvから求まります。
駅コードデータベースStationCode.csv

残高

リトルエンディアンで設定されています。
簡単に求めたければ以下サイトから。
残高計算(16進法とリトルエンディアンの変換)

連番

?詳細不明?

地域コード

1byteのコードで表現されています。
コチラのサイトを参照ください。

最後に

履歴は結構簡単に読み出せます(PINの入力とかも不要)。NFCが付いたAndroid端末を使って履歴情報を読み出すアプリもたくさんあります。

あわせて参照すべきサイト

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15