Android NFC read ISO15693 RFID Tag
Asked Answered
N

1

10

I am trying to read an ISO15693 RFID tag with the nfc android library:

Here is more info on the Tag: http://img42.com/gw07d+

The Tag ID is read correctly but the data in the tag is not.

onCreate Method:

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

onNewIntent method:

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 is contains a single byte with value 0x02 ({ 0x02 }) right after the transceive method finished.

Nag answered 9/2, 2015 at 8:27 Comment(5)
and what should it read?Intervenient
@RandykaYudhistira Where I read the tag img42.com/mHBPa+Nag
Would be helpful if you could show us the actual result of nfcvTag.transceive(cmd); (without padding to 32 bytes). Moreover, could you make sure that your byte-array to hex conversion padds each byte to two hex digits (otherwise it will be difficult to interpret the value).Viticulture
@MichaelRoland I updated the question with the byte to hex converter: Here is the result of .transceive img42.com/7c30r+Nag
Can you please tell what is happening in your Common class ? can you please share code of your common classModestomodesty
V
8

So you receive a value of { 0x02 } from the transceive method. As found in this thread this may happen when you use unaddressed commands. Hence, you should always send addressed commands through NfcV (as this seems to be supported across all NFC chipsets on Android devices). In your case, you could use something like this to generate an addressed READ MULTIPLE BLOCKS command:

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);
Viticulture answered 9/2, 2015 at 16:3 Comment(3)
What does System.arraycopy(id, 0, cmd, 2, 8); do?Nag
As explained in the Java documentation: "Copies [8] elements from the array [id], starting at offset [0], into the array [cmd], starting at offset [2]."Viticulture
In this context it copies the UID (address) of the tag (that you previously retrieved with byte[] id = currentTag.getId();) into the command frame (over the placeholder bytes).Viticulture

© 2022 - 2024 — McMap. All rights reserved.