我有一個應用程序正在使用智能卡讀卡器來允許用戶訪問系統的某些部分。在一個位置我沒有問題。但另一個擁有不同類型卡製造商的公司存在很多問題。它不斷得到零的ID。然後尋找到事件日誌我看到了這一點: 這是代碼:智能卡讀卡器,無法讀取某些卡
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()方法
'card.Transmit'做什麼?也就是說,讀卡器或卡的實際響應是什麼?你在使用什麼類型的卡? –
你可以在你的命令之間加一些延遲,然後再試一次嗎?讀者或卡可能不像你的程序運行時間那麼快? – Abraham
你自己寫了安裝在智能卡上的程序嗎?你可以發送'00A404000004'到這兩種卡,並添加卡的迴應問題? (使用此工具將APDU命令發送至卡:https://github.com/OpenSC/OpenSC/wiki) – Abraham