Pyscard не удалось перечислить читателей
У меня есть читатель ACR38, и я использую Python2.7. Я искал способы общения с читателем с помощью Python и, наконец, код ниже, найденный здесь
import sys
sys.path.append('D:\PythonX\Lib\site-packages')
from smartcard.scard import *
import smartcard.util
SELECT = [0x00, 0xA4, 0x04, 0x00, 0x0A, 0xA0, 0x00, 0x00, 0x00, 0x62,
0x03, 0x01, 0x0C, 0x06, 0x01]
COMMAND = [0x00, 0x00, 0x00, 0x00]
try:
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to establish context : ' +
SCardGetErrorMessage(hresult))
print 'Context established!'
try:
hresult, readers = SCardListReaders(hcontext, [])
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to list readers: ' +
SCardGetErrorMessage(hresult))
print 'PCSC Readers:', readers
if len(readers) < 1:
raise Exception('No smart card readers')
reader = readers[0]
print "Using reader:", reader
try:
hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader,
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
if hresult != SCARD_S_SUCCESS:
raise Exception('Unable to connect: ' +
SCardGetErrorMessage(hresult))
print 'Connected with active protocol', dwActiveProtocol
try:
hresult, response = SCardTransmit(hcard, dwActiveProtocol,
SELECT)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to transmit: ' +
SCardGetErrorMessage(hresult))
print 'Select: ' + smartcard.util.toHexString(response,
smartcard.util.HEX)
hresult, response = SCardTransmit(hcard, dwActiveProtocol,
COMMAND)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to transmit: ' +
SCardGetErrorMessage(hresult))
print 'Command: ' + smartcard.util.toHexString(response,
smartcard.util.HEX)
finally:
hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to disconnect: ' +
SCardGetErrorMessage(hresult))
print 'Disconnected'
except Exception, message:
print "Exception:", message
finally:
hresult = SCardReleaseContext(hcontext)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to release context: ' +
SCardGetErrorMessage(hresult))
print 'Released context.'
except Exception, message:
print "Exception:", message
import sys
if 'win32' == sys.platform:
print 'press Enter to continue'
sys.stdin.read(1)
Но когда я запускаю код, я получаю следующую ошибку:
>>> ================================ RESTART ================================
>>>
Context established!
Released context.
Exception: Failed to list readers: Cannot find a smart card reader.
press Enter to continue
Traceback (most recent call last):
File "C:/Users/ghasemi.IT/Desktop/123", line 76, in <module>
sys.stdin.read(1)
AttributeError: read
>>> ================================ RESTART ================================
В: Почему не удалось отобразить список читателей, когда у меня есть читатель в диспетчере устройств на устройствах libusb-win32? Должен ли я удалить Libusb?
1 ответ
Причина, по которой вы не видите читателя с вашим кодом, заключается в том, что вы смешиваете два подхода:
- Ваш код пытается использовать pyscard, которая является оболочкой Python для интерфейса PC/SC.
- Вы позволяете libusb управлять устройством USB ACR38.
libusb - это библиотека для прямого доступа к USB-устройствам, поэтому, если вы разрешите USB-драйверу libusb управлять устройством чтения, вам также потребуется использовать интерфейсную библиотеку libusb для доступа к программе чтения из вашей программы.
Если вы хотите использовать pyscard (PC/SC), вам также нужно разрешить PC/SC управлять устройством чтения. В этом случае вам нужно установить драйвер CCID для этого читателя вместо драйвера libusb. ACS предоставляет пакет драйверов для ПК / SC, содержащий необходимые драйверы для этого считывателя.