我买了几个ACR1252 NFC读卡器,因为它们似乎是唯一可以存储和返回内部序列号的读卡器。我需要它们用于C#程序,我需要区分插入同一台计算机的2个NFC读卡器,因为Windows按连接顺序分配名称并且可以更改。
我的问题是:如何在阅读器上没有NFC卡的情况下访问返回序列号的命令?它只适用于读者读卡时。 p>
我的代码(缩写)是这样的:
public void getReaderSerialNumer()
{
int retCode = Card.SCardEstablishContext(Card.SCARD_SCOPE_SYSTEM, 0, 0, ref hContext);
readername = "ACS ACR1252 1S CL Reader PICC 0";
retCode = Card.SCardConnect(hContext, readername, Card.SCARD_SHARE_DIRECT, Card.SCARD_PROTOCOL_T0 | Card.SCARD_PROTOCOL_T1, ref hCard, ref Protocol);
byte[] sendBytes = new byte[] { 0xE0, 0x00, 0x00, 0x33, 0x00 };
int pcBytesReturned = 0;
Byte[] RecieveBuff = new Byte[64];
uint controlcode = 3225264;
retCode = Card.SCardControl(hCard, controlcode, ref sendBytes[0], sendBytes.Length, ref RecieveBuff[0], RecieveBuff.Length, ref pcBytesReturned);
char[] outchar = System.Text.Encoding.UTF8.GetString(RecieveBuff).ToCharArray();
uint pCard = (uint)hCard;
retCode = Card.SCardDisconnect((int)pCard, Card.SCARD_RESET_CARD);
}
只有第一个命令SCardEstablishContext
无卡工作。但对于SCardConnect
和SCardControl
,如果读卡器上没有卡,我会收到错误。
SCardConnect
返回retCode = -2146434967
SCardControl
返回retCode = 6
但我需要3个命令才能获得:
SCardEstablishContext - > hContext - > SCardConnect - > hCard - > SCardControl - >读者的序列号
如何在没有连接卡的情况下获取读卡器序列号(只需将读卡器插入USB端口)?
答案 0 :(得分:0)
为了在没有读卡器的情况下成功调用SCardConnect()
,您需要结合使用参数SCARD_SHARE_DIRECT
和将首选协议参数设置为0:
retCode = Card.SCardConnect(hContext, readername, Card.SCARD_SHARE_DIRECT, 0, ref hCard, ref Protocol);
请参见SCardConnect function, dwPreferredProtocols:
仅当dwShareMode设置为SCARD_SHARE_DIRECT时,此参数才可以为零。在这种情况下,在通过SCardControl发送IOCTL_SMARTCARD_SET_PROTOCOL控制指令之前,驱动程序将不执行协议协商。
但是,请注意,通常您需要从ACS网站安装驱动程序,因为其他驱动程序可能不提供此类转义命令的功能。