目的
AndroidのHSEのサンプルを実行して、動作確認してみます。
環境
今回は以下の機種で動作確認しました。
Android開発環境
- ビルド環境
- Android Studio 3.5.3
端末
- 1台目
- Sony SO-3L
- Android 9.0 (API level 28)
- 2台目
- Sharp SH-03J
- Android 7.1.1 (API level 25)
HSEについて
まずは、前提としてHCEについて説明します。
正式なドキュメントは以下を参照してください。
ホストベースのカード エミュレーションの概要
簡単な説明をすると、Android上でユーザーの任意のアプリとNFCリーダとの通信を実現するための仕組みです。
通常、NFC通信はAndroidアプリまで通信が届きません。
NFCリーダからの通信は、通常はセキュアエレメントとの通信で完結します。
しかし、HCEの仕組みにより、NFCリーダーとAndroidアプリの直接通信が可能となります。
通信先アプリの選択方法について
通常はセキュアエレメントとの通信を行うと説明しましたが、それを任意のアプリにとの通信に切り替えるためには、どうすればよいのでしょうか?
アプリ側はAndroid OSに対し、Application ID (AID)を指定してServiceを登録します。
カード検知だけではアプリには通知は行きません。
カードリーダ側は検知後にApplication ID (AID)を指定して通信することで対象のアプリとの通信を開始します。
AID選択後の通信は Application Protocol Data Units(APDU)のプロトコルで行います。
AIDで選択したあとはAPDUでの通信のみの規定のみが決まっており、APDUプロトコル上での通信内容はアプリで自由に設定することになります。
対応範囲について
HCE(TypeA)はAPI level 19 ( Android 4.4 ) から実装されました。
詳細は以下を参照してください。
Type-FでのHCEの正式対応は API level 24 ( Android 7.0 ) 以降の対応となっています。
HSEの動作確認
まずは、HCEのサンプルのアプリをビルド、インストールします。
環境
今回は以下の機種で動作確認しました。
- 端末
- Sony SO-3L
- Android 9.0 (API level 28)
他の環境では今回確認していませんが、もっと前のVersionでも問題はないとは思います。
Androidアプリ
以下のURLのソースを元にアプリを作成します。
https://github.com/googlearchive/android-CardEmulation
ソースコードを確認したところ、AIDは「F222222222」となっているようです。
private static final String SAMPLE_LOYALTY_CARD_AID = "F222222222";
ビルドできたらインストールして起動確認しておきます。
HSE通信確認アプリ
対向側のReader側のアプリを作成、インストールします。
環境
今回は以下の機種で動作確認しました。
- 端末
- Sharp SH-03J
- Android 7.1.1 (API level 25)
Androidアプリ
以下のURLのソースを元にアプリを作成します。
https://github.com/googlearchive/android-CardReader
こちらもソースコードを確認したところ、AIDは「F222222222」となっているようです。
private static final String SAMPLE_LOYALTY_CARD_AID = "F222222222";
動作確認
両方のアプリを起動し、通信を実行してみます。
CardReaderのLogを確認し、データ受信できていることを確認します。
次回
PCとの通信を確認します。
Android HCE 調査メモ(その2)