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

我正在尝试构建一个应用程序来读取NFC卡的内容,而我对该卡(公交卡)一无所知,例如,我想查看剩下的票数。

我已经使用各种NFC应用程序扫描了该卡,并且知道该卡的类型:IsoDep和NfcB。

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

我有一个应用程序,等待ACTION_NDEF_DISCOVERED || ACTION_TECH_DISCOVERED || ACTION_TAG_DISCOVERED类型的新 Intent 将打开一个新线程(因为无法读取和连接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();
}

我的字节为十六进制函数:
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);
}

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

编辑:

我刚刚了解到该卡正在使用Calypso身份验证方案。

在这个问题的答案中,我得到了一些帮助:Read data from NFC tag (IsoDep)
我找到了一个很好的SELECT函数,我已经编辑了问题以容纳正在运行的新“SELECT”命令-作为返回,我得到了以下字符串:“6F228408315449432E494341A516BF0C13C70800000000029780A55307060A07062004019000”,我不知道这是什么意思。

然后,我使用此命令尝试读取字符串:
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
        };

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

最佳答案

您可以通过IsoDep与卡进行通信。

您想访问卡上没有该卡规范的数据,因此有两种方法:

  • 获取卡的规范(如何与之通信)
  • 进行反向工程,这将花费大量时间并且不确定结果,并且您可以“锁定”对卡
  • 的访问

    更新1

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

    10-08 19:12