我正在尝试将APDU命令发送到读卡器本身,而不是智能卡。我正在使用的test命令打开和关闭RF场。
如果我第一次连接到智能卡,此命令将通过SCardTransmit发送。但是一旦RF磁场关闭,卡就会断开连接,我不能发送另一个APDU来打开磁场。
基本上,有没有办法在没有卡的情况下通过pc/sc发送APDU。我想在读卡之前配置读卡器的某些部分。
提前谢谢。
--编辑
正如FPGA Warrior提到的,我需要使用SCardControl向读卡器发送APDU命令。
到目前为止,我得到的步骤如下:
使用SCardConnect与SCARD_SHARE_DIRECT和SCARD_PROTOCOL_UNDEFINED连接到“卡片”。这将作为成功返回,并为您提供卡句柄。
_lastError = SCardConnect(_hContext, _cardReaderName, dwShareMode, dwPreferredProtocols, ref phCard, ref _activeProtocol);
返回值:0和一个有效的_hCard句柄。
然后我调用SCardControl
_lastError = SCardControl(phCard, CTL_code(3500), txBytes, (uint)txByte.Length, out rxBytes, (uint)rxAttr.Length, out rxLen);
我现在得到错误ERROR_INVALID_HANDLE (0x6)。因此,我的SCardConnect似乎没有返回有效的句柄,即使它没有返回错误。
作为附注,要在设备上使用PC_to_RDR_Escape模式,您可能需要编辑注册表,以便在安装的驱动程序不允许的情况下将其打开。https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571%28v=vs.85%29.aspx
发布于 2015-02-16 17:09:06
我不知道为什么要通过向卡发送APDU来配置读卡器。事情不应该是这样的。SCardTransmit用于向卡发送命令,如果没有卡,它将不起作用(除非你黑了驱动程序,所以它实际上是插入了卡)。
你可能正在寻找这些API中的一个:https://msdn.microsoft.com/en-us/library/windows/desktop/aa375369(v=vs.85).aspx,它让你可以更直接地访问你的读卡器/卡。
指定您希望在阅读器上设置的配置可能会增加更改,以获得对您有帮助的答案。
发布于 2020-07-19 09:36:30
我可以使用带有这些参数的perl绑定做到这一点:
#connect witouth card in
$hCard = new Chipcard::PCSC::Card($hContext, $ReadersList[0], $Chipcard::PCSC::SCARD_SHARE_DIRECT, $Chipcard::PCSC::SCARD_PROTOCOL_RAW);
#send any adpu
$cmd = Chipcard::PCSC::ascii_to_array("FF 00 40 F0 04 05 05 03 03");
$hCard->Transmit($cmd);
发布于 2020-11-06 07:43:23
我也有过类似的经历,在SCardConnect之后调用SCardTransmit (从SCardTransmit接收ERROR_INVALID_HANDLE <0x6> )。
作为实验,在SCardTransmit之后放入Thread.Sleep(100)似乎可以将睡眠语句后的错误代码从0x6更改为SUCCESS (在调试器中可以看到)。这不是一个解决方案,而是一个正确方向的提示。在SCardControl之后编写线程安全代码来处理语句将是一种更好的方法。
下面的链接是一个很好的参考:
https://www.csharpstar.com/csharp-race-conditions-in-threading/
https://stackoverflow.com/questions/28539775
复制