2016-04-09 106 views
2

我想知道是否有方法来轮询ACR122U在Python中,如果是的话如何?下面我的脚本获取一张卡的UID,但不断运行。我知道它运行,因为while1但它说明了什么,我想才达到Python ACR122U投票

from smartcard.scard import * 
from smartcard.util import  toHexString 

def s(): 
while 1: 
    hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER) 
    assert hresult==SCARD_S_SUCCESS 
    hresult, readers = SCardListReaders(hcontext, []) 
    assert len(readers)>0 
    reader = readers[0] 
    hresult, hcard, dwActiveProtocol = SCardConnect(
    hcontext, 
    reader, 
    SCARD_SHARE_SHARED, 
    SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) 
    try: 
    hresult, response = SCardTransmit(hcard,dwActiveProtocol,[0xFF,0xCA,0x00,0x00,0x04]) 
    uid = toHexString(response, format=0) 
    print uid 
    except SystemError: 
    print "no card found" 
s() 
+0

那么你的实际问题是什么? –

+0

现在它只是运行显示找不到或uid一遍又一遍 – shaggs

+0

是的,这正是你的代码应该做的,这也非常符合你指定的要求(“*在Python *中轮询ACR122U的方法* “)。因此,再一次,你的实际问题是什么? –

回答

1

发现了这件事后,多一点搜索。

该操作码正在使用PC/SC cammands及以下使用APU命令。

cardmonitor = CardMonitor() 
cardobserver = printout() 
cardmonitor.addObserver(cardobserver) 
#If no card in 20secs kill program (put in for testing) 
sleep(20) 
cardmonitor.deleteObserver(cardobserver) 

所以当blened在一起你

class printobserver(CardObserver): 
    def update(self, observable, (addedcards, removedcards)): 
     for card in addedcards: 
     if addedcards: 
      hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER) 
      assert hresult==SCARD_S_SUCCESS 
      hresult, readers = SCardListReaders(hcontext, []) 
      assert len(readers)>0 
      reader = readers[0] 
      hresult, hcard, dwActiveProtocol = SCardConnect(
      hcontext, 
      reader, 
      SCARD_SHARE_SHARED, 
      SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) 
      hresult, response = SCardTransmit(hcard,dwActiveProtocol,[0xFF,0xCA,0x00,0x00,0x04]) 
      uid = toHexString(response, format=0) 
      print response #cards ATR 
      print uid #Cards UID 

print "place card on reader" 
while 1: 
    cardmonitor = CardMonitor() 
    cardobserver = printobserver() 
    cardmonitor.addObserver(cardobserver) 
    cardmonitor.deleteObserver(cardobserver) 
    time.sleep(2) 

它没有这样做的一个整洁的方式,但它的工作原理。