我在Dotnet智能卡应用程序中使用wincard .dll。我的阅读器Omnikey 5321具有接触式和非接触式接口,它们被检测为两个不同的阅读器。这种非接触式设备的名称中有字母"CL"。手动选择阅读器和做我需要做的一切都没有问题。
是否有一种可靠的方法,使用SCardGetAttrib或另一个调用,来确定这些读取器中哪一个支持ISO14443 -即EMV非接触式?我最终想要一个快速的"选择非接触式设置"按钮,这将是通用的,足以与所有PC/SC阅读器一起工作,因此也允许我禁用非接触式选项,如果这样的接口不存在。
不,没有这样的方法仅仅是因为PCSC比非接触式技术更老(古代的非接触式芯片更老,但需要特殊的读取器和驱动程序,所以没有重叠)。因此,只有阅读器名称的命名约定以依赖于制造商的方式提供此信息。在实践中,这并不重要。你不会给读卡器贴上标签,这样用户就可以选择正确的读卡器,但通常只是要求用户将卡插入/放在读卡器上。然后PCSC将允许检测,哪个阅读器被加载,只要它只有一个。
您可以使用高级查询语法来搜索暴露智能卡接口类并启用NFC的设备。
string query = "System.Devices.InterfaceClassGuid:="{DEEBE6AD-9E01-47E2-A3B2-A66AA2C036C9}"";
if (readerKind != SmartCardReaderKind.Any)
{
query += " AND System.Devices.SmartCards.ReaderKind:=" + (int)readerKind;
}
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(query);
其中readerKind为Windows运行时类型Windows.Devices.SmartCards.SmartCardReaderKind
。代码片段来自官方微软NFC UWP示例(pscsutil .cs)。