发送SELECT PPSE命令时获取TagLostException

时间:2014-02-10 16:14:41

标签: android nfc apdu emv contactless-smartcard

使用标签的收发方法发送SELECT PPSE命令时,我收到标签丢失异常。

意图传递给readTag,方法从意图中获取标记,但调用SELECT PPSE命令APDU的收发方法会导致标记丢失异常,而不是获取响应APDU消息:

public void readTag(Intent intent) {
    String action = intent.getAction();
    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
        System.out.println("Got the tag");
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        NfcA mfc = NfcA.get(tagFromIntent);
        System.out.println(mfc);
        try {
            mfc.connect();
            System.out.println(mfc.getTag());
            System.out.println(mfc.getClass());
            byte[] ATQA = mfc.getAtqa();
            System.out.println(getHexString(ATQA));
            System.out.println(mfc.getMaxTransceiveLength());
            mfc.setTimeout(500000);

            String value = "00A404000e325041592e5359532e444446303100"; //PPSE APDU value
            String hex = value.toString();
            byte[] data = HexToByte(hex);
            byte[] response = mfc.transceive(data); //sending request
            System.out.println(getHexString(response));
            mfc.close();
        } catch(Exception e) {
            Toast.makeText(getBaseContext(), e.getMessage(),
                           Toast.LENGTH_SHORT).show();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

标记技术NfcA(以及NfcB)用于使用ISO 14443-3专有命令集进行通信。 APDU通常在ISO-DEP / T = CL(ISO 14443-4传输协议)之上发送,因此您希望使用IsoDep标记技术而不是NfcA

此外,您可能希望使用略低的超时值。通常,大约1到10秒的值应该足够(到目前为止) - 除非您在智能卡上触发一些复杂的操作。