Androidで
              FeliCaの履歴を読もう
                     2012/12/09
                 Fukuoka NFC Hack 6
                     @treby006




12年12月9日日曜日
本発表の対象
              • Androidで開発する機会のある方

              • Nexus7などNFC機能搭載Android端末をお持ちの方

              • Suica/WAON/nanacoなどFeliCaを使っている方




12年12月9日日曜日
本発表のゴール
              • ご自身のAndroidアプリにNFC機能を実装できるよ
               うになりましょう。


              • また、FeliCaの履歴読み取りなど厳密にNFCの規格
               から外れたことの実装法を理解しましょう。




12年12月9日日曜日
NFCの標準規格
              • 基本的にNDEFデータによって通信
               • NDEF …… NFC Data Exchange Formatの略で、
                 MessageとRecordといったものがあります。 

              • NDEF Message …… NDEF Recordを一つ以上含みます。
              • NDEF Record …… MIMEタイプで定められたメディアや
               URIやアプリケーションで定められたペイロードを含み
               ます。




12年12月9日日曜日
Android NFC API
              • Gingerbread (2.3) / API 9から対応。

              • ICS(4.0) / API 15からはP2P機能も実装することがで
                きます(いわゆるAndroid Beam)。今回は対象外。


              • 簡単にIDを読み取ったりNFCタグを発行したり、
                データを読み書きしたりできるのが特徴。




12年12月9日日曜日
コード例
              • NFCタグを発行するなら(注:もろもろ省略)
                      NdefFormatable ndefFormatable;
                      ndefFormatable = NdefFormatable.get(tag);
                      try {
                              ndefFormatable.open();
                              ndefFormatable.format(ndefMessage);
                      } finally {
                              ndefFormatable.close();
                      }

              • ndefFormatable.format(ndefMessage);
                   • ndefFormatable …… NdefFormatableクラスインスタンス
                   • ndefMessage …… 書き込むNDEF Message


12年12月9日日曜日
NDEFの中身
              • 例:特定のWebページのURIを含むNFCタグ(かざ
               すと暗黙的Intentが飛びます/ページを開きます)




