2013-05-31 4 views
2

mfare 카드 일련 번호를 읽어야하는 응용 프로그램에서 작업하고 있습니다. 현재 작업중인 언어는 C#입니다.WinSCard 라이브러리를 사용하여 mifare 카드 일련 번호 가져 오기

저는 mifare 독자 프로그래밍에 익숙하지 않으므로, 바보 같은 질문을해서 유감입니다. 처음에는 Mifare UID와 Mifare 일련 번호가 다른지 알고 싶습니다.

나는 WinSCard 라이브러리 덕분에 UID를 얻을 수 있었지만 10 자리 숫자로 된 카드 일련 번호를 얻는 방법을 알지 못한다.

올바른 방향으로 안내해 주시면 감사하겠습니다.

도움을 미리 감사드립니다. SCardTransmit 방법의 감사

답변

9

C#을 서명

[StructLayout(LayoutKind.Sequential)] 
public struct SCARD_IO_REQUEST 
{ 
    public int dwProtocol; 
    public int cbPciLength; 
} 

[DllImport("winscard.dll")] 
public static extern int SCardTransmit(int hCard, ref SCARD_IO_REQUEST pioSendRequest, ref byte SendBuff, int SendBuffLen, ref SCARD_IO_REQUEST pioRecvRequest, 
ref byte RecvBuff, ref int RecvBuffLen); 

코드 예 MIFARE 카드

private SmartcardErrorCode GetUID(ref byte[] UID) 
    { 
     byte[] receivedUID = new byte[10]; 
     UnsafeNativeMethods.SCARD_IO_REQUEST request = new UnsafeNativeMethods.SCARD_IO_REQUEST(); 
     request.dwProtocol = 1; //SCARD_PROTOCOL_T1); 
     request.cbPciLength = System.Runtime.InteropServices.Marshal.SizeOf(typeof(UnsafeNativeMethods.SCARD_IO_REQUEST)); 
     byte[] sendBytes = new byte[] { 0xFF, 0xCA, 0x00, 0x00, 0x04 }; //get UID command  for Mifare cards 

     int outBytes = receivedUID.Length; 
     int status = SCardTransmit(_hCard, ref request, ref sendBytes[0], sendBytes.Length, ref request, ref receivedUID[0], ref outBytes); 

     UID = receivedUID.Take(8).ToArray(); 
     return status; 
    } 
+0

표시된 GetUID 방법은에 반환 된 상태의 캐스트가 누락의 읽기 UID에 대한 실제 반환 유형입니다. _hCard 변수에 대한 확인되지 않은 참조도 있습니다. –

+0

몇 가지 문제를 해결 한 후 작동합니다. https://github.com/amree/omnikey-mifare-samples-library/blob/master/Include/winsmcrd.h에 ​​따르면 : SCARD_PROTOCOL_T1 = 2, 1을 2로 변경했습니다. , http://www.pinvoke.net/default.aspx/winscard.scardestablishcontext에서 예제를 사용하여 _hCard (cardInserted = true; 바로 위에 코드 위에 삽입 됨)를 얻습니다. – Jens