2

我想通过 NFC 读取 RFID 卡,该卡来自哥伦比亚波哥大当地的交通系统。我知道这是可能的,因为我已经下载了一个可以做到这一点的 android 应用程序!

到目前为止我的进展......当我将手机放在卡片上时,我的应用程序启动,具有 ACTION_TECH_DISCOVERED 意图,我可以读取卡片 UID 之类的内容,但我不知道如何读取我想要的信息,特别是卡上的钱。

我在stackoverflow中读到我需要做的是找到我想要访问的应用程序并发送ADPU命令,但看起来我的卡没有任何应用程序,因为使用任何android应用程序探索卡,它总是说找到 0 个应用程序。所以,我不知道我必须从哪里获得这些信息。

我的卡的技术信息是:

  • 标签 ID:08 8B E2 D1 射频
  • 技术:A型(ISO/IEC 14443 A型)
  • 标签类型:ISO/IEC 14443-4 智能卡
  • ATQA:0004
  • 萨克:20
  • 历史字节:01112003
  • 技术类:android.nfc.tech.IsoDep、android.nfc.tech.NfcA

谢谢!

4

1 回答 1

3

我在 stackoverflow 中 [阅读] 我需要做的是找到我想要访问的应用程序并发送 ADPU 命令。

正确,这正是您需要做的。一旦你得到这些信息(即卡的通信协议的规范),你会做如下的事情:

Tag tag = ... // TODO: get tag handle from intent
IsoDep isoDep = IsoDep.get(tag);
if (isoDep != null) {
    isoDep.connect();

    byte[] response = isoDep.transceive(SELECT_APDU); // SELECT_APDU = 00 A4 0400 <Lc> <APPLICATION ID>

    // TODO: send further APDU commands according to the protocol specification
    //response = isoDep.transceive(APDU);

    isoDep.close();
}

[...] 但看起来我的卡没有任何应用程序,因为使用任何 android 应用程序探索卡时,它总是显示 Found 0 Applications。

这通常仅表示卡上没有扫描仪应用程序*已知的应用程序。许多 ISO-DEP 卡没有可公开阅读的应用程序目录。(虽然有些卡可能有 EF.DIR 或类似的东西。)

所以,我不知道我必须从哪里获得这些信息。

对,这通常是棘手的部分。有几种方法:

  1. 请向运输系统运营商索取规格。
  2. 检查卡是否有 EF.DIR(或类似的)并在其中列出一些内容(尽管这只会给你一个起点,因为它仍然没有显示卡的协议)。
  3. 检查卡是否具有 GlobalPlatform 安全域/卡管理器,以及是否可以使用默认密钥访问该卡管理器(Google 将帮助您找到进一步的阅读材料)。如果是这样,GP 会提供命令来列出已安装的应用程序。关于协议,与 2. 相同。
  4. 对您知道可以访问该卡的应用程序进行逆向工程。(请注意,这在您所在的国家/地区可能是非法的和/或应用的许可协议禁止这样做。)
于 2014-04-15T15:32:55.503 回答