- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试从 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 Smart Card, Mifare DESFire EV1 (MF3ICD81)
源代码中使用的 SELECT 命令实际上并没有失败,而是返回了 9000 响应。所以这就是我认为一切正常的原因。
您提到 NFC TagInfo 没有为 DF 名称等提供正确 值。0x313538343546 值是否正确,您是如何做到的找到了吗?
你能给我一个简短的描述吗?我怎样才能得到我想要的数据?是否有任何其他 android 应用程序可用于读取正确的 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 方法,据我所知,这不是执行 native 命令的正确方法吗?哪种方法(甚至可能是代码 fragment )用于执行 native 命令?我应该使用哪个 Android 类?
我已经重写了教程中提供的类并上传到pastebin .执行该类(class)后,我得到了以下结果。
Select APPLICATION: 9100
Read DATA: 91AE
在这一点上,我很困惑,不知道下一步应该做什么。实际上是错误还是我应该对查询执行哪些更改才能获得我想要的数据?
最佳答案
鉴于您从 NFC TagInfo 中提取的信息和您尝试使用的命令,我假设该卡是 MIFARE DESFire EV1。正确吗?
关于您的选择命令:NFC TagInfo 当前不读取 DESFire EV1 的 ISO 命令集中使用的 DF 名称值。因此,我假设为此应用程序设置的 DF-name 实际上是 0x313538343546,否则 SELECT 命令应该会失败。但是请注意,这个值绝不是从 NFC TagInfo 中显示的 DESFire AID 推导出来的!事实上,DF 名称是在应用程序创建期间定义的单独值。 (这与以前的 DESFire 版本不同。)
关于您的 READ BINARY 命令:您使用的命令意味着您之前选择了一个文件。但是,您只选择了应用程序。因此,您需要为数据文件发出 SELECT 命令或在 READ BINARY 命令中使用短文件 ID:
byte[] READ_BINARY = {
(byte) 0x00, // CLA Class
(byte) 0xB0, // INS Instruction
(byte) 0x80, // P1 (indicate use of SFI)
(byte) 0x01, // P2 (SFI = 0x01)
(byte) 0x04 // LE maximal number of bytes expected in result
};
但是,当涉及到 DESFire (EV1) 时,我建议您坚持使用 DESFire native 命令集(直接或包装)而不是使用 ISO 7816-4 APDU。
使用 native 命令集,您可以获得 MIFARE DESFire 的全部功能。命令包装是通过将 native DESFire 命令嵌入 ISO 7816-4 APDU 结构来完成的。包装命令如下所示:
0x90 CMD 0x00 0x00 LEN CMD-PARAM 0x00
其中 CMD 是 native DESFire 命令,CMD-PARAM 是命令参数。响应是:
[DATA] 0x91 STATUS
其中 status 是 native DESFire 状态代码。如果 STATUS 为 0xAF,您可以通过发出此命令来获取剩余的响应数据:
0x90 0xAF 0x00 0x00 0x00
因此,在您的情况下,您将为应用程序 0x15845F 发出选择应用程序命令(注意不同的字节顺序!):
0x90 0x5A 0x00 0x00 3 0x5F 0x84 0x15 0x00
|SELECT| |APPLICATION ID|
然后,您要读取数据文件 0x01(整个文件,从偏移量 0 开始):
0x90 0xBD 0x00 0x00 7 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|READ| |FILE| OFFSET | LENGTH |
关于如何获取应用程序的 ISO DF 名称和 ISO FID 的问题,您可以尝试以下命令:
选择主应用:
905A00000300000000
获取包括其 DF 名称的应用程序:
906D000000
选择您的应用:
905A0000035F841500
获取 DESFire FID:
906F000000
获取 ISO FID:
9061000000
您始终可以使用 IsoDep 对象的 transceive() 方法。无论如何都使用 IsoDep(即 ISO/IEC 14443-4)(用于 native DESFire 命令、包装的 native 命令和 ISO 7816-4 命令)。
您从卡 (0xAE) 收到的错误代码表示身份验证错误(有关详细信息,请参阅此数据表:DESFire)。因此,该文件允许经过身份验证的只读(请参阅 NFC TagInfo 中显示的访问条件)。
因此,为了读取此文件,您需要执行身份验证程序。
关于Android NFC IsoDep 读取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296595/
我正在制作一个使用 ISO-DEP (ISO 14443-4) 作为 TagTechnology 的 NFC 应用程序。我尝试使用 DESFire EV1 执行身份验证。 如果命令的链接没有暂停,则身
我正在尝试从 Android 手机向 nfc 标签发送一些 apdu 命令并获得答案。使用的技术类型是 IsoDep。一切正常,但有时,当发送命令之间的时间间隔过长时,标签会切换到禁用状态,之后每次重
我正在尝试将数据写入 IsoDep 标签。 IsoDEP 标签的内存按结构层次组织: DF(专用文件) EF(基本文件) 在将内容写入标签之前,我使用了 SELECT 命令(在 APDU 命令集中)。
我真的是 NFC 编程的新手。我想访问例如卡上 NFC 标签上的帐号。我已经发现该卡(PayPass、Visa 等)是 IsoDep-Tech。 到目前为止我的代码: Tag tag = intent
我正在尝试从 ISO/IEC 14443 Type A 卡中读取一些信息。 在用安卓应用程序 NFC TagInfo 分析卡片后,我发现应用程序 (AID: 15845F) 有我需要的特定文件 (文件
我正在尝试使用 IsoDep 和 NfcAdapter 类将 APDU 发送到标签(智能卡),我有两个问题: 1) 有没有办法获得 Disconnected Intent (例如,当卡片被拿走时)?我
谁能告诉我这个功能背后的“科学” `IsoDep.get(tag)` 因为它返回 null 甚至标签被正确读取。我在 eclipse 中运行 android 应用程序。 最佳答案 执行以下步骤。 1
我知道这是一个没有明确答案的“讨论”主题,但我真的很想得到一些反馈,了解在为 Android 开发 NFC 应用程序时会发生什么,特别是使用 IsoDep 与使用 APDU 帧的 DESFire 卡进
我是 Android NFC API 的新手。 目前,我有一个 NFC 标签,我正在制作一个 Android 应用程序来从中读取数据。当我的手机离 NFC 标签足够近时,我的简单应用程序就会启动。但我
我有一个应用程序可以读取各种类型的 NFC 标签。多年来它运行良好,但对于较新的 Android 设备,java.io.IOException扫描特定类型的标签时始终抛出。有问题的标签同时支持 Mif
我正在尝试对 chariotsolutions 实现 IsoDep 读取功能 phongap-nfc插件,到目前为止(即使我是 Java/android 和 cordova/phonegap 的新手)
我想通过 NFC 读取 RFID 卡,该卡来自哥伦比亚波哥大本地的交通系统。我知道这是可能的,因为我已经下载了一个可以执行此操作的 Android 应用程序! 到目前为止我的进展...当我 Handl
总的来说,我对 Android 开发和 NFC 还很陌生。 我正在尝试构建一个应用程序来读取我对这张卡(公交卡)一无所知的 NFC 卡的内容,例如我想看看我还剩下多少张票。 我用各种 NFC 应用程序
我使用 NFC 标签,它发现了 ISO、NFCA 和 NDEF 技术。有信息要从芯片读取,我尝试访问内存,但我用来与TAG通信的大多数命令都以响应[110, 0] 字节。我找不到这是什么意思,其中一些
我正在尝试模拟 PoS,销售点 :),系统并使用在 2013 Nexus 7(无安全元件)v4.4.2 上运行的 Google 钱包完成交易。 我的 PoS 原型(prototype)也在 2013
我一直在尝试创建一个可以读取两种不同类型的 NFC 标签的应用程序。一个应该是 HCE-IsoDep,在 Nexus 5 上模拟,一个是 Ndef-tag。但是我遇到了一个小问题: 我设法阅读了两种类
我正在开发一个 android 应用程序,需要从 B 型卡读取和显示数据。卡连接良好,但调用 isodep.isConnected() 时返回 false。 我用 TagInfo 应用程序(由 NXP
我仍在尝试模拟销售点 (POS) 系统并使用 Google 钱包完成交易。我在堆栈溢出方面得到了很好的答案。参见 Android isoDep.transceive on Generate AC co
我是一名优秀的程序员,十分优秀!