17

私は Android NFC API の初心者です。

現在、私は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?

インターネットでググったところ、人々がコマンドを送信してIsoDepNFC タグから応答を取得していることに気付きました。応答から、タグ内のデータを解析できると思います。人々がこれを行っているのを見ました:

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

しかし、コマンドはただのbyte. データを読み取るコマンドを定義する方法がわかりません。誰でも私に説明できますか?または、コマンドについて学ぶことができるドキュメントはありますか?

一般に、コマンドを定義する方法と応答からデータを解析する方法についてのガイダンスが必要です。タグに保存されているデータを読み取り、データを UI 要素 (例TextView) の文字列形式で表示したいと思います。

*と***

私はこれらの設定 (例: AnroidManifest.xml) に問題はありません。設定方法を教えないでください :)

4

1 に答える 1

20

IsoDep を使用すると、ISO-14443-4 接続を介してtransceiveオペレーションと通信できます。このプロトコル上で、アプリケーション データ ユニット (APDU) が交換されます。形式が指定されています。ウィキペディアに説明があります。

たとえば、特定のアプリケーション識別子 (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();
于 2013-05-31T09:16:57.953 に答える