You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 -d
    
    启动后插拔一次读卡器,查看日志中是否有072f:8206设备的识别记录,如果出现驱动未找到的提示,说明官方驱动的配置未被pcscd正确加载。
  • 第二步:检查驱动配置文件
    ACS官方驱动默认会将读卡器USB ID写入/etc/libccid_Info.plist文件,执行以下命令确认设备ID是否存在:
    grep -i "8206" /etc/libccid_Info.plist
    
    如果无输出,说明驱动安装时配置文件未正确更新,可卸载原有驱动后重新运行官方安装脚本,安装完成后重启pcscd服务。
  • 第三步:确认用户权限
    运行测试程序的用户需要有访问读卡器的权限,执行以下命令将用户加入scard用户组:
    sudo usermod -aG scard $USER
    
    执行后注销当前用户重新登录即可生效。
  • 第四步:验证设备可用性
    安装pcsc-tools工具包验证读卡器是否正常识别:
    sudo apt install pcsc-tools
    pcsc_scan
    
    如果输出中可以看到ACS读卡器型号,说明驱动配置已经正常,再运行你的测试代码即可正常返回读卡器名称。

内容的提问来源于stack exchange,提问作者MJay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:54:05