Ubuntu 18系统无法识别ACS APG8201-b2智能卡读卡器问题求助
问题描述
我使用Ubuntu 18系统,正在编写调用智能卡的代码。我使用的设备是ACS APG8201-b2智能卡读卡器,已经安装了官方驱动(PC/SC驱动包,大小3.04MB,版本1.1.8,2020年1月10日发布),以及libpcsclite-dev库。作为入门尝试,我打算运行Ludovic Rousseau提供的C语言示例代码。我的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.。我排查后发现运行lsusb命令可以识别到我的USB读卡器,输出如下:
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)。请问有人能帮我解决这个问题吗?我是不是遗漏安装了某个特定驱动?
解决方案
你遇到的是pcscd守护进程未正确加载读卡器驱动配置的问题,按照以下步骤排查即可解决:
- 第一步:验证pcscd识别状态
先停止后台运行的pcscd服务,以前台调试模式启动查看日志:
启动后插拔一次读卡器,查看日志中是否有sudo systemctl stop pcscd sudo pcscd -f -d072f:8206设备的识别记录,如果出现驱动未找到的提示,说明官方驱动的配置未被pcscd正确加载。 - 第二步:检查驱动配置文件
ACS官方驱动默认会将读卡器USB ID写入/etc/libccid_Info.plist文件,执行以下命令确认设备ID是否存在:
如果无输出,说明驱动安装时配置文件未正确更新,可卸载原有驱动后重新运行官方安装脚本,安装完成后重启pcscd服务。grep -i "8206" /etc/libccid_Info.plist - 第三步:确认用户权限
运行测试程序的用户需要有访问读卡器的权限,执行以下命令将用户加入scard用户组:
执行后注销当前用户重新登录即可生效。sudo usermod -aG scard $USER - 第四步:验证设备可用性
安装pcsc-tools工具包验证读卡器是否正常识别:
如果输出中可以看到ACS读卡器型号,说明驱动配置已经正常,再运行你的测试代码即可正常返回读卡器名称。sudo apt install pcsc-tools pcsc_scan
内容的提问来源于stack exchange,提问作者MJay
相关产品推荐
相关产品推荐

