Я работаю над принтером, пытаюсь читать и писать бесконтактные карты.
Это руководство по аппаратному и программному обеспечению, которое я использую:
ручной бесконтактный
Если я правильно понял, процесс взаимодействия со смарт-картой (читать и писать в ней):
Это верно?
Точки 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 , Не могли бы вы дать мне пример этого?
Большое спасибо!
`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.