AndroidのNFC機能でFeliCaの読み書きをする

初めまして、ちきん(mokemokechicken)です。 今回は、NexusSを使って、FeliCaデータの読み書きをするAndroidアプリを作ったのでそのご紹介をします。

AndroidOSの2.3から NFC(Near Field Communication)用のAPIがサポートされるようになりました。 NFCの特徴についてはこの@ITの記事が参考になります。

NFCの通信規格は、日本で普及しているFeliCaの通信規格を含んでいるので、大抵のNFCリーダー・ライターで物理的にはFeliCaにアクセスすることがでそうですが、 現在の標準NFC APIでは、NDEFデータ以外にアクセスはできません(IDmは取得できますが)。

しかし、先人たちの努力によって遂に隠しClassを通して、FeliCaのコマンドを発行できるようになり、そのソースコードが公開されました。

ちょうどその時、kouさんがNexusSを調達されており、Android,NFC,FeliCaについて遊ぶ・・ぢゃなくて調査することになりました。

その結果、NexusSと隠しClassによって、FeliCaに対して以下の操作ができることがわかりました。

  • システムコード一覧の取得: システムコードは、アプリケーション毎に定義されたシステム領域です。
  • サービスコード一覧の取得: サービスコードは、システム領域内の「ファイル識別子」のようなもの?です。
  • サービスコード内のデータの読みこみ: 但し、非暗号化領域に限ります。
  • サービスコード内のデータの書きこみ: 但し、非暗号化&書込み可能領域に限ります。

ただし、隠しClass(@hide)を用いての実装なので、NexusS以外のAndroid2.3端末や、今後のAndroidOSのVersionUP次第ではできなくなる可能性もありますので、一般サービスとしては使えないです。
ですが、どのFeliCaカードがどういう領域を持っているか調べたり、書込み可能領域を編集できるのは、今後色々役に立ちそうなので、今回アプリを作ってみました。

 

作成したアプリは、github: Android_NFC_FelicaEditにソースコードを公開しています。
Androidアプリを作ったのは初めてなのもあり、UIとかあまりイケテナイですが、技術者向けのアプリということでご勘弁下さい。

アプリの紹介

現時点で実際にこのアプリを動かすには、NexusSを調達する必要があり、なかなか難しいのでスクリーンショットでご紹介します。

まず、本アプリをインストールしたNexusSをFeliCaに近づけると、Intentが発生し、どのアプリで処理するか聞かれます。

ここで、本アプリFelicaEditを選びます。

すると、システムコードの一覧が表示されます。
例えば、AU携帯を見た場合こんな感じになります。
3個のシステム領域があることがわかります。ちなみに、「FE00」は共通領域と呼ばれる領域です。「0003」はSuicaなどの領域のようです。「FE0F」はAU独自の領域なのでしょうか??
また、例えば、Softbankの携帯を見た場合、こんな感じになります。
この携帯にはFE00しかないことがわかります。次に、このままFE00をTAPしてみます。
すると、このように表示されます。
「7048」とかあるのが「サービスコード」です。このサービスコードを見るとアクセス権がわかるようになっています(JIX_X_6319-4 を参照)。
Lockedとなっている部分は「暗号化領域」なので、(鍵を知らないと)見ることも書くこともできません。また「RO」はReadOnlyの部分で読むことはできますが、書くことはできません。
で、「サービスコード:70C9」は、「RW(24)」となっていて、ReadWriteできる非暗号化領域が24Blockあることを表しています。ので、本アプリで書込みができます。ちなみに1Blockは16Byteです。この「70C9」をTapしてみます。
すると、 と、Blockのデータが表示されます。Byte列の16進表示で、4バイト毎に区切ってあります。続いて「Block00」をTapしてみます。
すると、データが1バイト毎に縦に並ぶので、一番上をTapしてみると、
となり、ここでByte値の編集ができます。
4bit毎に16進で指定します。この辺のUIがなんか間延びしているのが、あれですが、、
「5F」とかにしてみました。
その後、「OK」を押したあと、上の「Save」ボタンを押しますと、
となり、
のように更新されていることがわかります。

本アプリの用途は、

  • FeliCaの中身がどうなっているか見てみたいとき
  • 書込み可能領域を何か編集したいとき
  • 自分でFeliCa向けツールを作りたいとき、多少の参考に

という感じですが、ご興味と機会があれば是非使ってみてください。

※ちなみに、悪いこと(例えばEdyの金額を書き換えるとか)はできませんよ?(^^;

 

参考にしたURL

■追記: 2011/2/10
Android2.3.3のAPIが公開され、どうやら隠しClassを使わなくてもよくなっているようです。
引き続き調査していこうと思います。


2 thoughts on “AndroidのNFC機能でFeliCaの読み書きをする

  1. パスモ無限定期とか作れるのかなあワクワク(小並感>※ちなみに、悪いこと(例えばEdyの金額を書き換えるとか)はできませんよ?(^^;