SCardTransmit, как читать и писать смарт-карты

Я работаю над принтером, пытаюсь читать и писать бесконтактные карты.

Это руководство по аппаратному и программному обеспечению, которое я использую:
ручной бесконтактный

Если я правильно понял, процесс взаимодействия со смарт-картой (читать и писать в ней):

  1. Установите контекст, используя SCardEstablishContext ()
  2. Подключитесь к карте через выбранный ридер с помощью SCardConnect ()
  3. Поговорите с картой, используя SCardTransmit ()

Это верно?

Точки 1 и 2 работают нормально и возвращают 0 (SCARD_S_SUCCESS), но у меня проблемы с SCardTransmit.

  • Если я хочу прочитать блок 5, например, это код, который я использую:

     SCARD_IO_REQUEST pioRecvPci;
    
    DWORD dwActiveProtocol, dwSendLength, dwRecvLength;
    BYTE pbRecvBuffer[16];
    BYTE pbSendBuffer[] = {(BYTE)0xFC, (BYTE)0xB0,(BYTE)0x05, (BYTE)0x00, (BYTE)0x00};
    
    dwSendLength = sizeof(pbSendBuffer);
    dwRecvLength = sizeof(pbRecvBuffer);
    
    SCARD_IO_REQUEST pioSendPci;
    
    pioSendPci.dwProtocol=SCARD_PROTOCOL_T0;
    pioSendPci.cbPciLength= sizeof(pioSendPci);
    
    ret = SCardTransmit(cardHandle,                // SCard API
    &pioSendPci,
    pbSendBuffer, dwSendLength,
    NULL, pbRecvBuffer, &dwRecvLength);
    

    Возвращает код ошибки 22.

    Если я изменю SCARD_PROTOCOL_T0 на SCARD_PROTOCOL_T1, это, похоже, будет работать (я не знаю, верны ли значения pbRecvBuffer): pbRecvBuffer имеет 2 байта со значениями: 6e 00 и ret = 0.

    Имеют ли эти ценности смысл?

    Я читаю SCardTransmit API (SCardTransmit) и там я понимаю, что я должен использовать протокол T = 0, это значит, что я должен поставить SCARD_PROTOCOL_T0 для работы? В таком случае, почему я получаю ошибку 22? Что я делаю не так?

  • Если я хочу написать в блоке 5, я выполняю тот же процесс: SCardEstablishContext, SCardConnect и SCardTransmit. Я изменяю pbSendBuffer на: {(BYTE) 0xFC, (BYTE) 0xD0, (BYTE) 0x05, (BYTE) 0x00, 0x10}; но я не очень хорошо понимаю, где находятся данные и какие параметры я должен поместить в SCardTransmit , Не могли бы вы дать мне пример этого?

Большое спасибо!

1

Решение

`enter code here` we  must  check protocol using switch case and transmit like :switch ( m_dwAP )
{
case SCARD_PROTOCOL_T0:
dwErrorFlags = SCardTransmit(this->m_hCardHandle,
SCARD_PCI_T0,
rgbIN,
bIN,
NULL,
rgbOUTTra,
&uwBufferLen);
break;
case SCARD_PROTOCOL_T1:
dwErrorFlags = SCardTransmit(this->m_hCardHandle,
SCARD_PCI_T1,
rgbIN,
bIN,
NULL,
rgbOUTTra,
&uwBufferLen);
break;
}
here m_dwAP  is active protocol.
-1

Другие решения