2013-05-29 16 views
13

Ben Android'deki yeni ismiyim NFC API.NFC etiketinden (IsoDep) veri oku

Şu anda bir NFC etiketim var, bu veriyi okumak için Android uygulaması hazırlıyorum. Telefonum NFC Etiketi'ne yaklaştığında basit Uygulamam başlatıldı. Ancak NFC Etiketi içindeki verileri nasıl okuyacağımı bilmiyorum. Etiket, IsoDep teknolojisini kullanır.

Benim geçerli kod: internette googled

@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? 

, insanların NFC Tag gelen yanıt almak için IsoDep komutları gönderiyor fark, ben yanıttan herhalde, biz, etiketteki verileri ayrıştırabilir komut, sadece byte olduğu bir acemi olarak, ne olup bittiğini anlamak için çok zordur,

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

Ama: bunu yaptığım insanlar gördüm. Veri okuma komutunu nasıl tanımlayacağımı bilmiyorum. Herkes bana açıklayabilir mi? ya da komut hakkında öğrenebileceğim bir belge var mı?

Genellikle, tepki verileri ayrıştırmak nasıl komutları & tanımlamak için bazı yol gerekiyor, Etiket & depolanan verileri okumak istiyorum UI öğesi (örneğin TextView) dize biçiminde verileri gösterir.

* VE ***

Ben bu yapılandırmalar ile bir sorunum yok (örn AnroidManifest.xml), nasıl yapılandırılacağı ile ilgili bana yol etmeyiniz :)

cevap

14

IsoDep izin verir transceive ile bir ISO-14443-4 bağlantısı üzerinden iletişim kurmak için. Bu protokol uygulaması veri birimleri (APDU) üzerinde değiştirilir. Biçim belirtilirse, Wikipedia.

'da bir açıklama bulabilirsiniz. Belirli bir uygulama tanımlayıcısına (AID) sahip bir akıllı kart üzerinde bir uygulama seçmek için, aşağıdaki APDU komutunu çalıştırırsınız. Sonuç sadece ok (9000) veya bir hatayı belirtir. Uygulama seçildikten sonra

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"); 

, uygulama belirli komutları yürütebilirsiniz. Programlar genellikle, GlobalPlatorm spesifikasyonlarını izleyen JavaCard'da yazılır. Aşağıdaki örnek, yukarıda seçilen uygulamada, en çok 11 baytlık bir bayt dizisi döndüren yöntem 4'ü (0x04) yürütür. Bu sonuç daha sonra bir dizeye dönüştürülür.

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

neden "len-2"? Cevap nasıl yapılandırılmış, herhangi bir başlık var mı? Nevermind, wikipedia bağlantısından buldu. –

+0

sonunda 2 durum baytı [APDU] (https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit) iletisinin sonucu, yanıt verisini (uygulamaya özel) ve ardından komutu kodlayan SW1-SW2 yanıt fragmanını içerir. işleme sonucu, örneğin Örneğin. Başarı için 0x9000. Yanıt verilerinin herhangi bir yapılandırması uygulamaya özgüdür (tipik olarak [TLV] (https://en.wikipedia.org/wiki/Type-length-value) kodlaması kullanılır). – Dominik

+0

Hey Dominik, neden "yöntem 4" ü seçtin? Herhangi bir bayt olabilir mi? –