如何确定智能卡读卡器的类型(联系与非接触式)

时间:2011-12-09 18:03:42

标签: c# smartcard smartcard-reader pcsc

我有一个我正在使用的PC / SC抽象层(家庭酿造),我很好奇如何确定我可能与之交互的读者类型。我目前正在使用一种方法,该方法涉及基于读者名称的字符串的名称正则表达式匹配。这很好,接受没有关于如何命名读者的标准,导致该方法容易出错。任何人都有任何具体的建议尝试,可能是基于与读者的一些较低级别的沟通?

希望听到一些想法!

3 个答案:

答案 0 :(得分:1)

我不确切地知道读者类型的含义,但要知道系统附带的所有读者,您可以使用SCardListReaders(...)API。

根据Microsoft MSDN page

的定义
LONG WINAPI SCardListReaders(
  __in      SCARDCONTEXT hContext,
  __in_opt  LPCTSTR mszGroups,
  __out     LPTSTR mszReaders,
  __inout   LPDWORD pcchReaders
);

这将返回字符串格式的所有读者的列表,例如:将返回SCM阅读器,例如" SCM Microsystems Inc. SCL011非接触式阅读器0"。

希望这会有所帮助!!

答案 1 :(得分:1)

您只能在非接触式读卡器上获得ISO 14443非接触式UID。

PC / SC的“第3部分:PC连接接口设备的要求”,第26页,表3-8a:定义了一个GET DATA命令APDU,它返回非接触设备的UID。

FF CA 00 00 00 

因此,如果命令成功,您就知道它是非接触式读卡器。 如果命令失败,则您的阅读器不支持该命令,或者它是联系人阅读器。

我知道这些读者支持这个命令:

  • OMNIKEY CardMan 5x21-CL 0
  • Identive SDI011G非接触式读卡器0
  • Identive SDI010非接触式读卡器0
  • SCM Microsystems Inc. SDI011G非接触式读卡器0
  • ACS ACR1252 1S CL Reader PICC 0

查看Pcsc1-10 V2 01 14.zip pcsc3_v2.01.09.pdf中的custom keyboard for android code(来自PC/SC Workgroup Specification Files)。

答案 2 :(得分:1)

对不起,我知道它不是你问题的答案,但听到这个。我的解决方案与您的解决方案完全相同。从名单中,我检查它们是否包含特定部分,然后我得出结论,如果这是已知的类型或未知的读者。

之后,如果读者是已知的类型,我知道读者使用什么协议,而不仅仅是非接触式读卡器。如果你有两个,你知道哪个是哪个。

它对我很有用(现在好几个月了),如果你因为我不理解的原因而无法切换它,你可以保持原样。