После нескольких дней поиска и тестирования я решил снова разобраться и попросить помощи в правильном направлении. Я хочу получить ATR или UID моего кард-ридера omnikey 5025CL для PHP.
Я пробовал подключить плагин pc / sc для PHP, но это для PHP5. Я использую PHP7, поэтому эти плагины не работают / доступны.
Кто-нибудь знает другой способ получить эти идентификаторы в браузере?
Надеюсь, это сработает, или мне придется купить новыйи в 3 раза дороже считывателя с клавиатурным интерфейсом.
Пример кода C:
// Sample C code that displays ATR and data from PROX card.
// Link with winscard.lib
#include <stdio.h>
#include <winscard.h>
int main(int argc, char* argv[])
{
LONG lResult;
SCARDCONTEXT hContext;
SCARDHANDLE hCard;
DWORD dwActiveProtocol;
DWORD dwLen;
SCARD_IO_REQUEST pIoReq;
BYTE pBuffer[32];
USHORT SW;
DWORD i;
//APDU to get data from card
BYTE GET_DATA[] = {0xFF, 0xCA, 0x00, 0x00, 0x00};
// First 5025 reader name
WCHAR szReader[] = L"HID OMNIKEY 5025-CL 0";
// Establish context
lResult = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
if( SCARD_S_SUCCESS != lResult ){
printf("SCardEstablishContext failed. Error code 0x%08X.\n", lResult );
return 1;
}
//Connect to card
lResult = SCardConnect( hContext,
szReader,
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&hCard,
&dwActiveProtocol);
if( SCARD_S_SUCCESS != lResult ){
//release context
SCardReleaseContext(hContext);
printf("Can not detect card. Error code 0x%08X.\n", lResult );
return 1;
}
//Select protocol T=1 or T=0
if( SCARD_PROTOCOL_T1 == dwActiveProtocol ){
pIoReq = *SCARD_PCI_T1;
}else{
pIoReq = *SCARD_PCI_T0;
}
//get ATR
dwLen = sizeof(pBuffer);
lResult = SCardStatus( hCard,
NULL,
NULL,
NULL,
NULL,
pBuffer,
&dwLen);
if( SCARD_S_SUCCESS != lResult ){
//disconnect card
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
//release context
SCardReleaseContext(hContext);
printf("Can not get card status. Error code 0x%08X.\n", lResult );
return 1;
}
//display ATR
printf("ATR: ");
for(i=0;i<dwLen-2;i++){
printf(" %02X", pBuffer[i]); //print hex digits
}
printf("\n"); //end of line
dwLen = sizeof(pBuffer);
lResult = SCardTransmit(hCard,
&pIoReq,
GET_DATA,
sizeof(GET_DATA),
NULL,
pBuffer,
&dwLen);
if( SCARD_S_SUCCESS != lResult ){
//release context
SCardReleaseContext(hContext);
printf("Card not detected. Error code 0x%08X.\n", lResult );
return 1;
}
SW = pBuffer[dwLen-2] << 8 | pBuffer[dwLen-1];
//response code
if( SW != 0x9000 ){
//disconnect card
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
//release context
SCardReleaseContext(hContext);
printf("Command not accepted. Error code 0x%04X.\n", SW );
return 1;
}
//display response
printf("Data:");
for(i=0;i<dwLen-2;i++){
printf(" %02X", pBuffer[i]); //print hex digits
}
printf("\n"); //end of line
//disconnect card
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
//release context
SCardReleaseContext(hContext);
return 0;
}
Этот пример взят из https://www.hidglobal.com/doclib/files/resource_files/omnikey_5025_cl_software_developer_guide_mn_en.pdf
Я только учусь, поэтому надеюсь, что выребята, можете указать мне правильный путь!