非接触式“重置”失败

Posted

技术标签:

【中文标题】非接触式“重置”失败【英文标题】:Contactless 'Reset' Failure 【发布时间】:2015-09-26 00:08:06 【问题描述】:

除了我希望移除非接触式卡“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 仍在现场时执行它们,但没有任何区别。

【问题讨论】:

您使用哪种阅读器?问题是,您只是在解决 PCSC 问题,而问题是,当读卡器切换其字段或与卡断开连接时(下一层);联轴器取决于制造商的解释。 (所以最便宜的建议:尝试其他制造商的阅读器)。注意,T=0 是联系协议;您可能会改用 ISO 14443:A 类还是 B 类? 谢谢 - 我使用的是 Omnikey 5321。它仍然将非接触式卡显示为 T=0 或 T=1 - 我猜可能是一些内部驱动程序软糖。现在我知道这是一个阅读器“功能”,我可以等待 10 秒左右,然后才能使用新的非接触式卡,那么它是可以忍受的,而且远没有那么烦人。 【参考方案1】:

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

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

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);

【讨论】:

以上是关于非接触式“重置”失败的主要内容,如果未能解决你的问题,请参考以下文章

win10重置电脑时出现初始化失败 怎么解决重置电脑初始化失败

NVIC 系统重置失败

接收失败:连接已重置 git

Laravel 迁移重置失败

python 重置Jira登录失败

uploadPart 失败,无法执行 HTTP 请求:连接重置