簡體   English   中英

問題閱讀智能卡

[英]Issue reading smart card

我的讀者哪個文檔幾乎與此一樣: 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. 使用在此方法實例中創建的對象關閉來Close連接

順便說一句。 這是RequestA命令中其中一張卡(讀卡器失敗一次)的成功響應:

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

我無法確定您的代碼是什么問題,但是當連接出現錯誤而沒有打開新連接時,這似乎是一個問題。 由於SerialPort是您需要處理dispose的硬件資源,因此SerialPort可能實現IDisposable,這意味着您可以使用以確保連接已關閉並處理掉。 帶一張新卡可能會這樣做,但是當你使用同一張卡時,你仍然在處理故障狀態的串口。

當您將cardA帶到讀卡器附近時,它會失敗。 之后,每次將cardA帶到讀卡器附近時都會失敗。

我不確定,但我猜它什么時候失敗第二個位置的字節數組rs[1]包含失敗的代碼。 因此,之后每次將cardA帶到讀卡器附近時都會失敗,因為字節數組第二個位置可能具有先前的值。

因此,請嘗試清除可能解決問題的字節數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM