非接触式'重置'失败

时间:2015-09-26 00:08:06

标签: windows smartcard contactless-smartcard pcsc winscard

除了我希望移除非接触式卡'A'之外,我的应用程序在所有方面都正常工作,并用非接触式卡'B'替换它。

存在卡B后,我运行以下PCSC功能:

    lResult = PCSC.SCardDisconnect(hCard, SCARD_RESET_CARD)
    lResult = PCSC.SCardReleaseContext(hContext)
    lMode = SCARD_SHARE_EXCLUSIVE
    lProtocol = SCARD_PROTOCOL_T0

    lResult = PCSC.SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, hContext)

    If lMode = SCARD_SHARE_DIRECT Then
        lResult = PCSC.SCardConnect(hContext, ConnReaderName, lMode, 0, hCard, lActiveProtocol)
    Else
        lResult = PCSC.SCardConnect(hContext, ConnReaderName, lMode, lProtocol, hCard, lActiveProtocol)
    End If

尽管此代码断开连接,释放上下文,重新建立上下文并重新连接到卡,但我似乎得到了8010000f协议不匹配错误。两张牌都是T = 0。经过大量测试后,我发现实际上唯一可行的是在将非接触式卡B引入现场后等待大约10秒无活动,然后读卡器的活动指示灯再次闪烁,似乎重置了卡并允许交易进行正常进行。

为什么会这样?有没有办法可以尽快强制最终重置?

我确实将ScardDisconnect和ScardReleaseContext命令分开,执行它们,而非接触式卡A仍在现场,但没有任何区别。

1 个答案:

答案 0 :(得分:0)

这是一个可能的解决方案:

在直接模式下建立新的连接,然后在共享/独占模式下重新连接,迫使卡重置或卡断电

ret = SCardConnect(hContext, readername, lMode, SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
if (ret == SCARD_E_PROTO_MISMATCH) {
    ret = SCardConnect(hContext, readername, SCARD_SHARE_DIRECT, 0, &hCard, &dwActiveProtocol);
    if (!ret) ret = SCardReconnect(hCard, lMode, SCARD_PROTOCOL_T0, SCARD_RESET_CARD, &dwActiveProtocol);
}