ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-06-09 07:11:40  阅读:480  来源: 互联网

标签:android android-intent nfc


我对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();
}

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

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卡,threre是一个开源项目:Rav Kav的http://pannetrat.com/Cardpeek/代码在这里https://code.google.com/p/cardpeek/source/browse/trunk/dot_cardpeek_dir/scripts/calypso/c376n3.lua

标签:android,android-intent,nfc
来源: https://codeday.me/bug/20190609/1203716.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有