12年12月9日日曜日
こんな感じに書きます
              NdefMessage mMessage;
              mMessage = new NdefMessage(new NdefRecord[] {
                        NdefRecord.createUri(“http://www.atelier-nodoka.net/”),
              });


              ∼中略∼


              ndef.connect();
              ndef.writeNdefMessage(mMessage);
              ndef.close();


                                                        ……ほら、簡単でしょ?



12年12月9日日曜日
FeliCaとNFC
              • 定義を確認
               • FeliCa …… カードやチップの製品名(ブランド)。デ
                 ータ構造含めてJIS X 6319で規格化。

               • NFC …… 通信レイヤの標準規格で、データ構造は
                 範囲外。ただし、標準的なデータ構造としてNDEF
                 がNFC Forumで定められている。

              • つまり、NFCを使ってFeliCaを読み取るには適切にカ
               ードのコマンドを実装してあげる必要があります。


12年12月9日日曜日
Advanced NFC
              • http://developer.android.com/guide/topics/
                connectivity/nfc/advanced-nfc.html

              • 要約:Androidでサポートしていないテクノロジの
                カードを読み書きしたければ生のバイト列を用いて
                通信してね。


              • ……とかいいながらMIFARE ClassicとMIFARE
                Ultralight用のクラスが用意されてるあたりなんかず
                るい(一応オプションですが)。



12年12月9日日曜日
FeliCaの仕様を調査
              • ブロック
              • サービス
              • エリア
              • システム




12年12月9日日曜日
ブロック
              • FeliCaのメモリに対する書き込み及び読み出しにお
               ける16バイトの単位のことです。


              • R/Wから直接扱えるわけではなく、ブロックへのア
               クセスは後述のサービスを使用します。




12年12月9日日曜日
サービス
              • ファイルシステム上のブロックをグループ化したも
               ので、ブロックへのアクセスを提供します。


              • 各サービスはサービスコードによって特定します。




12年12月9日日曜日
エリア
              • 不揮発性メモリ領域の使用可能な残ブロック数や
               サービスへのブロック数の割り当てを管理する単
               位です。


              • 複数のサービスを含むことができます。

              • 今回はあまり意識しなくて大丈夫です。




12年12月9日日曜日
システム
              • 論理的なカードの単位です。

              • 1枚のカードには用途に応じた複数のシステムを含
               むことができます。


              • リーダ/ライタがシステムを特定するためにシステ
               ムコードが用いられます。




12年12月9日日曜日
FeliCaコマンド
              • Pollingコマンド
                • カードを検知するためのコマンドです。
                • パラメータとしてシステムコードをもちます。
                • 物理的なカードとシステム(論理的なカード)
                 を特定するIDmを取得することができます。

              • Read Without Encryptionコマンド
                • 非暗号化領域のデータを読むことができます。
                • パラメータとしてサービスコードをもちます。


12年12月9日日曜日
実際のFeliCa
              • 独自に規定されており、(当然)どの領域に何のデ
               ータが入っているかは非公開です。


              • ただし、有志によって解析された情報がWeb上に
               あるのでこれを利用します。


               • 特に履歴情報は非暗号化領域に書かれているの
                で扱いが容易です(だからこそ扱えます)。




12年12月9日日曜日
各種情報
              • Suica(など、サイバネ規格交通ICカード)
                • システムコード:0x0003(サイバネ領域)
                • サービスコード(履歴情報):0x090F




12年12月9日日曜日
各種情報
              • nanaco 
                • システムコード:0xFE00(共通領域)
                • サービスコード(履歴情報):0x564F

              • WAON 
                • システムコード:0xFE00(共通領域)
                • サービスコード(履歴情報):0x680B

              • Edy 
                • システムコード:0xFE00(共通領域)
                • サービスコード(履歴情報):0x170F


12年12月9日日曜日
NfcF#transceiveメソッド
              • 引数:送信バイト(FeliCaのコマンドを入れます)

              • 戻り値:受信バイト(FeliCaのコマンドレスポンスが
               返ります)


              • 注意:送信バイト/受信バイトにはそれぞれ先頭に
               コマンドバイト長が入ります。つまり、12バイトの
               コマンドならば先頭に0x0D(13 = 12 + 1(先頭バイ
               ト分))を付加しなければいけません。



12年12月9日日曜日
応用ソフトウェア
              • 「かお(・ν・)もじ SF CHECKER」Android版




              • 実はRequest Serviceコマンドいらなかった説。


12年12月9日日曜日
FeliCaへのチャージは?
              • 例のごとく、FeliCaコマンドが公開されていません
               ので、チャージはできないです。   情報とかも分か
               りませんし。


              • 世の中おいしい話はそうそうないということです。
               諦めましょう。




12年12月9日日曜日
まとめ
              • AndroidのNFC機能を使ってFeliCaの履歴情報を読
               み取る方法を解説しました。
               • また、予備知識として以下を説明しました。
                 • AndroidのNFC機能
                 • FeliCaカードの技術仕様

              • 実際にはカードへのアクセスはメインスレッドから
               行わないようにしなくちゃいけません。




12年12月9日日曜日

AndroidでFeliCaの履歴を読もう

  • 1.
    Androidで FeliCaの履歴を読もう 2012/12/09 Fukuoka NFC Hack 6 @treby006 12年12月9日日曜日
  • 2.
    本発表の対象 • Androidで開発する機会のある方 • Nexus7などNFC機能搭載Android端末をお持ちの方 • Suica/WAON/nanacoなどFeliCaを使っている方 12年12月9日日曜日
  • 3.
    本発表のゴール • ご自身のAndroidアプリにNFC機能を実装できるよ うになりましょう。 • また、FeliCaの履歴読み取りなど厳密にNFCの規格 から外れたことの実装法を理解しましょう。 12年12月9日日曜日
  • 4.
    NFCの標準規格 • 基本的にNDEFデータによって通信 • NDEF …… NFC Data Exchange Formatの略で、 MessageとRecordといったものがあります。  • NDEF Message …… NDEF Recordを一つ以上含みます。 • NDEF Record …… MIMEタイプで定められたメディアや URIやアプリケーションで定められたペイロードを含み ます。 12年12月9日日曜日
  • 5.
    Android NFC API • Gingerbread (2.3) / API 9から対応。 • ICS(4.0) / API 15からはP2P機能も実装することがで きます(いわゆるAndroid Beam)。今回は対象外。 • 簡単にIDを読み取ったりNFCタグを発行したり、 データを読み書きしたりできるのが特徴。 12年12月9日日曜日
  • 6.
    コード例 • NFCタグを発行するなら(注:もろもろ省略) NdefFormatable ndefFormatable; ndefFormatable = NdefFormatable.get(tag); try { ndefFormatable.open(); ndefFormatable.format(ndefMessage); } finally { ndefFormatable.close(); } • ndefFormatable.format(ndefMessage); • ndefFormatable …… NdefFormatableクラスインスタンス • ndefMessage …… 書き込むNDEF Message 12年12月9日日曜日
  • 7.
    NDEFの中身 • 例:特定のWebページのURIを含むNFCタグ(かざ すと暗黙的Intentが飛びます/ページを開きます) 12年12月9日日曜日
  • 8.
    こんな感じに書きます NdefMessage mMessage; mMessage = new NdefMessage(new NdefRecord[] { NdefRecord.createUri(“http://www.atelier-nodoka.net/”), }); ∼中略∼ ndef.connect(); ndef.writeNdefMessage(mMessage); ndef.close(); ……ほら、簡単でしょ? 12年12月9日日曜日
  • 9.
    FeliCaとNFC • 定義を確認 • FeliCa …… カードやチップの製品名(ブランド)。デ ータ構造含めてJIS X 6319で規格化。 • NFC …… 通信レイヤの標準規格で、データ構造は 範囲外。ただし、標準的なデータ構造としてNDEF がNFC Forumで定められている。 • つまり、NFCを使ってFeliCaを読み取るには適切にカ ードのコマンドを実装してあげる必要があります。 12年12月9日日曜日
  • 10.
    Advanced NFC • http://developer.android.com/guide/topics/ connectivity/nfc/advanced-nfc.html • 要約:Androidでサポートしていないテクノロジの カードを読み書きしたければ生のバイト列を用いて 通信してね。 • ……とかいいながらMIFARE ClassicとMIFARE Ultralight用のクラスが用意されてるあたりなんかず るい(一応オプションですが)。 12年12月9日日曜日
  • 11.
    FeliCaの仕様を調査 • ブロック • サービス • エリア • システム 12年12月9日日曜日
  • 12.
    ブロック • FeliCaのメモリに対する書き込み及び読み出しにお ける16バイトの単位のことです。 • R/Wから直接扱えるわけではなく、ブロックへのア クセスは後述のサービスを使用します。 12年12月9日日曜日
  • 13.
    サービス • ファイルシステム上のブロックをグループ化したも ので、ブロックへのアクセスを提供します。 • 各サービスはサービスコードによって特定します。 12年12月9日日曜日
  • 14.
    エリア • 不揮発性メモリ領域の使用可能な残ブロック数や サービスへのブロック数の割り当てを管理する単 位です。 • 複数のサービスを含むことができます。 • 今回はあまり意識しなくて大丈夫です。 12年12月9日日曜日
  • 15.
    システム • 論理的なカードの単位です。 • 1枚のカードには用途に応じた複数のシステムを含 むことができます。 • リーダ/ライタがシステムを特定するためにシステ ムコードが用いられます。 12年12月9日日曜日
  • 16.
    FeliCaコマンド • Pollingコマンド • カードを検知するためのコマンドです。 • パラメータとしてシステムコードをもちます。 • 物理的なカードとシステム(論理的なカード) を特定するIDmを取得することができます。 • Read Without Encryptionコマンド • 非暗号化領域のデータを読むことができます。 • パラメータとしてサービスコードをもちます。 12年12月9日日曜日
  • 17.
    実際のFeliCa • 独自に規定されており、(当然)どの領域に何のデ ータが入っているかは非公開です。 • ただし、有志によって解析された情報がWeb上に あるのでこれを利用します。 • 特に履歴情報は非暗号化領域に書かれているの で扱いが容易です(だからこそ扱えます)。 12年12月9日日曜日
  • 18.
    各種情報 • Suica(など、サイバネ規格交通ICカード) • システムコード:0x0003(サイバネ領域) • サービスコード(履歴情報):0x090F 12年12月9日日曜日
  • 19.
    各種情報 • nanaco  • システムコード:0xFE00(共通領域) • サービスコード(履歴情報):0x564F • WAON  • システムコード:0xFE00(共通領域) • サービスコード(履歴情報):0x680B • Edy  • システムコード:0xFE00(共通領域) • サービスコード(履歴情報):0x170F 12年12月9日日曜日
  • 20.
    NfcF#transceiveメソッド • 引数:送信バイト(FeliCaのコマンドを入れます) • 戻り値:受信バイト(FeliCaのコマンドレスポンスが 返ります) • 注意:送信バイト/受信バイトにはそれぞれ先頭に コマンドバイト長が入ります。つまり、12バイトの コマンドならば先頭に0x0D(13 = 12 + 1(先頭バイ ト分))を付加しなければいけません。 12年12月9日日曜日
  • 21.
    応用ソフトウェア • 「かお(・ν・)もじ SF CHECKER」Android版 • 実はRequest Serviceコマンドいらなかった説。 12年12月9日日曜日
  • 22.
    FeliCaへのチャージは? • 例のごとく、FeliCaコマンドが公開されていません ので、チャージはできないです。 情報とかも分か りませんし。 • 世の中おいしい話はそうそうないということです。 諦めましょう。 12年12月9日日曜日
  • 23.
    まとめ • AndroidのNFC機能を使ってFeliCaの履歴情報を読 み取る方法を解説しました。 • また、予備知識として以下を説明しました。 • AndroidのNFC機能 • FeliCaカードの技術仕様 • 実際にはカードへのアクセスはメインスレッドから 行わないようにしなくちゃいけません。 12年12月9日日曜日