今さら感満載ですが、Android 4.4 からは HCE(Host-based Card Emulation) という機能が搭載されています。
通常 NFC のカードエミュレーションを利用するときは、SE(Secure Element) というのが必要で、リーダはこの人とおしゃべりをすることになっています。この人がカードの実体と言っても過言ではないわけですね。
で、SEの変わりを Android(のアプリ)側が務めましょうというのが HCE なわけです。ネットを見ると ACR122U で HCE をやってみた的な事例はたくさんありますので今回はあえてパソリを使ってみます。
HCE は TypeA を使うそうなので、SDK for NFC を使います。そうすると PC側のソースを載せるのがいかがなものかということになるわけですが、まぁ、SDK のサンプルコードをほぼそのまま使いましたということでその辺はお許しください。
Android側はネットにもたくさん情報あるのでその通りに実装しました。
今回は簡単に Android端末がカードのふりをして現在時刻を返すというシンプルな実装にしました。
具体的には
■PC -> パソリ -> HCE
SELECTコマンド
0x00 0xA4 0x04 0x00 0x07 0xF0 0x01 0x02 0x03 0x04 0x05 0x06
(AID:アプリケーションIDが F0010203040506 のやつを選択という意味です。AIDは上記の apduserveice.xml 内に定義してます。これにより動作させるアプリを選択させるわけです)
■HCE -> パソリ -> PC
OK(0x90 0x00)
■PC -> パソリ -> HCE
独自コマンド
0x01 0x02 0x03
■HCE -> パソリ -> PC
時、分、秒+OK (hour minute second 0x90 0x00)
というコマンドの流れです。
これで双方を実行してパソリにAndroid端末をかざすと...
きました! 16進数表記になってますが、時、分、秒が返ってきました。
ちなみにスリープ状態でも読めるか試しましたがダメでした。
ロック画面では読めました。通常のリーダーモードよりは緩い感じですねー。