2015-06-15 7 views
5

के लिए एक एंड्रॉइड एनएफसी टैग ऑब्जेक्ट का नकल कैसे करें मैं वर्तमान में एक एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं जिसके लिए एनएफसी एकीकरण की आवश्यकता है। अब मैं यह देखने के लिए कुछ (जे) यूनिट परीक्षण लिखना चाहता हूं कि एप्लिकेशन एनएफसी इरादों (विशेष रूप से ACTION_TECH_DISCOVERED) प्राप्त कर सकता है और बस प्रणाली पर दिए गए टैग (NfcAdapter.EXTRA_TAG में) डाल सकता है। हालांकि मेरे आश्चर्य के लिए मैं Tag उदाहरण या नकली बना नहीं सकता। क्या कोई मुझे समझा सकता है कि मैं कैसे (इकाई) परीक्षण कर सकता हूं?इकाई परीक्षण

इस बिंदु पर मैं भी एकीकरण परीक्षण का एक रूप, की प्रक्रिया को स्वीकार करेंगे:

  1. एनएफसी आशय
  2. का पता लगाने Tag वस्तु प्राप्त
  3. बस एक CardDetectedEvent में लिपटे पर रखो ।

मेरे पास एनएफसी सक्षम और परीक्षण के लिए कुछ कार्ड हैं।

एंड्रॉयड एसडीके संस्करण: 19
पुस्तकालय इस्तेमाल किया: robolectric, JUnit और mockito

उत्तर

7

प्रतिबिंब का उपयोग करके एक नकली टैग ऑब्जेक्ट उदाहरण बनाना संभव है (ध्यान दें कि यह सार्वजनिक एंड्रॉइड एसडीके का हिस्सा नहीं है, इसलिए यह भविष्य के एंड्रॉइड संस्करणों के लिए असफल हो सकता है)।

final int TECH_NFC_A = 1; 
final String EXTRA_NFC_A_SAK = "sak"; // short (SAK byte value) 
final String EXTRA_NFC_A_ATQA = "atqa"; // byte[2] (ATQA value) 

final int TECH_NFC_B = 2; 
final String EXTRA_NFC_B_APPDATA = "appdata"; // byte[] (Application Data bytes from ATQB/SENSB_RES) 
final String EXTRA_NFC_B_PROTINFO = "protinfo"; // byte[] (Protocol Info bytes from ATQB/SENSB_RES) 

final int TECH_ISO_DEP = 3; 
final String EXTRA_ISO_DEP_HI_LAYER_RESP = "hiresp"; // byte[] (null for NfcA) 
final String EXTRA_ISO_DEP_HIST_BYTES = "histbytes"; // byte[] (null for NfcB) 

final int TECH_NFC_F = 4; 
final String EXTRA_NFC_F_SC = "systemcode"; // byte[] (system code) 
final String EXTRA_NFC_F_PMM = "pmm";  // byte[] (manufacturer bytes) 

final int TECH_NFC_V = 5; 
final String EXTRA_NFC_V_RESP_FLAGS = "respflags"; // byte (Response Flag) 
final String EXTRA_NFC_V_DSFID = "dsfid";   // byte (DSF ID) 

final int TECH_NDEF = 6; 
final String EXTRA_NDEF_MSG = "ndefmsg";    // NdefMessage (Parcelable) 
final String EXTRA_NDEF_MAXLENGTH = "ndefmaxlength"; // int (result for getMaxSize()) 
final String EXTRA_NDEF_CARDSTATE = "ndefcardstate"; // int (1: read-only, 2: read/write, 3: unknown) 
final String EXTRA_NDEF_TYPE = "ndeftype";   // int (1: T1T, 2: T2T, 3: T3T, 4: T4T, 101: MF Classic, 102: ICODE) 

final int TECH_NDEF_FORMATABLE = 7; 

final int TECH_MIFARE_CLASSIC = 8; 

final int TECH_MIFARE_ULTRALIGHT = 9; 
final String EXTRA_MIFARE_ULTRALIGHT_IS_UL_C = "isulc"; // boolean (true: Ultralight C) 

