こんな記事もありますTweet以前、プロデルでFeliCaポートからIDmを取得する方法をご紹介しましたが、今回はFeliCaカードの内容を解析して交通系ICカードの使用履歴を取得するビューアを作ってみたいと思います。ここでは説明にSuicaを使いますが、全国各地域で使用されている交通系ICカードはSuicaと同じ仕様ですので、Suica以外の場合でもプログラムを修正する必要はありません。Felicaカードからデータを取得するFeliCaカードには、FeliCaポートを通じて情報を書き込んだり読み込んだりできます。カードには用途や内容に応じて、書き込み領域が区分けされています。セキュリティ機能によって専用の機器以外でアクセスできないように、取得できる内容や書き込みに制限があります。Suicaをはじめとする交通系ICカードの場合は、使用履歴や残額を記録された部分から内容を制限無く取得できます。(定期券情報などにはアクセスできないみたいです)交通系ICカードの履歴を取得するFelicaカードから情報を取得するには、まずサービスコードを指定する必要があります。サービスコードはカードの用途ごとに割り当てられた番号です。プロデルのプラグインでは、「フェリカのSuicaサービス」と書くことで交通系ICカードのサービスコードを取得できます。カードにはサービスごとにさらに0から19までのブロックで情報が区分けされて記録されています。Felicaプラグインでは「ブロックを取得する」手順を使って、指定したブロックの情報をバイナリ形式で取得できます。取得したバイナリ配列には、各要素に履歴情報が一件ずつ格納されていますので、ビット演算で欲しい部分の情報を抜き取ります。ビット演算の手順プロデルでビット演算用の手順を使えます。今回は、AND演算する「論理積」手順や、ビットのシフト演算する「左シフト」「右シフト」手順を使います。【値】を【移動ビット数】だけ左シフトしたもの【値】を【移動ビット数】だけ右シフトSuicaの履歴データでは、残高や日付に関する情報が複数のバイトにまたがって記録されています。論理積(値1と値2で共に1のビットだけを返す)やシフト(指定したビット数だけ桁を移動する)を行うことで、バイト値から目的の値の部分だけを取り出したり、複数バイトにまたがる情報をつなぎ合わせて、記録された値を取り出していきます。種類が記録されています。最後の記録が順番に記録されていますので、最初のブロックに書かれた残高がSuicaのチャージ残高です。nanacoなどそれぞれのカードの仕様に基づいていて記録されています。これらの正式な仕様は、公開されていませんが、有志によって内容が解析されて公開されています。WikiFeliCaカード用ライブラリを使うこのようにしてバイナリデータからカードの内容を解析することで必要な情報を抽出できます。Suicaの仕様書を見ながらバイナリ操作をする必要があるので、少々手間が掛かります。そのため、プロデルのFeliCaプラグインのサンプルとして、FeliCaカードのデータを読み取るためのライブラリプログラム「FeliCaライブラリ.rdr」を用意しています。このライブラリプログラムを使えば簡単にSuicaの情報を抽出できます。ライブラリを使って、リストビューに履歴を表示するプログラムがサンプルとして用意してあります。次のプログラムでは、ボタンをクリックすると、Suicaから読み取った履歴から20件分の日時と残高を表示します。ーー自動生成された手順です。終わり終わり路線名と駅名を調べる「FeliCaライブラリ.rdr」を使って、残高や日時などの情報を調べることはできました。履歴には、電車に乗るときに乗った駅(入場駅)・降りた駅(出場駅)も番号で記録されています。この番号を見てもどの駅であるか分かりません。番号と駅との対応表が必要ですが、全国の鉄道駅の対応表は有志によってまとめられたサイトがあります。http://www014.upp.so-net.ne.jp/SFCardFan/ただ残念なことに2017年8月現在は、正常にデータベースがダウンロードできなくなってしまっています。そこで今回は、筆者が以前控えていたデータを使うことにします。StationCode.csvは、こちらからダウンロードできますのでお使い下さい。このCSVファイルは、Excelワークシート(mdb用)の内容をそのままCSV形式に変換したものです。StationCode.csvCSVファイルの内容は、次の内容がカンマ区切りで順番に記録されています。AreaCode,LineCode,StationCode,CompanyName,LineName,StationName,Note0,2,1,東日本旅客鉄道,東北本,東京,Suicaの履歴にある入場駅と出場駅には、2列目(線区:LineCode)と3列目(駅:StationCode)が記録されています。そこで、まずStationCode.csvから、キーが路線番号+駅番号で、値が路線名+駅名の「駅コード」辞書を作り、駅の一覧を登録します。辞書には、次のようなキーと値の関係を登録していきます。繰り返し終わり履歴に記録された線区と駅の組み合わせを使って、登録した「駅コード」辞書から路線名と駅名を調べるには次のような書きます。入場駅名は、駅コード(「[履歴の入線区],[履歴の入駅順]」)出場駅名は、駅コード(「[履歴の出線区],[履歴の出駅順]」)なお、Suicaの実際の履歴には、物販やチャージなどの履歴も記録されていますので、「入線区」または「出線区」が0の場合もあります。最初の履歴表示プログラムを改良して、乗った駅と降りた駅の、路線名と駅名を表示できるように改良してみます。完成したプログラムは、次の通りです。ーー自動生成された手順です。終わり終わりまとめ今回は、FeliCaカードからデータを取得して、そのデータからSuicaの履歴情報を抽出して、残金や利用日を表示するプログラムを作りました。実用的に使えるように、路線名データから乗り降りした駅名を表示するようにしました。FeliCaプラグインのサンプルには、WAONカードから残額を取得するプログラム例もあります。WAONを持っている方は、残金が簡単に記録家計簿ツールを作ることもできます。コメントをキャンセルコメントを投稿するにはログインしてください。826件閲覧リンクプロデルトップ筆者プロフィールご質問は掲示板へお願いしますブログ記事に関連する機能のご質問や不具合は、公式掲示板にてお願いします。