通过分析该卡片使用安卓应用程序NFC TagInfo ,我发现该应用程序(AID:15845F)拥有我需要的特定文件(文件ID:01)。
我已经成功连接到卡片并选择了应用程序。
String action = getIntent().getAction();
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action))
{
Tag tagFromIntent = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.i(TAG, Arrays.toString(tagFromIntent.getTechList()));
IsoDep isoDep = IsoDep.get(tagFromIntent);
try
{
isoDep.connect();
byte[] SELECT = {
(byte) 0x00, // CLA = 00 (first interindustry command set)
(byte) 0xA4, // INS = A4 (SELECT)
(byte) 0x04, // P1 = 04 (select file by DF name)
(byte) 0x0C, // P2 = 0C (first or only file; no FCI)
(byte) 0x06, // Lc = 6 (data/AID has 6 bytes)
(byte) 0x31, (byte) 0x35,(byte) 0x38,(byte) 0x34,(byte) 0x35,(byte) 0x46 // AID = 15845F
};
byte[] result = isoDep.transceive(SELECT);
Log.i(TAG, "SELECT: " + bin2hex(result));
if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00))
throw new IOException("could not select application");
byte[] GET_STRING = {
(byte) 0x00, // CLA Class
(byte) 0xB0, // INS Instruction
(byte) 0x00, // P1 Parameter 1
(byte) 0x00, // P2 Parameter 2
(byte) 0x04 // LE maximal number of bytes expected in result
};
result = isoDep.transceive(GET_STRING);
Log.i(TAG, "GET_STRING: " + bin2hex(result));
}
}
但是我的第二个查询失败了,出现了错误代码:6A86(P1-P2参数不正确)。我已经谷歌搜索了很多,并找到了不同的文档(例如:http://bit.ly/180b6tB),但我就是不能理解如何为P1和P2实现正确的值。
编辑
使用NFC TagInfo标记卡的标签类型:ISO/IEC 14443-4智能卡,Mifare DESFire EV1(MF3ICD81)
源代码中使用的SELECT命令实际上没有失败,而是返回了9000响应。所以这就是为什么我认为一切正常的原因。
您提到NFC TagInfo没有提供DF名称等的正确值。值0x313538343546是否正确,您是如何发现这一点的?
您能否给我提供一个简短的描述,我该如何获得想要的数据?是否有其他可以用来读取正确的DF名称、AID等的Android应用程序?我基本上需要从一个应用程序中获取一个文件。如果需要,我还可以提供一些使用NFC TagInfo收集的信息截图。
编辑2
我已重新编写命令,但(如您所提议的)将它们保留在APDU包装器中。因此,我最终有了两个不同的命令,一个用于选择应用程序,另一个用于选择文件。
private final byte[] NATIVE_SELECT_APP_COMMAND = new byte[]
{
(byte) 0x90, (byte) 0x5A, (byte) 0x00, (byte) 0x00, 3, // SELECT
(byte) 0x5F, (byte) 0x84, (byte) 0x15, (byte) 0x00 // APPLICATION ID
};
private final byte[] NATIVE_SELECT_FILE_COMMAND = new byte[]
{
(byte) 0x90, (byte) 0xBD, (byte) 0x00, (byte) 0x00, 7, // READ
(byte) 0x01, // FILE ID
(byte) 0x00, (byte) 0x00, (byte) 0x00, // OFFSET
(byte) 0x00, (byte) 0x00, (byte) 0x00, // LENGTH
(byte) 0x00
};
寻找原生Mifare-Desfire命令教程的尝试没有成功,所以我遵循以下教程:http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html。
此教程提供了一种卡认证方法,但我已将其禁用,并且使用了transceive方法来执行原生命令。根据我的理解,这不是一个适当的执行原生命令的方式?有哪些方法(甚至是代码片段)可以用于执行原生命令? 我应该使用哪个Android类?
我重写了该教程中提供的类,并将其上传到 pastebin。执行该类后,我得到了以下结果。
Select APPLICATION: 9100
Read DATA: 91AE
目前我陷入困境,不知道接下来该采取什么步骤。这到底是一个错误,还是查询中需要做出哪些更改才能获得我想要的数据?