我正在使用Ubuntu 18并尝试编写使用智能卡的代码。我正在使用ACS APG 8201-b2智能卡读卡器,并且我已经安装了the official driver(PC/SC驱动程序包3.04 MB,版本1.1.8,2020年1月10日)和libpcsclite-dev
。首先,我尝试运行LudovicRousseau的示例C代码here。我可以将代码ApduTool.c
编译为:
#ifdef WIN32
#undef UNICODE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <winscard.h>
#ifdef WIN32
static char *pcsc_stringify_error(LONG rv)
{
static char out[20];
sprintf_s(out, sizeof(out), "0x%08X", rv);
return out;
}
#endif
#define CHECK(f, rv) \
if (SCARD_S_SUCCESS != rv) \
{ \
printf(f ": %s\n", pcsc_stringify_error(rv)); \
return -1; \
}
int main(void)
{
LONG rv;
SCARDCONTEXT hContext;
LPTSTR mszReaders;
SCARDHANDLE hCard;
DWORD dwReaders, dwActiveProtocol, dwRecvLength;
SCARD_IO_REQUEST pioSendPci;
BYTE pbRecvBuffer[258];
BYTE cmd1[] = { 0x00, 0xA4, 0x04, 0x00, 0x0A, 0xA0, 0x00, 0x00, 0x00, 0x62, 0x03, 0x01, 0x0C, 0x06, 0x01 };
BYTE cmd2[] = { 0x00, 0x00, 0x00, 0x00 };
unsigned int i;
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
CHECK("SCardEstablishContext", rv)
#ifdef SCARD_AUTOALLOCATE
dwReaders = SCARD_AUTOALLOCATE;
rv = SCardListReaders(hContext, NULL, (LPTSTR)&mszReaders, &dwReaders);
CHECK("SCardListReaders", rv)
#else
rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
CHECK("SCardListReaders", rv)
mszReaders = calloc(dwReaders, sizeof(char));
rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
CHECK("SCardListReaders", rv)
#endif
printf("reader name: %s\n", mszReaders);
return 0;
}
字符串
使用Makefile
:
all: ApduTool.c
gcc -c ApduTool.c -lsqlite3 -lpcsclite -lcrypto -lssl -I/usr/local/include/PCSC/ -I/usr/lib/ -I.
gcc ApduTool.o -o ApduTool -lsqlite3 -lpcsclite -lcrypto -lssl -I/usr/local/include/PCSC/ -I/usr/lib/ -I.
clean:
rm -f ApduTool *.o
型
当我运行ApduTool二进制文件时,SCardListReaders
函数返回:SCardListReaders: Cannot find a smart card reader.
我猜不出问题是什么,因为我可以看到我的USB读卡器时运行lsusb
:
Bus 001 Device 003: ID 072f:8206 Advanced Card Systems, Ltd
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
型
我在运行代码时运行了PCSC守护进程(pcscd
)。
有人能帮我解决这个问题吗?我是否错过了安装某个特定的驱动程序?
2条答案
按热度按时间ca1c2owp1#
pcscd应记录发生的情况以及是否找到读卡器驱动程序。
请参阅https://pcsclite.apdu.fr/#support了解如何生成正确的pcscd日志。
juzqafwq2#
事实上,您的系统将USB读卡器识别为存在并连接,这不足以知道如何解决它。
我假设,相应的驱动程序丢失(不确定,ACS是否为Linux提供了一个)。