当前位置: 首页 > 知识库问答 >
问题:

需要帮助了解 APDU 响应

平和雅
2023-03-14

我使用ACR122读卡器已经有一段时间了,它在读取Mifare 1K或Mifare Ultralight NFC卡时都没有问题。

将读卡器升级到最新版本(ACR1251)后,我的程序无法读取Mifare 1K卡的UID。

这是我用来阅读的片段:

CardTerminal terminal = terminalWithCardPresent.get(0);
terminal.waitForCardPresent(0);
Card card = terminal.connect("T=1");
if (card != null) {
    CommandAPDU command = new CommandAPDU((byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x07);
    CardChannel channel = card.getBasicChannel();
    ResponseAPDU response = channel.transmit(command);
    StringBuilder sb = new StringBuilder();
    if (response.getSW1() == 0x90 && response.getSW2() == 0x00) {
        byte[] data = response.getData();
        String code = decoder.apply(data);
        sb.append(code);
    }
    cardIdRead.recieve(sb.toString());
}
terminal.waitForCardAbsent(0);

使用新版rad阅读器:

  • ResponseAPDU.getSW1()函数返回98
  • 而getSW2()返回130

我试着在网上和读卡器文档中搜索响应代码的解释,但没有成功。任何人都有类似的问题,知道如何从sw1 sw2 98 130上的卡返回中读取UID吗?

共有2个答案

国高杰
2023-03-14

对于JAVASE用途(Ultralight nfc卡),您可以遵循以下链接和代码。

对于读取UID,命令是:

 baReadUID = new byte[] { (byte) 0xFF, (byte) 0xCA, (byte) 0x00,
            (byte) 0x00, (byte) 0x00 };

对于从特定块读取(此处读取第04页至第07页),命令为:

read_four_to_seven = new byte[]{(byte) 0xFF, (byte) 0x00, (byte) 0x00,
                     (byte) 0x00, (byte) 0x05, (byte) 0x0D4, (byte) 0x40, (byte) 0x01,
                     (byte) 0x30, (byte) 0x04, (byte) 0x07 };

写入第04页:

Write_Page_Four = new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x15, (byte) 0xD4, (byte) 0x40,
(byte) 0x01, (byte) 0xA0, (byte) 0x04, (byte) 0x4D,
(byte) 0x65, (byte) 0x73, (byte) 0x75, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00 };

所有完整的代码都在这里...

赫连淳
2023-03-14

将SW<code>98 130</code>转换为十六进制给出<code>'6282'</code>。从这个表中,它意味着“由于首先遇到了文件的结尾,所以可以读取的字节数少于Le参数指定的字节数。”

“FF CA”记录在ACR122U读取器文档中,但未在ACR1251U文档中找到。根据ACR122U文件,Le应为'00',而不是'07'

我建议尝试发送APDU'FFCA000000',如果失败,请尝试发送'FFCA0000XX'(XX从'01'到'06')。

 类似资料:
  • 我试图写一个代码为每个股票价值是75美元或更多添加一个"*"在STK_FLAG列。 ORA-06550:第15行,第21列:PLS-00201:标识符“STK\U FLG”必须声明ORA-06550:第15行,第5列:PL/SQL:SQL语句忽略ORA-06550:第23行,第7列:PL/SQL:ORA-00904:“STK\U FLG”:无效标识符ORA-06550:第17行,第5列:PL/SQ

  • 我已经写了两个版本的nqueens问题,我认为它们应该有相似的效率,但事实并非如此。我认为这是由于哈斯克尔的懒惰评估行为。有人能解释一下下面的例子是如何工作的吗, 您可以通过调用nqueens1 8 8或nqueens2 8 8对其进行评估,以对大小为8的板进行评估。 虽然nqueens2工作效率很高,但nqueens1存在性能问题。我相信这是因为递归调用(nqueens n(k-1))被多次评估

  • 我需要一些帮助用JSOUP解析这个html。我正在尝试从表中的每一列获取数据值。我一直在看JSoup文档,试图弄清楚我到底需要做什么,但还是不确定。看起来网站使用了CSS和内联格式的组合;其中大部分可以转换为CSS并减小页面大小。 这是html文件的一个小片段(实际上差不多有5 MB大小)。 更新:我已经更新了源代码,以更准确地显示html的结构。我假定tbody将位于表元素中是一个给定的条件。我

  • 首先,我是C、C++、C#、Android和Swift的开发人员,但我绝对没有JavaScript、PHP或Web开发经验。 即只接受整数值的输入。 这是刀片代码:

  • 我想深入了解Jmeter输出。 > 我对吞吐量率的概念感到困惑。这是否意味着服务器在给定负载下只能处理48.1个请求/分钟,还是意味着其他什么。总吞吐量速率和单个请求显示的吞吐量速率之间的差异是什么。在我的情况下,发送了8个请求,单个请求显示吞吐量为6.1/min。请解释一下。 我需要建议服务器端的任何更改/解释jmeter报告,请建议我如何解释需要做什么。 总的总结报告如下: 总用户: 100上

  • 我正在尝试解决hackerrank中的一个“几乎已排序”的挑战。问题是: 给定一个包含元素的数组,可以只使用以下操作之一按升序对该数组进行排序吗? 交换两个元素。反转一个子段。 输入格式 第一行包含一个整数,指示数组的大小。 下一行包含以空格分隔的整数。 样本输入#1 2 4 2 示例输出 #1 是< br >交换1 2 示例输入 #2 3 3 1 2 样品输出#2 不 示例输入 #3 6 1 5