【发布时间】:2013-10-10 13:06:50
【问题描述】:
我正在尝试从 ISO/IEC 14443 Type A 卡中读取一些信息。
使用安卓应用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 等?我基本上需要从 ONE 应用程序中获取 ONE 文件。如果需要,我还可以提供一些使用 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
};
搜索原生 Mifire-Desfire 命令教程没有成功,所以我坚持以下教程:http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html
本教程提供了一个卡认证,我禁用了它,并且还使用了 transceive 方法,在我看来这不是执行本机命令的正确方法?哪种方法,甚至可能是代码片段,用于执行本机命令?我应该使用哪个 Android-Class?
我已经重写了教程中提供的类并上传到pastebin。执行完课程后,我得到了以下结果。
Select APPLICATION: 9100
Read DATA: 91AE
在这一点上,我很困惑,不知道下一步我应该做什么。实际上是错误还是我应该在查询中执行哪些更改以获得我想要的数据?
【问题讨论】:
标签: android nfc mifare apdu contactless-smartcard