2013-05-29 7 views
13

से डेटा पढ़ें मैं एंड्रॉइड एनएफसी एपीआई में नौसिखिया हूं।एनएफसी टैग (आईएसडीईपी)

वर्तमान में, मेरे पास एक एनएफसी टैग है, मैं इससे डेटा पढ़ने के लिए एक एंड्रॉइड ऐप बना रहा हूं। मेरा सरल ऐप लॉन्च किया जाता है जब मेरा फोन एनएफसी टैग के करीब आता है। लेकिन मुझे नहीं पता कि एनएफसी टैग के अंदर डेटा कैसे पढ़ा जाए। टैग 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? 

मैं इंटरनेट पर googled, मैं लोगों को IsoDep को आदेश भेज रहे हैं NFC टैग से प्रतिक्रिया प्राप्त करने के लिए नोटिस, मैं प्रतिक्रिया से लगता है, हम टैग में डेटा पार्स कर सकते हैं, मैं लोगों को यह कर देखा:

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

लेकिन, आदेश सिर्फ एक byte, एक नौसिखिया के रूप में, यह समझना क्या हो रहा है बहुत मुश्किल है। मुझे नहीं पता कि डेटा को पढ़ने के लिए कमांड को कैसे परिभाषित किया जाए? कोई मुझे समझा सकता है? या क्या कोई दस्तावेज़ है जो मैं कमांड के बारे में जान सकता हूं?

आम तौर पर, मैं कैसे आदेशों & प्रतिक्रिया से डेटा पार्स करने के लिए कैसे परिभाषित करने के लिए पर कुछ मार्गदर्शन की जरूरत है, मैं टैग & में संग्रहीत डेटा को पढ़ने के लिए चाहते हैं यूआई तत्व (जैसे TextView) में स्ट्रिंग प्रारूप में डेटा दिखाते हैं।

* और ***

मैं उन विन्यास के साथ कोई समस्या नहीं है (उदाहरण के लिए AnroidManifest.xml), मुझे कैसे कॉन्फ़िगर करने के लिए पर मार्गदर्शन नहीं करते कृपया :)

उत्तर

14

IsoDep आप की अनुमति देता है transceive ऑपरेशन के साथ एक आईएसओ -14443-4 कनेक्शन पर संवाद करने के लिए। इस प्रोटोकॉल पर एप्लिकेशन डेटा इकाइयों (एपीडीयू) का आदान-प्रदान किया जाता है। प्रारूप निर्दिष्ट है, आपको Wikipedia.

एक विशेष एप्लिकेशन पहचानकर्ता (एआईडी) के साथ एक स्मार्ट कार्ड पर एक एप्लिकेशन का चयन करने के लिए, आप निम्नलिखित APDU कमांड निष्पादित करेंगे। परिणाम बस ठीक (9 000) या एक त्रुटि इंगित करता है।

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

एप्लिकेशन का चयन करने के बाद, आप एप्लिकेशन विशिष्ट आदेश निष्पादित कर सकते हैं। कार्यक्रम आमतौर पर जावाकार्ड में लिखे जाते हैं जो ग्लोबलप्लार्मॉर्म स्पेक का पालन करते हैं। निम्न उदाहरण उपरोक्त चयनित एप्लिकेशन पर विधि 4 (0x04) निष्पादित करता है जो अधिकतम 11 बाइट्स पर बाइट सरणी देता है। इसके परिणामस्वरूप एक स्ट्रिंग में परिवर्तित किया जाता है।

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

क्यों "लेन -2"? प्रतिक्रिया कैसे संरचित है, क्या कोई हेडर है? कभी नहीं, इसे विकिपीडिया लिंक के माध्यम से मिला। अंत में 2 स्थिति बाइट –

+0

एक परिणाम [एपीडीयू] (https://en.wikipedia.org/wiki/Smart_card_application_protocol_data_unit) संदेश में प्रतिक्रिया डेटा (एप्लिकेशन विशिष्ट) होता है जिसके बाद प्रतिक्रिया ट्रेलर SW1-SW2 होता है जो कमांड को एन्कोड करता है प्रसंस्करण परिणाम, उदाहरण के लिए जैसे सफलता के लिए 0x9000। प्रतिक्रिया डेटा की कोई भी संरचना अनुप्रयोग विशिष्ट है (आमतौर पर एक [टीएलवी] (https://en.wikipedia.org/wiki/Type-length-value) एन्कोडिंग का उपयोग किया जाता है)। – Dominik

+0

हे डोमिनिक, आपने "विधि 4" क्यों चुना है, क्या यह कोई बाइट हो सकता है? –

संबंधित मुद्दे