Я работаю над бесконтактным считывающим устройством RFID-карт SCM, используя Microsoft SmartCard APIs.SCardTransmit() всегда возвращает ошибку
Обычный процесс ineract с помощью смарт-карты, что я понял, это:
1. Установить контекст, используя SCardEstablishContext()
2. Перечислите все читатели, подключенные к системе с помощью SCardListReaders()
3. Выберите читателя и дождитесь, когда в него будет вставлена карта.
4. После обнаружения карты функция SCardGetStatusChange() возвращается.
5. Подключите к плате через выбранный считыватель с помощью SCardConnect()
6. Поговорите с картой с помощью SCardTransmit()
Всех шагов до 5 работают отлично, что означает, что я получил правильную ручку карты. Карту можно проверить дополнительно, выпустив функцию SCardStatus(), которая возвращает согласованный протокол и ATR карты, что также является правильным. Но когда я пытаюсь отправить любую команду APDU с помощью SCardTransmit(), она возвращает ошибку (код ошибки 14, который, я думаю, SCARD_E_CANT_DISPOSE).
У меня нет ни малейшего представления о том, что происходит, или чего не хватает. Я пробовал разные APDU, например. самый базовый APDU, чтобы прочитать UID карты, выпустив {0xFF, 0xCA, 0x00, 0x00, 0x00}. Я проверил этот APDU с помощью утилиты SCM TestResMan для отладки и вернул мне правильный UID карты. Я использую карту MiFARE 1k и SCM бесконтактный SCL011 Reader.
Пожалуйста, найдите фрагмент кода SCardTransmit() ниже (все предыдущие функции возвратили успех).
SCARD_IO_REQUEST sioreq;
sioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
sioreq.cbPciLength = 8;
SCARD_IO_REQUEST rioreq;
rioreq.dwProtocol = 2; // SCARD_PROTOCOL_T1
rioreq.cbPciLength = 8;
byte sendbuffer[256], receivebuffer[256];
ULONG sendbufferLen, receivebufferLen, sizeofUID;
sendbuffer[0] = 0xFF; // CLA - Instruction Class
sendbuffer[1] = 0xCA; // Instruction code
sendbuffer[2] = 0x00; // P1 - 1st parameter
sendbuffer[3] = 0x00; // P2 - 2nd parameter
sendbuffer[4] = 0x00;
sendbufferLen = 0x05;
retval = objScWrapper->SCardTransmit(hCardHandle, &sioreq, sendbuffer,
sendbufferLen, NULL, receivebuffer,
&receivebufferLen);
Пожалуйста, дайте мне знать, если кто имеет какие-либо подсказки или указатели ...
ТИА !!