2014-09-06 4 views
1

У меня есть считыватель ACR38, и я использую Python2.7. Я искал способы общения с читателем с помощью питона и, наконец, приведенный ниже код найден herePyscard не удалось просмотреть список читателей

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 ================================ 

Q: Почему это не удалось просмотреть список читателей, пока у меня есть мой читатель в диспетчере устройств под устройствами libusb-win32? Должен ли я удалить Libusb?

ответ

2

Причина, почему вы не видите читателя кода является то, что вы смешиваете два подхода:

  1. Ваш код пытается использовать pyscard, который является Python оболочка для/интерфейс SC PC ,
  2. Вы разрешаете libusb управлять USB-устройством ACR38.

libusb - это библиотека для прямого доступа к USB-устройствам, поэтому, если вы позволите USB-порту libusb управлять считывателем, вам также потребуется использовать библиотеку интерфейса libusb для доступа к читателю из вашей программы.

Если вы хотите использовать pyscard (PC/SC), вам также нужно будет позволить ПК/SC управлять читателем. В этом случае вам нужно установить драйвер CCID для этого считывателя вместо драйвера libusb. ACS предоставляет PC/SC driver package, который содержит необходимые драйверы для этого считывателя.

+0

Хороший учебник: https://www.james-ridgway.co.uk/blog/installing-acr122u-drivers-on-linux – MStack

Смежные вопросы