tadaogi @Wiki

Felica programming

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集
  • やりたいこと

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でソフトを作りまくるスレ◇■

http://pc8.2ch.net/test/read.cgi/tech/1100532582/

正規のDLL経由でEdyのNo.を表示している。

これを見ると、サービスコード0x110b、対象ブロック0x8000、0x8001でReadBlockWithoutEncryptionというのを実行すると良いらしい。(でもうまくいかないよおお)

この辺、結構2chに情報が散在している。

FeliCa】Suica&Edyを語れ

ううむ、でも情報は結構ばらばら。さすがに公開情報ではないので、少しずつHackしたり、関係者が少しずつばらしたりしているような感じ。最終的に使うときは、SDKを入手しないといけないみたい。

実験

libpasoriのサンプルを修正して、EdyのIDを読もうとするが失敗。仕方ないので、USBをスヌープする。

SourceForge.net: Usb Sniffer for Windows

で、良く見ると、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バイトずつにしたら動いた。



タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー