androidでfelicaの履歴を読もう

23
AndroidFeliCaの履歴を読もう 2012/12/09 Fukuoka NFC Hack 6 @treby006 12129日日曜日

Upload: treby

Post on 31-May-2015

16.893 views

Category:

Technology


1 download

DESCRIPTION

20121209 Fukuoka NFC Hack 6

TRANSCRIPT

Page 1: AndroidでFeliCaの履歴を読もう

AndroidでFeliCaの履歴を読もう

2012/12/09Fukuoka NFC Hack 6

@treby006

12年12月9日日曜日

Page 2: AndroidでFeliCaの履歴を読もう

本発表の対象• Androidで開発する機会のある方

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

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

12年12月9日日曜日

Page 3: AndroidでFeliCaの履歴を読もう

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

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

12年12月9日日曜日

Page 4: AndroidでFeliCaの履歴を読もう

NFCの標準規格• 基本的にNDEFデータによって通信

• NDEF …… NFC Data Exchange Formatの略で、MessageとRecordといったものがあります。 

• NDEF Message …… NDEF Recordを一つ以上含みます。

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

12年12月9日日曜日

Page 5: AndroidでFeliCaの履歴を読もう

Android NFC API• Gingerbread (2.3) / API 9から対応。

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

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

12年12月9日日曜日

Page 6: AndroidでFeliCaの履歴を読もう

コード例• 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日日曜日

Page 7: AndroidでFeliCaの履歴を読もう

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

12年12月9日日曜日

Page 8: AndroidでFeliCaの履歴を読もう

こんな感じに書きますNdefMessage mMessage;

mMessage = new NdefMessage(new NdefRecord[] {

NdefRecord.createUri(“http://www.atelier-nodoka.net/”),

});

~中略~

ndef.connect();

ndef.writeNdefMessage(mMessage);

ndef.close();

……ほら、簡単でしょ?

12年12月9日日曜日

Page 9: AndroidでFeliCaの履歴を読もう

FeliCaとNFC• 定義を確認

• FeliCa …… カードやチップの製品名(ブランド)。データ構造含めてJIS X 6319で規格化。

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

がNFC Forumで定められている。

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

12年12月9日日曜日

Page 10: AndroidでFeliCaの履歴を読もう

Advanced NFC• http://developer.android.com/guide/topics/

connectivity/nfc/advanced-nfc.html

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

• ……とかいいながらMIFARE ClassicとMIFARE

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

12年12月9日日曜日

Page 11: AndroidでFeliCaの履歴を読もう

FeliCaの仕様を調査• ブロック

• サービス

• エリア

• システム

12年12月9日日曜日

Page 12: AndroidでFeliCaの履歴を読もう

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

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

12年12月9日日曜日

Page 13: AndroidでFeliCaの履歴を読もう

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

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

12年12月9日日曜日

Page 14: AndroidでFeliCaの履歴を読もう

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

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

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

12年12月9日日曜日

Page 15: AndroidでFeliCaの履歴を読もう

システム• 論理的なカードの単位です。

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

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

12年12月9日日曜日

Page 16: AndroidでFeliCaの履歴を読もう

FeliCaコマンド• Pollingコマンド

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

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

12年12月9日日曜日

Page 17: AndroidでFeliCaの履歴を読もう

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

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

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

12年12月9日日曜日

Page 18: AndroidでFeliCaの履歴を読もう

各種情報• Suica(など、サイバネ規格交通ICカード)

• システムコード:0x0003(サイバネ領域)• サービスコード(履歴情報):0x090F

12年12月9日日曜日

Page 19: AndroidでFeliCaの履歴を読もう

各種情報• nanaco 

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

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

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

12年12月9日日曜日

Page 20: AndroidでFeliCaの履歴を読もう

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

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

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

12年12月9日日曜日

Page 21: AndroidでFeliCaの履歴を読もう

応用ソフトウェア• 「かお(・ν・)もじ SF CHECKER」Android版

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

12年12月9日日曜日

Page 22: AndroidでFeliCaの履歴を読もう

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

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

12年12月9日日曜日

Page 23: AndroidでFeliCaの履歴を読もう

まとめ• AndroidのNFC機能を使ってFeliCaの履歴情報を読み取る方法を解説しました。

• また、予備知識として以下を説明しました。

• AndroidのNFC機能

• FeliCaカードの技術仕様

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

12年12月9日日曜日