问题阅读智能卡

时间:2014-05-29 09:51:07

标签: c# .net serial-port smartcard

我的读者的文档几乎与此完全相同:http://www.jinmuyu.com/download/JMY680A_EN.pdf 主要区别在于,我的读者声称它也支持TYPE 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类实现的方法。通过以下方式:

  1. 每次调用send时,都会创建新的SerialPort对象
  2. 在上面创建的对象上调用Open
  3. WriteRead一些数据
  4. 使用此方法实例
  5. 中创建的对象上的Close关闭连接

    顺便说一句。这是RequestA命令中其中一张卡(读卡器失败一次)的成功响应:

    ID                 | ATQ     | SAK
    0xe1 0x8f 0x68 0xe6 0x04 0x00 0x28
    

2 个答案:

答案 0 :(得分:1)

我无法确定您的代码是什么问题,但是当连接出现错误而没有打开新连接时,这似乎是一个问题。由于SerialPort是您需要处理dispose的硬件资源,因此SerialPort可能实现IDisposable,这意味着您可以使用以确保连接已关闭并处理掉。带一张新卡可能会这样做,但是当你使用同一张卡时,你仍然在处理故障状态的串口。

答案 1 :(得分:0)

当您将cardA带到读卡器附近时,它会失败。之后,每次将cardA带到读卡器附近时都会失败。

我不确定,但我猜它什么时候失败第二个位置的字节数组rs[1]包含失败的代码。因此,之后每次将cardA带到读卡器附近时都会失败,因为字节数组第二个位置可能具有先前的值。

因此,请尝试清除可能解决问题的字节数组。