如何将NfcA命令发送到MIFARE卡?

时间:2015-07-22 11:30:59

标签: android nfc mifare

我正在编写Android应用程序。我试图将NfcA低级命令(在我的情况下:HALT和WAKE-UP)发送到我的Mifare Plus S卡。 NfcA技术用于"低级"访问ISO 14443 A类标签(即 ISO 14443-3中提到的专有协议。

这是我的代码的一部分:

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

    }
} 

唤醒 PCD发送命令,将已进入HALT状态的PICC放回READY 州。然后他们将参与进一步的防撞和选择程序。

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

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

HALT 命令由四个字节组成,并应使用标准帧传输。 第一位传输

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

如果PICC在HALT帧结束后的1 ms内响应任何调制,则该响应应解释为“不确认”。

这是我尝试发送到我的卡的ISO 14443-3中两个命令的描述。

当我启动我的应用程序时,我得到一个" Tag Lost"例外。你能帮助我吗?怎么了?我该如何发送这些命令?

1 个答案:

答案 0 :(得分:2)

在使用NfcA.transceive()发送命令代码之前,好像是将命令代码转换为以null结尾的ASCII字符串:

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

这没有任何意义,因为命令(HLTA的50 00和WUPA的52)是命令值的十六进制表示。

对于HLTA命令,您需要发送50 00

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

请注意,NFC控制器(或NFC堆栈)将自动添加S(通信开始),E(通信结束)和CRC_A。

对于WUPA命令,您可能会尝试发送52

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

但是,NFC堆栈很可能不允许您使用收发方法发送7位命令。相反,堆栈可以自动将此命令值用作一个完整字节并添加CRC_A。

关于发送ISO / IEC 14443-3初始化和防冲突命令的一般说明

发送此类命令可能有效,也可能无效(取决于NFC堆栈实施和NFC控制器)。一般情况下,我强烈建议您发送此类命令。特别是HLTA命令会混淆NFC堆栈在某些设备上的内部状态保持,并将导致意外结果。 通常情况下,您无需更换此类命令,因为NFC设备会自动处理防冲突,初始化和激活。