Ich habe eine Anwendung, die einen Chipkartenleser verwendet, damit die Benutzer auf Teile des Systems zugreifen können. An einem Ort habe ich keine Probleme. Aber eine andere, die eine andere Art von Kartenhersteller haben, hat eine Menge Probleme. Es erhält immer wieder eine ID von Null. Dann schaut in die eventlog habe ich diesen: Und das ist der Code:Chipkartenleser, kann einige Karten nicht lesen
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);
das zweite Problem besteht darin, dass dann versuchen, den Code zu debuggen, es funktioniert perfekt, nur dann den Haltepunkt entferne ich das sehen kann Problem aber nicht wo. Kann mir bitte jemand helfen?
P.S. Ich habe diesen Thread, aber es funktioniert nicht: https://superuser.com/questions/715688/smart-card-errors
Update: Hier ist die Sende Klasse sind
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);
}
Update 2: Ich mit auch versucht haben, einige Thread.Sleep zu setzen()
Was macht "card.Transmit"? Das heißt, was ist die tatsächliche Antwort von dem Kartenleser oder der Karte? Mit welcher Art von Karte arbeiten Sie? –
Können Sie etwas Verzögerung zwischen Ihrem Befehl und versuchen Sie es erneut? Kann der Leser oder die Karte nicht so schnell wie Ihre Programmlaufzeit sein? – Abraham
Haben Sie selbst das Programm geschrieben, das auf den Smartcards installiert ist? Kannst du '00A404000004' an beide Arten von Karten senden und die Antwort der Karten zu der Frage hinzufügen? (Verwenden Sie dieses Tool, um APDU-Befehle an die Karten zu senden: https://github.com/OpenSC/OpenSC/wiki) – Abraham