【问题标题】:Detection of smart card removal and insertion using PCSC in C在 C 中使用 PCSC 检测智能卡移除和插入
【发布时间】:2017-02-25 13:35:07
【问题描述】:

我正在使用 PCSC-lite v1.6.4 进行基于智能卡的应用程序开发。 我需要一种方法来检测从读卡器中取出智能卡后的情况,然后检测插入读卡器的情况,以便强制智能卡再次完成特定过程。

如果可能,是否有任何基于中断/事件的方式来代替简单的轮询?

【问题讨论】:

    标签: smartcard smartcard-reader pcsc


    【解决方案1】:

    WinSCard 库中有SCardGetStatusChange

    阻止执行,直到特定读卡器中卡的当前可用性发生变化。

    由于 PCSC Lite 是 WinSCard 库的重新实现,您也可以在 PCSC Lite (here) 中使用它。你可以找到几个examples

    【讨论】:

    • 感谢示例的链接。它给了我一个很好的起点。但是状态改变后收到的 dwEventState 问题不大。每当智能卡状态发生变化时,它的第三个字节就会不断增加一。可以吗?它可以溢出到实际的状态字节吗?
    • 在示例链接中,代码使用 500 毫秒超时。在这里使用 INFINITE (-1) 值作为超时是否更合适,因为它会节省大量 CPU 时间?
    • 是的,您可以使用 INFINITE 作为参数。然后该函数将永远不会超时。你确定dwEventState 会在智能卡状态发生变化时加一吗?也许你看到的是SCARD_STATE_CHANGED 切换(SCARD_READERSTATE structure)。
    • 是的,以下是我不断取出和插入卡时得到的值:0X120、0X10012、0X20122、0X30012、0X40122、0X50012 等等。 (这些是使用 printf 中的“%#X”格式修饰符打印的)。
    • 在 PCSC Lite 文档中(请参阅我的答案中的链接)我发现:dwEventState also contains a number of events in the upper 16 bits (dwEventState & 0xFFFF0000). This number of events is incremented for each card insertion or removal in the specified reader. This can be used to detect a card removal/insertion between two calls to SCardGetStatusChange()。所以从我的角度来看,它不应该溢出到状态字节中。一切都好。顺便说一句,我怀疑这个事件计数器没有在 Windows PCSC 中实现。将代码移植到 Windows 时要小心。
    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多