- やりたいこと
Felicaを使ったプログラミング
最終的にはLinuxで動くこと
-
やったこと
Pasoriの入手
とりあえず、UFJカードに入ってPasoriを手に入れる。
libpasori
フリーのソフトを探す。プログラミングできそうなのはlibpasori。linux版もWindows版もある。
まずは、WindowsXPにlibpasoriを入れる。Cygwinも入れる。コンパイルには、LibUsbが必要とのことで、Windows用のを入れる。
http://libusb-win32.sourceforge.net/
インストーラ付のexeをダウンロードして実行。テストプログラムも走る。でも、実はソースも必要なので、落とす。ソースからのmakeは一発で通った。
このままだと、installされない。installのところを読むとbinarypackageをダウンロードするみたい。
ううむ、良く読むと、2種類の使い方があって、それぞれinstallの方法が違う。しかも、DeviceDriverの方は、libusb.infを修正しろと書いてあるのに、そんなファイルは存在しない。でも、開発用に必要なのはこっちのような感じだ。
ホームページのドキュメントが、バージョン0.1.7なのに、最新版は0.1.10.1なので、内容を比較すると、infファイルは自動で作られるみたいで、そのためのexeファイルっぽいのがある。実行すると、infファイルができた。
良く分からないので、installはせずに、libpasoriのフォルダに直接usb.hとlibusb.aをおいて、-I.-L.をつけてコンパイルしたら、warningは出るものの、一応動いたくさい。
SFCardPeeperをダウンロードして、内容を比較してみる。
http://www014.upp.so-net.ne.jp/SFCardFan/
改造
一応、IDm、PMmは表示できるようにした。でも、カードの表面に書いてあるIDと違うんだよね。なんとなく気持ち悪いので、対応がないか探す。
2chに、EdyのNo.を表示するVBAがあった。
■◇FeliCaでソフトを作りまくるスレ◇■
正規のDLL経由でEdyのNo.を表示している。
これを見ると、サービスコード0x110b、対象ブロック0x8000、0x8001でReadBlockWithoutEncryptionというのを実行すると良いらしい。(でもうまくいかないよおお)
この辺、結構2chに情報が散在している。
【FeliCa】Suica&Edyを語れ
ううむ、でも情報は結構ばらばら。さすがに公開情報ではないので、少しずつHackしたり、関係者が少しずつばらしたりしているような感じ。最終的に使うときは、SDKを入手しないといけないみたい。
実験
libpasoriのサンプルを修正して、EdyのIDを読もうとするが失敗。仕方ないので、USBをスヌープする。
で、良く見ると、IDmの上位1桁目が違うぞ。何で?正しく動く方はIDmが「11」で始まるのに、libpasoriの方は「01」で始まる。(後は同じ)試しに、直接IDmを「11」で問い合わせてみると、確かに成功して、EdyNoが返ってくる。で、もう少し調べると、IDmを調べるコマンドが少し違う。
SFCard Peeper
0000: 00 00 ff 07 f9 5c 06 00 fe 00 00 00 a0 00
libpaso
(send) send:00 00 FF 07 F9 5C 06 00 FF FF 00 00 A0 00
これらの違いは、Edyと知ってのPollingか、知らないでのPollingかの違いのようだ。
正式ソフトを調べると、FFFFを投げるのは、リーダ/ライタの自己診断プログラム。後は、Edyの場合はfe00、Suicaの場合は0003を使っている。このIDmを使えば、EdyではEdyNo.を知ることができる。SFCardPeeperは、ここを変えながらカードの種類を判別しているみたい。FFFFで正しいIDmが返ってこないのは、バグか仕様か分からない。1bitだけの違いだから仕様かもしれない。
で、EdyNo.を読むことはできるようになった。Suicaも読みたいが、情報がない。裏に書いてあるIDが読めるような気がするけど、、、。
注記
FE 00等の部分は、FeliCaSystemCodeと呼ばれる部分で、Pollingコマンドに置いて、指定されたSystemCodeを持つFeliCa以外は応答を返しません。ただし、FFは特別な意味を持って、ワイルドカードを意味します。つまり二桁ともFFとすると、SystemCodeがなにであっても応答を返すことになります(一部例外があります)。カードが論理分割されている場合、論理分割されたカード毎にSystemCodeを持ちます。SystemCodeFE00は、FeliCa共通領域と呼ばれるもので、FeliCa共通で利用されるアプリケーション(Edyなど)が利用しています。おサイフケータイは主にFeliCa共通領域で構成されています(モバイルSuicaを入れると、論理分割さされ、サイバネ領域が現れます)。IDmの先頭4バイトは何番目の論理カードかを意味しています。SystemCodeFFFFでPollingを行うと、一番若い論理カードのIDmを返すため、'0'になります。一般的にFeliCa共通領域は2番目の論理カードに割り当てることが多いため、System Code FE 00で Polling を行うと '1' が返ります。
次は、Javaから使えるようにする方法を調べる。
と思ったけど、その前にlinuxで調べることにした。ところがうまくいかない。
-
libpasori + libusb + vine3.2(kernel2.4) でエラーになる。
最終的には、usbfsに対してlibusbからioctlを出したところで、EINVALのエラーになる。試しに、linuxのkernelをデバッグしようとして、該当しそうなEINVALを返している辺りを修正して再構築するが、状況は変化せず。kerneldebugの方法が今ひとつ分からずあきらめモード。
今度は、最初に戻って、Javaからのアクセス方法を調べる。jUSBとJSR-80とあるようだけど、後者の方が最近もactivityがあるようなので、JSR-80でトライ。基本的には、linuxが前提。サンプルプログラムはすぐに動作確認完了。ところが、pasoriの初期化のデータを送るところでとまる。データ転送には色々あるみたいで、どれをどう使えばよいか不明。調査中。
Javaでは、Windowsではパスの設定を少しいじれば動いた。Linuxでも、パスの設定が違っていても、エラーメッセージがそうはでないのではまったけど、結局動いた。(詳細を書かないと意味ないか、、、)
Linuxで、libpasoriはすぐには動かない。何故か、8バイトずつしか読めない。エラーがEINVALなので良く分からなかったが、8バイトずつにしたら動いた。