c# - ACR1252 NFC读写器序列号

标签 c# nfc smartcard-reader pcsc winscard

我买了几个 ACR1252 NFC 阅读器,因为它们似乎是唯一可以存储和返回内部序列号的阅读器。我需要将它们用于 C# 程序,我需要在其中区分插入同一台计算机的 2 个 NFC 读取器,因为 Windows 按连接顺序分配名称并且可以更改。

我的问题是:如何在读卡器上没有 NFC 卡的情况下访问返回序列号的命令?它仅在读卡器正在读卡时起作用。

我的代码(缩写)是这样的:

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 可以在没有卡片的情况下工作。但是对于 SCardConnectSCardControl 如果读卡器上没有卡,我会得到错误。

SCardConnect 返回 retCode = -2146434967

SCardControl 返回 retCode = 6

但我需要 3 个命令才能获得:

SCardEstablishContext -> hContext -> SCardConnect -> hCard -> SCardControl -> 读写器序列号

如何在没有连接卡的情况下获取读卡器序列号(只是将读卡器插入 USB 端口)?

最佳答案

为了在读卡器上没有卡的情况下成功调用 SCardConnect(),您需要将参数 SCARD_SHARE_DIRECT 与设置首选协议(protocol)结合使用0 的参数:

retCode = Card.SCardConnect(hContext, readername, Card.SCARD_SHARE_DIRECT, 0, ref hCard, ref Protocol);

参见 SCardConnect function, dwPreferredProtocols :

This parameter may be zero only if dwShareMode is set to SCARD_SHARE_DIRECT. In this case, no protocol negotiation will be performed by the drivers until an IOCTL_SMARTCARD_SET_PROTOCOL control directive is sent with SCardControl.

但是请注意,您通常需要从 ACS 网站安装驱动程序,因为其他驱动程序可能不提供此类转义命令的功能。

关于c# - ACR1252 NFC读写器序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50926833/

相关文章:

c# - SSL 数据读取和写入传输速率在服务器中有效管理

c# - 为什么当播放器对象被破坏时我的背景音乐停止播放?

c# - asp.net mvc 可以自动生成时间戳到 js 代码吗?

android - 使用 NFC-B 卡在 Galaxy S3 上收发失败

c# - 智能卡读卡器插件(已插入卡)事件

java - 在 Jcard 上部署 javacard 小程序

c# - MVC3 锁定成员(member)用户

安卓 NFC : copy card into device

android - 禁用光束触摸模式

c# - 如何读取金雅拓智能卡的序列号?