使用标签的收发方法发送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();
}
}
}
答案 0 :(得分:1)
标记技术NfcA
(以及NfcB
)用于使用ISO 14443-3专有命令集进行通信。 APDU通常在ISO-DEP / T = CL(ISO 14443-4传输协议)之上发送,因此您希望使用IsoDep
标记技术而不是NfcA
。
此外,您可能希望使用略低的超时值。通常,大约1到10秒的值应该足够(到目前为止) - 除非您在智能卡上触发一些复杂的操作。