final int TECH_NFC_BARCODE = 10; 
final String EXTRA_NFC_BARCODE_BARCODE_TYPE = "barcodetype"; // int (1: Kovio/ThinFilm) 
  • अपना टैग के लिए तकनीक की अतिरिक्त बंडल बनाएं:

    Class tagClass = Tag.class; 
    Method createMockTagMethod = tagClass.getMethod("createMockTag", byte[].class, int[].class, Bundle[].class); 
    
  • नकली टैग उदाहरण तैयार करने के लिए कुछ स्थिरांक को परिभाषित करें:

    1. createMockTag() विधि हालांकि प्रतिबिंब जाओ । उदाहरण के लिए, एक एनएफसी-ए एक NDEF संदेश के साथ टैग के लिए के लिए:

      Bundle nfcaBundle = new Bundle(); 
      nfcaBundle.putByteArray(EXTRA_NFC_A_ATQA, new byte[]{ (byte)0x44, (byte)0x00 }); //ATQA for Type 2 tag 
      nfcaBundle.putShort(EXTRA_NFC_A_SAK , (short)0x00); //SAK for Type 2 tag 
      
      Bundle ndefBundle = new Bundle(); 
      ndefBundle.putInt(EXTRA_NDEF_MAXLENGTH, 48); // maximum message length: 48 bytes 
      ndefBundle.putInt(EXTRA_NDEF_CARDSTATE, 1); // read-only 
      ndefBundle.putInt(EXTRA_NDEF_TYPE, 2); // Type 2 tag 
      NdefMessage myNdefMessage = ...; // create an NDEF message 
      ndefBundle.putParcelable(EXTRA_NDEF_MSG, myNdefMessage); // add an NDEF message 
      
    2. एक विरोधी टक्कर पहचानकर्ता/आपके टैग के लिए यूआईडी (Tag.getId() विधि देखें) तैयार करें। जैसे एक टाइप 2 टैग के लिए एक 7 बाइट-यूआईडी:

      byte[] tagId = new byte[] { (byte)0x3F, (byte)0x12, (byte)0x34, (byte)0x56, (byte)0x78, (byte)0x90, (byte)0xAB }; 
      
    3. तो फिर तुम एक नकली टैग उदाहरण createMockTag() विधि

      Tag mockTag = (Tag)createMockTagMethod.invoke(null, 
           tagId,          // tag UID/anti-collision identifier (see Tag.getId() method) 
           new int[] { TECH_NFC_A, TECH_NDEF },  // tech-list 
           new Bundle[] { nfcaBundle, ndefBundle }); // array of tech-extra bundles, each entry maps to an entry in the tech-list 
      

    लागू द्वारा एक बार जब आप यह है कि नकली टैग वस्तु बनाया बना सकते हैं , आप इसे एनएफसी खोज उद्देश्य के हिस्से के रूप में भेज सकते हैं। जैसे

    Intent techIntent = new Intent(NfcAdapter.ACTION_TECH_DISCOVERED); 
    techIntent.putExtra(NfcAdapter.EXTRA_ID, tagId); 
    techIntent.putExtra(NfcAdapter.EXTRA_TAG, mockTag); 
    techIntent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ myNdefMessage }); // optionally add an NDEF message 
    

    इसके बाद आप अपनी गतिविधि को यह आशय भेज सकते हैं::

    techIntent.setComponent(...); // or equivalent to optionally set an explicit receiver 
    startActivity(techIntent); 
    

    रिसीवर भी प्रौद्योगिकी वर्ग के उदाहरणों को पुनः प्राप्त करने नकली टैग वस्तु का उपयोग कर सकते एक TECH_DISCOVERED आशय के लिए।हालांकि, आईओ ऑपरेशंस की आवश्यकता वाले किसी भी तरीके में असफल हो जाएगा।

  • 0

    मुझे नहीं लगता कि वह इन उद्देश्यों को उपहास करने के लिए संभव है के रूप में इन NFCService द्वारा और सिस्टम अनुमतियों के बिना सक्रिय किए जाते हैं यह संभव नहीं है इन इरादों को आग लगाना और वर्तमान में एनएफसी टैग का नकल करने के लिए एंड्रॉइड फ्रेमवर्क में समर्थन नहीं है।

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