2014-09-06 70 views
1

我有一個ACR38閱讀器,我使用Python2.7。我搜索了與讀者溝通的方式使用python,最後下面的代碼中發現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 ================================ 

問:爲什麼它未能列出讀者,而我的設備管理器中有我的讀卡器在libusb-win32設備?我應該刪除Libusb嗎?

回答

2

你之所以沒有看到你的代碼的讀者,你是混合兩種方法在這裏:

  1. 您的代碼嘗試使用pyscard,這對於PC/SC接口Python包裝。
  2. 您讓libusb管理ACR38 USB設備。

libusb的是直接訪問USB設備庫,因此,如果你讓libusb的的USB驅動程序管理的讀者,你還需要使用libusb的界面庫,從您的程序訪問閱讀器。

如果您想使用pyscard(PC/SC),您還需要讓PC/SC管理讀卡器。在這種情況下,您需要爲該閱讀器安裝CCID驅動程序,而不是libusb驅動程序。 ACS提供了一個PC/SC driver package,其中包含該讀者的必要驅動程序。

+0

好教程:https://www.james-ridgway.co.uk/blog/installing-acr122u-drivers-on-linux – MStack 2015-12-10 14:36:17