Бесконтактная ошибка сброса
Мое приложение работает должным образом во всех аспектах, кроме случаев, когда я хочу удалить бесконтактную карту "А" и заменить ее бесконтактной картой "В".
Когда карта 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 Protocol Mismatch. Обе карты имеют Т =0. После долгих испытаний я обнаружил, что единственное, что действительно работает, - это подождать около 10 секунд бездействия после введения бесконтактной карты B в поле, после чего индикатор активности считывателя снова мигает, по-видимому, сбрасывая карту и позволяя транзакции идти впереди как обычно.
Почему это происходит? И есть ли способ, которым я могу форсировать этот возможный сброс раньше?
Я разделил команды ScardDisconnect и ScardReleaseContext, выполняя их, пока бесконтактная карта A все еще была в поле, но это не имело никакого значения.
0 ответов
Вот возможное решение:
установить новое соединение в прямом режиме с последующим повторным подключением в общем / монопольном режиме с принудительным сбросом карты или отключением карты
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);
}