2010-08-22 10 views
1

Я работаю над приложением для чтения EMV-карты с использованием C#. Я использую Winscard.dll. и я установил соединение. Выбрал читателя - подключитесь к карте и получите ATR. , но при отправке comand Slecetd Application usin AID list, я не получил никаких данных, я ожидал получить SW1SW2 как 61XX (где XX длина данных) Я отправил команду как 00A4040007A0000000031010.Выберите команду AID не работает

Код:

// Private/Internal Types 
    [StructLayout(LayoutKind.Sequential)] 
    internal class SCARD_IO_REQUEST 
    { 
     internal uint dwProtocol; 
     internal int cbPciLength; 
     public SCARD_IO_REQUEST() 
     { 
      dwProtocol = 0; 
     } 
    } 

    public static IntPtr GetPciT0() 
    { 
     IntPtr handle = LoadLibrary("Winscard.dll"); 
     IntPtr pci = GetProcAddress(handle, "g_rgSCardT0Pci"); 
     FreeLibrary(handle); 
     return pci; 
    } 
    // public static byte[] GetSendBuffer(string cla, string ins , string p1 ,string p2 , string lc,string body) 

    public byte[] GetSendBuffer() 
    { 
     // Select application 00A4040007A0000000031010 
     string cla = "00"; 
     string ins = "A4"; 
     string p1 = "04"; 
     string p2 = "00"; 
     string lc = "07"; 
     string body = "A0000000031010"; 
     string script = String.Format("{0}{1}{2}{3}{4}{5}", cla, ins, p1, p2, 
     lc, body); 
     byte[] buffer = new byte[ script.Length/2]; 
     //Console.WriteLine("buffer {0}", buffer); 
     for (int i = 0; i < script.Length; i = i + 2) 
     { 

      string temp = script.Substring(i, 2); 
      buffer[i/2] = byte.Parse(temp, 
      System.Globalization.NumberStyles.HexNumber); 
     } 
     return buffer; 

    } 

// ================================= ==== public void ScardTransmit() { SCARD_IO_REQUEST ioRecv = новый SCARD_IO_REQUEST(); byte [] pbRecvBuffer = новый байт [255]; int pcbRecvLength = 255; byte [] pbsendBuffer = this.GetSendBuffer();

int pbsendBufLen = pbsendBuffer.Length; 
ioRecv.cbPciLength = ioRecv.ToString().Length; 
IntPtr SCARD_PCI_T0 = GetPciT0(); 
uint uintret = SCardTransmit(pCardHandle, ref ioRecv, pbsendBuffer, 
pbsendBufLen, SCARD_PCI_T0, pbRecvBuffer, ref pcbRecvLength); 

}

+0

Слишком много кода. Обрежьте это до минимального фрагмента, который иллюстрирует проблему, а затем описал проблему и задал ваш вопрос. – Timwi

+0

Спасибо, я включил onlt функции имеют проблему, пожалуйста, проверьте функцию SCardTransmit, поскольку она не получала никаких данных. Rsult of select AID comand –

ответ

0

Постарайся просто отправив следующее:

0x00A4040000 

Это должно по крайней мере, вернуть что-то. Байты в конце являются необязательными. Они служат цели, но просто посмотрите, сможете ли вы получить что-то от этого в первую очередь.