Отказ от ответственности сначала : я раньше не использовал PC / SC API, но мне стало любопытно с вашим вопросом, так как он имеет отношение к проекту, который я делал давно.- Таким образом, следующее не проверено и должно приниматься с небольшим количеством соли: -)
Если я правильно понимаю страницу 26 в вашем связанном документе, функции, которые будут использоваться, являются (предпочтительно) SCardTransmit
илиSCardControl
.
Пример того, как передавать команду APDU, можно найти, например, на https://ludovicrousseau.blogspot.com/2010/04/pcsc-sample-in-c.html. Стоит прочитать описания, приведенные там.Соответствующие части в основном сводятся к:
// dwActiveProtocol is result of SCardConnect
SCARD_IO_REQUEST pioSendPci = dwActiveProtocol == SCARD_PROTOCOL_T1 ? *SCARD_PCI_T1 : *SCARD_PCI_T0;
BYTE pbRecvBuffer[258];
BYTE cmd[] = { 0x00, 0xA4, 0x04, 0x00,
0x0A, 0xA0, 0x00, 0x00,
0x00, 0x62, 0x03, 0x01,
0x0C, 0x06, 0x01 }; // this is just an example, not the right command (yet, see below).
dwRecvLength = sizeof(pbRecvBuffer);
LONG rv = SCardTransmit(hCard, &pioSendPci, cmd, sizeof(cmd), NULL, pbRecvBuffer, &dwRecvLength);
Теперь вопрос в том, как составить cmd
.Здесь могут быть полезны примеры C # на https://github.com/hidglobal/HID-OMNIKEY-Sample-Codes.В частности, вы должны смотреть на SetVoltageSequence () и VoltageSequence.SetApdu () .Если я правильно понимаю, что-то из следующего должно работать:
BYTE constexpr voltageSequence = 0x1B; // or 0x39 or ..., see page 17 in your linked document.
BYTE cmd[] = { 0xFF, 0x70, 0x07, 0x6B,
0x0B, 0xA2, 0x09, 0xA1,
0x07, 0xA3, 0x05, 0xA0,
0x03, 0x82, 0x01, voltageSequence, 0x00};
Я предполагаю, что весь необходимый код для связи с устройством должен быть более или менее доступен в связанном коде примера C # .