【发布时间】:2014-05-29 09:51:07
【问题描述】:
我有一个阅读器,它的文档几乎与这个完全相同:http://www.jinmuyu.com/download/JMY680A_EN.pdf 主要区别在于,我的读者声称它还支持 B 型卡。
我有三张 ISO 14443 卡,我连续测试,代码如下:
byte[] rs = null;
Thread.Sleep(500);
// Set module Idle
Random r = new Random();
byte rInt = (byte) r.Next(0, 255);
rs = send(new byte[] { 0x12, rInt });
if (rs[1] == 0xED)
throw new Exception("Failed set idle");
Thread.Sleep(500);
//// Request B
//rs = send(new byte[] { 0x60, 0x00, 0x00 });
//if (rs[1] == 0x9F)
// throw new Exception("Failed card requestB");
// RequestA
rs = send(new byte[] { 0x20, 0x00 });
if (rs[1] == 0xDF)
throw new Exception("Failed card requestA");
// Reset cardA
rs = send(new byte[] { 0x30 });
if(rs[1] == 0xCF)
throw new Exception("Failed card reset");
// Do other work, Send some APDU to card, etc.
// ........
// Exit program
大多数情况下,此代码适用于所有三张卡。
但是,有时,当我将其中一张卡靠近读卡器时,卡请求 A(RequestA 呼叫)
通话失败。然后这张卡总是会失败,直到我给读卡器带来一张新卡。
有谁知道是什么原因造成的?也许我在通话之间需要一些延迟?或者在调用RequestA之前需要调用其他一些(ISO14443相关)函数?
send 是使用SerialPort 类实现的方法。方式如下:
- 在每次调用 send 时,都会创建新的
SerialPort对象 - 在上面创建的对象上调用
Open -
Write和Read一些数据 - 在此方法实例中创建的对象上使用
Close关闭连接
顺便说一句。这是其中一张卡(读卡器失败一次)对 RequestA 命令的成功响应:
ID | ATQ | SAK
0xe1 0x8f 0x68 0xe6 0x04 0x00 0x28
【问题讨论】:
-
“失败”是什么意思?卡回答错误,或者您根本没有回答,或者您有来自串行的通信错误?
-
@LorenzoDematté:我的意思是失败时抛出异常。根据文档,如果卡返回
0xDF作为第二个字节,则表示失败。 -
我明白了。这可能是很多事情。 0x20 命令似乎特定于您的读卡器,它可能和 ISO / Mifare 命令选择(激活)卡。 Iso 和 desfire 命令有一些不同的错误代码,具体取决于错误,但是......似乎只有你一个人知道读者告诉(或不告诉)你的内容
-
这是“廉价”阅读器的一个问题:他们实现自己的协议,然后你必须处理你得到的东西。该错误可能是卡错误,通信错误,等等。等等:我看到了你的编辑。这是您从其中一张卡片中得到的“正确”响应吗?
-
哦,好的。 Mifare 经典是......奇怪的东西。几乎是 A 型,但有自己的一套命令。但通常相当可靠。但我离题了(它们是我所知道的唯一具有 4 字节 UID 的卡)。当你失败后再次尝试时会发生什么?读卡器是否在连续轮询(它会再次尝试选择卡吗?)。您必须考虑到 PICC 中的传输可能非常不可靠,因此在失败前尝试 2/3 次是很正常的。
标签: c# .net serial-port smartcard