どぅーちゅいむーにー

これ、Twitterでよくね?という日々の記録かも

Flexを使ってFelicaの情報を読み込むとか

仕事でパソリに置かれた Felica カードから情報を読み取って、Web 画面のとあるフィールドに設定する、というのをやったので、そのメモ。


Web の画面から、パソリに対して読込命令を行って、結果を得て・・・というわけですが、JavaScript + Flash(Flex)を使ってけっこう簡単に実装できます。


ソニーより、Flash のライブラリ(AIR もサポート)が提供されています。
SDK for FeliCa & Adobe® AIR® / Adobe® Flash®


この開発キットには、Basic 版と Standard 版の2種類があり、Basic 版は無償、Standard 版は有償となっています。


Basic と Standard 、どちらを選べば良いのだ?という話になりますが、おサイフケータイのブラウザを起動したり、FelicaIDm を取得するといったレベルのものであれば Basic 版で良さそうですが、開発キットのサイトでは「自社・個人配布アプリケーション、自社・個人ウェブサイト以外でのご利用については、Standard版をご利用ください。」と書かれています。
ただ、ライセンスは「開発者ライセンス」とのことなので、ランタイムについては不特定多数のユーザがアクセスするような画面に組み込んでも大丈夫のようです。


機能的な話でいうと、IDm/PMm を読み込む分なら Basic 版でも良いのですが、Edy の番号を読み込んだり、とある(暗号化されていない)サービスコードのデータブロックを読み込んだりするには、Standard 版が必要です。
あと、Standard 版を使っても暗号化されている領域は読み込めません(おそらく)。


使い方については、サンプルも充実しているので、サンプルプログラムを動かしてみてそれをちょこっと変えれば簡単なプログラムであれば簡単に実装できる感じです(注意:私は読込のみしかしていないので、書き込み部分についてはわかりませんが)。




話がまとまっていませんが。今回、仕事ではとあるカードのとある領域を読み込む必要があったので、Standard 版で開発しました。
開発中(とは言っても数日)は読み込み対象のカードが手元になかったため、最初はサイフの中にたくさんある Edy 搭載のカードでも読んでみるかなぁ、Edy 番号ってとれるのかなぁ、とか思いながら、解析してみました。


SDK for FeliCa & Adobe® AIR® / Adobe® Flash®とは別に、felicalib というツールが公開されています(felicalibのサイト)。felicalib のラインセンスは BSD ライセンスです(2011.01.25現在)。
このツールをダウンロードして解凍すると、FelicaDump.exe という実行ファイルが含まれています。


パソリを接続し(もちろんドライバーとかはインストール済の前提)、Edy などの Felica カードをセットして FelicaDump.exe をコマンドプロンプトから実行すると、つらつらと標準出力にカードの情報が出力されます。
どれくらい晒して良いのかよくわからないので、結果のサンプルは提示しません。


Standard 版についてくるサンプルをみると、Felica カードのとある部分を読み込むには、システムコードと、サービスコードが必要になります(システムコードは汎用?を表す FFFF でも大丈夫なケースもあるかもしれませんが)。


FelicaDump.exe の実行結果をみると、最初に


# IDm: xx xx xx xx xx xx xx xx
# PMm: vv vv vv vv vv vv vv vv

# System code: 1A2B
・・・

という感じの出力になっているかと思います(FelicaDump.exe の出力は、基本16進表記です)
IDm/PMm についてはよいとして、次にある System code: の4つの文字列がシステムコードになります(注意:1A2Bという値は適当です。また、何枚か試してみましたが、1枚のカードに複数のシステムコードが現れるケースが多かったです)。
カードによっては、いくつかの情報が書き込まれており、その場合実行結果には、複数のシステムコードが現れてきますので、読み込み対象領域のシステムコードを使ってください。


FelicaDump.exe の出力結果に戻りますが。システムコードのあとに、Number of area と、Area 情報、Number of service code があって、次のような情報が出力されるかと思います。
※念のため断わっておきますが、xxxx/yyyy/zzzz は4桁の16進表記文字列。zzzz は対応してます。x? と y? は2桁の16進表記です。

# Serivce code = xxxx : Random Access R/W (Protected)
# Serivce code = yyyy : Random Access Read only (Protected)
# Serivce code = zzzz : Random Access Read only
zzzz:0000 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
zzzz:0001 y0 y1 y2 y3 y4 y5 y6 y7 y8 y9 yA yB yC yD yE yF
・・・
上記でいうところの、zzzz:0000 と zzzz:0001 の行が、データの行(データブロックと呼ばれています)となります。


Flash のほうからこの情報を読み込みたい場合は、サービスコード zzzz を読み込む際に指定することになります。
※サービスコード xxxx と yyyy は Protected (アクセス禁止?)のため、データは読めません。


1点よくわかっていないのが、FelicaDump ではブロックの番号は 0000、0001 と増えていくのですが、ActionScript にてブロックを指定する際は、8000、8001 と指定するようです。ここのところはなぜなのか良く分かっていません。サンプルのコードでそうなっていたので。2進表記にすると 0000 1000 0000 0000 ということでしょうか・・・
コード的にはこんな感じ。

// サービスコードの指定:複数指定することもできるようです
request.serviceCodeList.push(SERVICE_CODE);

// 指定したサービスコードの先頭から blockCount:uint 分だけ
// 読み込むようなリクエストを構築
for (var i:uint=0; i < blockCount; i++) {
var strBlockListLower:String = i.toString();
while(strBlockListLower.length != 2) {
strBlockListLower = "0" + strBlockListLower;
}
request.blockList.push("80" + strBlockListLower); // ブロックリスト
}
// 実行
fc.access(request);
以上、よくわからない内容だとは思いますが、実際やることになったときに、さてどうするべ?という最初のとっかかりの参考にはなるかと思います。