How send NfcA command to the MIFARE card?

限于喜欢 提交于 2019-12-08 04:26:13

问题


I'm writing an Android application. I'm trying to send NfcA low-level commands (in my case: HALT and WAKE-UP) to my Mifare Plus S card. The NfcA tech is for "low-level" access to ISO 14443 Type A tags (i.e. the proprietary protocol as mentioned in ISO 14443-3).

This is part of my code:

protected void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        UID = Utils.byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
    }
    NfcA nfca = null;
    try {
        Log.e(TAG, "WakeUpCMD and HaltCMD");
        nfca = NfcA.get(tagFromIntent);
        nfca.connect();
        Short s = nfca.getSak();
        byte[] a = nfca.getAtqa();
        byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
        byte[] WakeUpCMD = {0x35, 0x32, 0x00};
        byte[] data = null;
        try {
            data = nfca.transceive(HaltCMD);
            length = data.length;
        }
        catch (Exception e){
            Log.e(TAG, "HALT complete "+Utils.byteArrayToHexString(data));
        }
        Log.e(TAG, "Tag is connected: "+nfca.isConnected());
        //Log.e(TAG, "Response from tag "+Utils.byteArrayToHexString(data));
        nfca.setTimeout(100);
        data = nfca.transceive(WakeUpCMD);
        Log.e(TAG, "Response from tag"+Utils.byteArrayToHexString(data));
        nfca.close();
    } catch (Exception e) {
        Log.e(TAG, "Error when reading tag");

    }
} 

WAKE-UP Command is sent by the PCD to put PICCs which have entered the HALT State back into the READY State. They shall then participate in further anticollision and selection procedures.

|b7| |b6| |b5| |b4| |b3| |b2| |b1|

|1  |  | 0 |  | 1|  | 0|  | 0|  | 1|  | 0| {‘52’} = WAKE-UP

HALT Command consists of four bytes and shall be transmitted using the Standard Frame. First bit transmitted

S | ‘50’ | ‘00’ | CRC_A | E

If the PICC responds with any modulation during a period of 1 ms after the end of the HALT Frame, this response shall be interpreted as 'not acknowledge'.

This is the descriptions of the two commands from ISO 14443-3 which I try to send to my card.

When I start my app, I get a "Tag Lost" Exception. Can you help me? What's wrong? How can I send these commands?


回答1:


It seems as if you are converting the command codes into null-terminated ASCII character strings before sending them with NfcA.transceive():

byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
byte[] WakeUpCMD = {0x35, 0x32, 0x00};
  • 0x35 0x30 0x30 0x30 gives "5000"
  • 0x35 0x32 gives "52"

This does not make any sense as the commands (50 00 for HLTA, and 52 for WUPA) are hexadecimal representations of the command values already.

For the HLTA command, you would therefore need to send 50 00:

data = nfca.transceive(new byte[] { (byte)0x50, (byte)0x00 });

Note that S (start of communication), E (end of communication), and CRC_A will be automatically added by the NFC controller (or the NFC stack).

For the WUPA command, you could probably try to send 52:

data = nfca.transceive(new byte[] { (byte)0x52 });

However, it is very likely that the NFC stack does not permit you to send 7-bit commands using the transceive method. Instead, the stack may automatically use this command value as one full byte and add a CRC_A.

General note on sending ISO/IEC 14443-3 initialization and anti-collision commands

Sending such commands may or may not work (depending on the NFC stack implementation and the NFC controller). In general I would strongly recommend that you do not send such commands. Particularly the HLTA command will confuse the internal state keeping of the NFC stack on some devices and will lead to unexpected results. Normally, you don't need to exchange such commands, as anti-collision, initialization and activation are handled automatically by the NFC device.



来源:https://stackoverflow.com/questions/31561858/how-send-nfca-command-to-the-mifare-card

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!