Android NFC 读取标签类型:IsoDep 和 NfcB

ela*_*nai 7 android nfc android-intent

总的来说,我对 Android 开发和 NFC 非常陌生。

我正在尝试构建一个应用程序来读取 NFC 卡的内容,但我对这张卡(公交卡)一无所知,我想查看例如我还剩多少票。

我用各种 NFC 应用程序扫描了这张卡,知道这张卡的类型是:IsoDep 和 NfcB。

现在我正在尝试使用 IsoDep 读取其内容但没有成功(错误 6A82、91AE、6E00 等)。

我有一个等待新类型意图的应用程序会ACTION_NDEF_DISCOVERED || ACTION_TECH_DISCOVERED || ACTION_TAG_DISCOVERED打开一个新线程(因为无法在 UI 的线程上读取和连接)并且我正在尝试读取卡片的内容。

我想我的问题是我传递给的字节isoDep.transceive(NATIVE_SELECT_APP_COMMAND)

我应该继续尝试 IsoDep 还是应该尝试使用 NfcB?大家有什么窍门吗?

这是我的代码示例:

 final byte[] SELECT = {
            (byte) 0x00, // CLA Class
            (byte) 0xA4, // INS Instruction
            (byte) 0x04, // P1  Parameter 1
            (byte) 0x00, // P2  Parameter 2
            (byte) 0x08, // Length
            (byte) 0x31,  (byte)0x54, (byte)0x49, (byte)0x43, (byte)0x2e,
            (byte) 0x49, (byte)0x43, (byte)0x41, // AID 315449432e494341
    };
Tag tagFromIntent = m_intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
IsoDep isoDep = IsoDep.get(tagFromIntent);
try {
    isoDep.connect();
    byte[] result = isoDep.transceive(SELECT);
    String str = bytesToHex(result);
    Log.i("test", "SELECT: " + str);
    isoDep.close();
} catch (Exception e) {
    String error = e.getMessage();
}
Run Code Online (Sandbox Code Playgroud)

我的字节到十六进制函数:

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}
Run Code Online (Sandbox Code Playgroud)

================================================== ============

编辑:

我刚刚了解到这张卡使用的是 Calypso 认证方案。

在这个问题的答案中对我有一点帮助:从 NFC 标签 (IsoDep) 读取数据 我找到了一个很好的 SELECT 函数,我编辑了我的问题以保存正在工作的新“SELECT”命令 - 作为回报,我得到这个字符串:“6F228408315449432E494341A516BF0C13C7080000200700700700700700700700700705 “我不知道这是什么意思。

然后我使用这个命令来尝试读取一个字符串:

byte[] GET_STRING = {
                (byte) 0x80, // CLA Class
                0x04, // INS Instruction
                0x00, // P1  Parameter 1
                0x00, // P2  Parameter 2
                0x10  // LE  maximal number of bytes expected in result
        };
Run Code Online (Sandbox Code Playgroud)

但我收到错误:6E00,关于如何进行的任何想法?

Lau*_*ntY 5

您可以使用 IsoDep 与卡通信。

您想在没有此卡规格的情况下访问卡上的数据,因此有两种方法:

  • 获取卡的规格(如何与之通信)
  • 做逆向工程,会花很多时间而且不确定结果,你可以“锁定”对卡的访问

更新 1

要阅读 Rav Kav 卡,这里有一个开源项目:http : //pannetrat.com/Cardpeek/ Rav Kav 的代码在这里https://code.google.com/p/cardpeek/source/browse/trunk/dot_cardpeek_dir /scripts/calypso/c376n3.lua