2015-05-21 126 views
18

我有一個應用程序正在使用智能卡讀卡器來允許用戶訪問系統的某些部分。在一個位置我沒有問題。但另一個擁有不同類型卡製造商的公司存在很多問題。它不斷得到零的ID。然後尋找到事件日誌我看到了這一點: enter image description here 這是代碼:智能卡讀卡器,無法讀取某些卡

card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1); 

var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4); 
var apduRespGetID = card.Transmit(apduGetID); 
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0); 

第二個問題是,然後嘗試調試代碼,它的作品完美,只有刪除斷點,我可以看到問題,但不是在哪裏。有人可以幫幫我嗎?

P.S.我發現這個線程,但它不工作:https://superuser.com/questions/715688/smart-card-errors

更新:這裏有發送類

public override APDUResponse Transmit(APDUCommand ApduCmd) 
     { 
      var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH); 
      byte[] ApduBuffer; 
      var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH]; 
      var ioRequest = new SCard_IO_Request 
      { 
       m_dwProtocol = m_nProtocol, 
       m_cbPciLength = 8 
      }; 

      // Build the command APDU 
      if (ApduCmd.Data == null) 
      { 
       ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)]; 

       if (ApduCmd.Le != 0) 
       { 
        ApduBuffer[4] = ApduCmd.Le; 
       } 
      } 
      else 
      { 
       ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length]; 

       for (var nI = 0; nI < ApduCmd.Data.Length; nI++) 
       { 
        ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI]; 
       } 

       ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length; 
      } 

      ApduBuffer[0] = ApduCmd.Class; 
      ApduBuffer[1] = ApduCmd.Ins; 
      ApduBuffer[2] = ApduCmd.P1; 
      ApduBuffer[3] = ApduCmd.P2; 

      m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength); 

      if (m_nLastError != 0) 
      { 
       var msg = "SCardTransmit error: " + m_nLastError; 
       throw new SmartCardException(msg, m_nLastError); 
      } 

      var apduData = new byte[RecvLength]; 

      for (var nI = 0; nI < RecvLength; nI++) 
      { 
       apduData[nI] = ApduResponse[nI]; 
      } 

      return new APDUResponse(apduData); 
     } 

更新2:我也試圖把一些Thread.sleep()方法

+0

'card.Transmit'做什麼?也就是說,讀卡器或卡的實際響應是什麼?你在使用什麼類型的卡? –

+1

你可以在你的命令之間加一些延遲,然後再試一次嗎?讀者或卡可能不像你的程序運行時間那麼快? – Abraham

+0

你自己寫了安裝在智能卡上的程序嗎?你可以發送'00A404000004'到這兩種卡,並添加卡的迴應問題? (使用此工具將APDU命令發送至卡:https://github.com/OpenSC/OpenSC/wiki) – Abraham

回答

3

請檢查第二臺機器上是否有智能卡的所有最新驅動程序。此外,有時它有助於用「微軟WUDF驅動程序」替換製造商提供的驅動程序 - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx

請注意,當插入時,操作系統檢測到兩種類型的設備 - 智能卡枚舉器設備(智能卡讀取器)和智能卡(有時稱爲智能卡容器)本身。一個智能卡讀卡器可以包含多個智能卡。

智能卡的例子司機被強制與微軟WUDF更換,以使客戶端應用程序(iBank2)工作:

four smart cards WUDF type

四個智能卡驅動程序已基本微軟司機被強行更換使應用程序工作。

0

那麼如果其他系統沒有拿你的智能卡,只需檢查智能卡的BIOS設置。有一個選項可以在某些系統中禁用/啓用它們。