2013-05-29 29 views
13

私はAndroidの初心者NFC APIです。NFCタグからデータを読み取る(IsoDep)

現在、私はNFCタグを持っています。私はそれからデータを読み取るためにAndroidアプリを作っています。私の携帯電話がNFCタグに十分に近づくと、私の簡単なアプリケーションが起動されます。しかし、NFCタグ内のデータをどのように読み込むのか分かりません。タグはのIsoDep技術を使用します。

私の現在のコード:私はインターネット上でググ

@Override 
protected void onResume(){ 
    super.onResume(); 

    Intent intent = getIntent(); 
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 

    IsoDep isoDep = IsoDep.get(tag); 

    // How to read data from IsoDep instance? 

、私は人々がNFCタグからの応答を取得するためにIsoDepにコマンドを送信する通知が、私は応答からと仮定し、我々は、タグ内のデータを解析することができます

//What is the 'command' ? How to define the command? 
//e.g.: 
byte command = (byte) 0x6A 
isoDep.transceive(command) 

しかし、コマンドは初心者として、何が起こっているかを理解することは非常に困難である、ちょうどbyteです:私は、人々はこれをやって見ました。データを読み込むコマンドを定義する方法がわかりません。誰でも私に説明することができますか?またはコマンドについて知ることができるドキュメントがありますか?

は一般的に、私は応答からのデータを解析する方法コマンド&を定義する方法のいくつかのガイダンスを必要とする、私はタグ&に格納されたデータを読みたいUIエレメント(例えばTextView)のString形式のデータを示しています。

*および***

私はこれらの構成に問題がない(例えばAnroidManifest.xml)、設定する方法の私を案内しないでください:)

答えて

14

IsoDepはあなたを可能にtransceive操作でISO-14443-4接続で通信します。このプロトコルでは、アプリケーションデータユニット(APDU)が交換されます。書式が指定されています。Wikipedia.

特定のアプリケーションID(AID)を持つスマートカード上のアプリケーションを選択するには、次のAPDUコマンドを実行します。結果は単にok(9000)またはエラーを示します。

byte[] SELECT = { 
     (byte) 0x00, // CLA Class   
     (byte) 0xA4, // INS Instruction  
     (byte) 0x04, // P1 Parameter 1 
     (byte) 0x00, // P2 Parameter 2 
     (byte) 0x0A, // Length 
     0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID 
    }; 

    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    IsoDep tag = IsoDep.get(tagFromIntent); 

    tag.connect(); 
    byte[] result = tag.transceive(SELECT); 
    if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) 
     throw new IOException("could not select applet"); 

アプリケーションを選択すると、アプリケーション固有のコマンドを実行できます。プログラムは通常、GlobalPlatorm仕様に従うJavaCardで記述されます。次の例では、上記の選択されたアプリケーションに対して、最大11バイトのバイト配列を返すメソッド4(0x04)を実行します。この結果は、文字列に変換されます。

byte[] GET_STRING = { 
     (byte) 0x80, // CLA Class   
     0x04, // INS Instruction 
     0x00, // P1 Parameter 1 
     0x00, // P2 Parameter 2 
     0x10 // LE maximal number of bytes expected in result 
    }; 

    result = tag.transceive(GET_STRING); 
    int len = result.length; 
    if (!(result[len-2]==(byte)0x90&&result[len-1]==(byte) 0x00)) 
     throw new RuntimeException("could not retrieve msisdn"); 

    byte[] data = new byte[len-2]; 
    System.arraycopy(result, 0, data, 0, len-2); 
    String str = new String(data).trim(); 

    tag.close(); 
+0

なぜ "len-2"ですか?レスポンスはどのように構造化されていますか、ヘッダーはありますか? Nevermindは、ウィキペディアのリンクから見つけました。終了時の2ステータスバイト –

+0

[APDU](https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit)メッセージの結果には、応答データ(アプリケーション固有)とコマンドをエンコードする応答トレーラSW1-SW2が続きます処理結果、例えば例えば成功のための0x9000。応答データの構造化はアプリケーション固有です(通常、[TLV](https://en.wikipedia.org/wiki/Type-length-value)エンコーディングが使用されます)。 – Dominik

+0

ちょっとドミニク、なぜ "方法4"を選んだの?それはどんなバイトでもいいですか? –

関連する問題