Серийный номер считывателя NFC ACR1252

Я купил пару считывателей 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 работает без карты. Но для SCardConnect а также SCardControl Я получаю ошибку, если на ридере нет карты.

SCardConnect возвращает retCode = -2146434967

SCardControl возвращает retCode = 6

Но мне нужны 3 команды, чтобы получить:

SCardEstablishContext -> hContext -> SCardConnect -> hCard -> SCardControl -> Серийный номер считывателя

Как я могу получить серийный номер считывателя без прикрепленной к нему карты (только считыватель, подключенный к USB-порту)?

1 ответ

Решение

Чтобы звонить SCardConnect() Успешно, если на ридере нет карты, вам нужно использовать параметр SCARD_SHARE_DIRECT в сочетании с установкой аргумента предпочтительного протокола в 0:

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

Смотрите функцию SCardConnect, dwPreferredProtocols:

Этот параметр может быть нулевым, только если для dwShareMode установлено значение SCARD_SHARE_DIRECT. В этом случае драйверы не будут выполнять согласование протоколов до тех пор, пока управляющая директива IOCTL_SMARTCARD_SET_PROTOCOL не будет отправлена ​​с помощью SCardControl.

Однако имейте в виду, что обычно вам необходимо установить драйвер с веб-сайта ACS, поскольку другие драйверы могут не обеспечивать возможности для этого типа escape-команд.

Другие вопросы по тегам