Raspberry Pi 入門 4日目 – Suicaの履歴を読み取る


前回の続きです。前回はRaspberry PiとPaSoRiを繋げてSuicaのIDmを取得しました。今回はSuicaの履歴を読み取ります。

 

Felicaの「ブロック」について

FeliCaには暗号化された領域と暗号化されていない領域があります。われわれ一般ピーポーが勝手にアクセスできるのは暗号化されていない領域だけです。

Suicaでは暗号化されていない領域に直近20件の履歴が記録されています。各履歴レコードは「ブロック」と呼ばれ、1ブロック=1履歴です。この暗号化されていない領域からブロックを読み取る命令を「Read Without Encryption」といいます。(詳細はSonyのFelicaカード ユーザーズマニュアルをご覧ください)

 

Pythonでブロックを読み取る

前回使用したPython用NFCライブラリ「nfcpy」を今回も使用します。まず最初にソースコード全体をお見せします。

<説明>

7行目で nfcpy をダウンロードしたディレクトリを指定してパスに追加しています。そして8行目でimportしています。

10行目で宣言している service_code = 0x090f はSuica内の乗降履歴情報のサービスコードです。これはこういうものだと覚えておきましょう。

26行目でPaSoRiとの接続を開始して、on-connect で12行目〜の connected が呼ばれます。

17行目でサービスコード(0x090f)を read_without_encryption メソッドに渡すためのServiceCodeクラスインスタンスに変換しています。

18行目は読み込むブロックの番号を指定するのですが、今回は0番(1ブロック目)を指定しています。

そして19行目でRead Without Encryptionコマンドを発行し、結果を表示しています。

実行結果はこんな感じ。

$ sudo python felica.py 
Type3Tag 'FeliCa Standard (RC-S???)' ID=011203123412A30B PMM=100B4B428485D0FF SYS=0003
block: c8460000206b4cc049f907120007e000

現状では読み取ったブロックを16進数文字列で表示しているだけなので、これを更にパースしてあげる必要があります。

 

ブロックをパースする

ここでは詳細についての説明はしませんが、ブロック内の何バイト目が何を意味するかというのは有志により解析されています。(suica – FeliCa Library Wiki – FeliCa Library – OSDN

これにしたがってパースする処理を追加したのがm2wasabiさんがGithub(https://github.com/m2wasabi/nfcpy-suica-sample)で公開している以下のコードです。駅コードから駅名を表示するために StationCode.csv というCSVファイルを同じディレクトリに置いています。

 

このスクリプトを実行すると以下のような結果が表示されます。

$ sudo python suica_read.py 
Type3Tag 'FeliCa Standard (RC-S???)' ID=011203123412A30B PMM=100B4B428485D0FF SYS=0003
=== 00 ===
端末種: 自販機
処理: 物販
日付: 16-03-11
入線区: None-None
入駅順: None
出線区: None-None
出駅順: None
残高: 4615
BIN: 
c8 46 00 00 20 6b 4c c0 49 f9 07 12 00 07 e0 00 
=== 01 ===
端末種: None
処理: 物販
日付: 16-03-10
入線区: None-None
入駅順: None
出線区: None-None
出駅順: None
残高: 5015
BIN: 
c7 46 00 00 20 6a b7 45 df e9 97 13 00 07 df 00 
=== 02 ===
端末種: 改札機
処理: 運賃支払
日付: 16-03-10
入線区: 東日本旅客鉄道-東海道本
入駅順: 浜松町
出線区: 東日本旅客鉄道-山手
出駅順: 池袋
残高: 5632
BIN: 
16 01 00 02 20 6a 01 04 25 0f 00 16 00 07 de 00 
  :

 

日付や駅名等が表示されましたね。

続き:Raspberry Pi 入門 5日目 – Raspberry PiのSDカードのバックアップを作成する(Mac OS Xの場合)

 

 

 

参考記事:


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください