2015-02-09 17 views
6

Tôi cố gắng để đọc một thẻ ISO15693 RFID với thư viện android nfc:Android NFC đọc ISO15693 RFID Tag

Dưới đây là thông tin thêm về các Tag: http://img42.com/gw07d+

Các ID thẻ được đọc một cách chính xác nhưng dữ liệu trong thẻ thì không.

onCreate Phương pháp:

// initialize NFC 
    nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    nfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

onNewIntent phương pháp:

if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { 

     currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     byte[] id = currentTag.getId(); 
     Tag_data_TextDisplay.setText("TagId:" + Common.getHexString(id)); 

     for (String tech : currentTag.getTechList()) { 

      if (tech.equals(NfcV.class.getName())) { 
       NfcV nfcvTag = NfcV.get(currentTag); 

       try { 
        nfcvTag.connect(); 
        txtType.setText("Hello NFC!"); 
       } catch (IOException e) { 
        Toast.makeText(getApplicationContext(), "Could not open a connection!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       try { 
        byte[] cmd = new byte[]{ 
          (byte) 0x00, // Flags 
          (byte) 0x23, // Command: Read multiple blocks 
          (byte) 0x00, // First block (offset) 
          (byte) 0x04 // Number of blocks 
        }; 
        byte[] userdata = nfcvTag.transceive(cmd); 

        userdata = Arrays.copyOfRange(userdata, 0, 32); 
        txtWrite.setText("DATA:" + Common.getHexString(userdata)); 

       } catch (IOException e) { 
        Toast.makeText(getApplicationContext(), "An error occurred while reading!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 
      } 
     } 
    } 

userdata là chứa một byte đơn có giá trị 0x02 ({ 0x02 }) ngay sau khi phương pháp Transceive xong.

+0

và nó nên đọc gì? –

+0

@RandykaYudhistira Nơi tôi đọc thẻ http://img42.com/mHBPa+ – yoshgoodman

+0

Sẽ hữu ích nếu bạn có thể cho chúng ta biết kết quả thực tế của 'nfcvTag.transceive (cmd);' (không có đệm tới 32 byte). Hơn nữa, bạn có thể chắc chắn rằng mảng byte của bạn để chuyển đổi hex padds mỗi byte đến hai chữ số hex (nếu không nó sẽ rất khó để giải thích giá trị). –

Trả lời

2

Vì vậy, bạn nhận được giá trị { 0x02 } từ phương thức transceive. Như được tìm thấy trong this thread điều này có thể xảy ra khi bạn sử dụng các lệnh không được thêm. Do đó, bạn nên luôn gửi các lệnh được giải quyết thông qua NfcV (vì điều này dường như được hỗ trợ trên tất cả các chipset NFC trên các thiết bị Android). Trong trường hợp của bạn, bạn có thể sử dụng một cái gì đó như thế này để tạo ra một lệnh READ MULTIPLE BLOCKS được giải quyết:

int offset = 0; // offset of first block to read 
int blocks = 1; // number of blocks to read 
byte[] cmd = new byte[]{ 
     (byte)0x60,     // flags: addressed (= UID field present) 
     (byte)0x23,     // command: READ MULTIPLE BLOCKS 
     (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // placeholder for tag UID 
     (byte)(offset & 0x0ff),  // first block number 
     (byte)((blocks - 1) & 0x0ff) // number of blocks (-1 as 0x00 means one block) 
}; 
System.arraycopy(id, 0, cmd, 2, 8); 
byte[] response = nfcvTag.transceive(cmd); 
+0

Cảm ơn bạn, công trình này – yoshgoodman

+0

'System.arraycopy (id, 0, cmd, 2, 8); 'làm gì? – yoshgoodman

+0

Như đã giải thích trong tài liệu Java: "* Sao chép [8] phần tử từ mảng [' id'], bắt đầu tại offset [0], vào mảng ['cmd'], bắt đầu tại offset [2]. *" –

Các vấn đề liên quan