Contenu connexe
Similaire à AndroidでFeliCaの履歴を読もう (20)
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日日曜日
- 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日日曜日