実は・・・今週のHCE記事だが、日曜日に書きためたものを4日に分けてスケジュール投稿する、ということをしてみた。
5日目の今日は、12/18の2時半くらいに書いている。
目がしょぼしょぼだ・・・。
さて、4回目では、Windows8.1 + PaSoRi RC-S380を使って、Type4のまねをしているNexus7のHCE動作を見てもらおうとしたが失敗したところであった。
何がいかんかというと、よくわからんバイナリを受信して、よくわからんバイナリを返している、という部分だ。
バイナリデータがある限り、我々は解析をしなくてはならない。
ましてや、NFC HACKSという本があるのに、解析しないでいることができようか(いや、解析せずにはいられない)?
そんなわけで、HACK#17「NFC Forum Type 4 Tag」を開いた。
ふむ、よく聞く「T=CL」というのは通称だったんだ、とか、EFファイルってSIMカードの構造もそうだったよな、などと思い返しつつ読んでいると、まねしようとしていたNDEFメッセージの読み込みシーケンスがそのまま書いてあった。
ふむふむ、スライドに書かれているバイナリ値は、直接やりとりしている値ではなく、意味があるところだけ抜き出しているのだな。
ならば、そのまま送るだけではダメなのは当然だ。
プログラムはスライドを参考に、データはNFC HACKSを参考にして、こんなプログラムにした。
(これはこれで省略もあるがね。)
import android.nfc.cardemulation.HostApduService;import android.os.Bundle;import android.util.Log;public class HostSampleService extends HostApduService {static enum CardStatus {INIT,CCFILE,REQ_DATA,OPEN,LEN,RET_DATA}final static byte[] SUCCESS = { (byte)0x90, (byte)0x00 };final static byte[] REQ_DATA = {(byte)0x00, (byte)0x0f, //CCLEN(byte)0x20, //Mapping Version(byte)0x00, (byte)0x40, //MLe(byte)0x00, (byte)0x40, //MLc//TLV(NDEF File Control)(byte)0x04, //Tag(byte)0x06, //LEN(byte)0xe1, (byte)0x04, //signature(byte)0x00, (byte)0x32, //max ndef size(byte)0x00, //read access permission(byte)0x00, //write access permission//success(byte)0x90, (byte)0x00};final static byte[] LEN = { (byte)0x00, (byte)0x03 };final static byte[] RET_DATA = {(byte)0x00, (byte)0x03, //LEN//message(byte)0xd0, (byte)0x00, (byte)0x00, //empty//success(byte)0x90, (byte)0x00};private final static String TAG = "HostSampleService";private CardStatus mCardStatus = CardStatus.INIT;@Overridepublic void onDeactivated(int reason) {mCardStatus = CardStatus.INIT;}@Overridepublic byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {for (int i = 0; i < commandApdu.length; i++) {Log.d(TAG, Integer.toHexString(commandApdu[i] & 0xff));}switch (mCardStatus) {case INIT:Log.d(TAG, "init");mCardStatus = CardStatus.CCFILE;return SUCCESS;case CCFILE:Log.d(TAG, "ccfile");mCardStatus = CardStatus.REQ_DATA;return SUCCESS;case REQ_DATA:Log.d(TAG, "reqdata");mCardStatus = CardStatus.OPEN;return REQ_DATA;case OPEN:Log.d(TAG, "open");mCardStatus = CardStatus.LEN;return SUCCESS;case LEN:Log.d(TAG, "len");mCardStatus = CardStatus.RET_DATA;return LEN;case RET_DATA:Log.d(TAG, "retdata");mCardStatus = CardStatus.INIT;return RET_DATA;default:return SUCCESS;}}}
これをNexus7に焼いて、PaSoRiに近づけると、Windows8.1からあのNDEFタグ検知したときに聞こえるあの音がしているではないか!
NDEFの中身がEmptyなので動作はしないけれども、ここにURIとか書いておけばトースト表示してくれるんじゃないだろうか。
興味はあるが、今回はやめておこう。
もっと気力があるときにやらないとな。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。