我尝试将ACR122集成到我的Android应用程序中。我使用ACS提供的ANDROID库(http://www.acs.com.hk/en/products/3/acr122u-usb-nfc-reader/)。
一切正常,我可以检测到卡的存在,但我想提取卡的UID / ID。有人知道这样做的功能吗?
您是否有这种集成的示例?
答案 0 :(得分:6)
如果是Mifare卡,您需要将此APDU字节数组发送到卡:(byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00
。我不确定ACR122 API,但可能需要将此APDU包装到特定的API方法中,如transmit()
<强>更新强>
示例代码:
byte[] command = { (byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
byte[] response = new byte[300];
int responseLength;
responseLength = reader.transmit(slotNum, command, command.length, response,response.length);
System.out.println(new String(response));
Reader
是com.acs.smartcard.Reader
个对象
并且slotNum
是一个插槽号。我不确定如何找到它因为我没有ACR来测试。但如果你告诉你能够与读者建立基本的沟通,你可能会知道slotNum。
答案 1 :(得分:0)
为了防止在尝试读取 UID 时出现此错误:
<块引用>com.acs.smartcard.InvalidDeviceStateException:当前状态不等于特定。
这应该是:
int slotNum = 0;
byte[] payload = new byte[] { (byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
byte[] response = new byte[7]; // 7 bytes + 90 00 (9 bytes)
try {
reader.power(slotNum, Reader.CARD_WARM_RESET);
reader.setProtocol(slotNum, Reader.PROTOCOL_T0 | Reader.PROTOCOL_T1);
reader.transmit(slotNum, payload, payload.length, response, response.length);
logBuffer(response, response.length);
} catch (ReaderException e) {
Log.e(LOG_TAG, e.getMessage(), e);
}