Как сбросить этот код после обнаружения смарт-карты, не завершая ее, при этом продолжает прослушивать другие смарт-карты? - PullRequest
1 голос
/ 04 апреля 2019

У меня работает код, который успешно печатает ATR, UID и статус, однако программа завершает работу после обнаружения и печати UID. Как выполнить сброс кода после обнаружения и ожидания извлечения и вставки другой карты (или той же карты)

Я пытался использовать циклы while, но это заставляет программу много раз печатать ATR, UID и статус, а когда карта извлекается, программа завершается с ошибкой.

from smartcard.CardRequest import CardRequest
from smartcard.Exceptions import CardRequestTimeoutException
from smartcard.CardType import AnyCardType
from smartcard import util

WAIT_FOR_SECONDS = 60

# respond to the insertion of any type of smart card
card_type = AnyCardType()

# create the request. Wait for up to x seconds for a card to be attached
request = CardRequest(timeout=WAIT_FOR_SECONDS, cardType=card_type)

# listen for the card
service = None
try:
    service = request.waitforcard()
except CardRequestTimeoutException:
    print("ERROR: No card detected")
    exit(-1)

# when a card is attached, open a connection
conn = service.connection
conn.connect()

# get and print the ATR and UID of the card
get_uid = util.toBytes("FF CA 00 00 00")
print("ATR = {}".format(util.toHexString(conn.getATR())))
data, sw1, sw2 = conn.transmit(get_uid)
uid = util.toHexString(data)
status = util.toHexString([sw1, sw2])
print("UID = {}\tstatus = {}".format(uid, status))

Исправленное исправление (Это продолжает печатать , а когда я вынимаю карту, оно прекращается (решено)):

from smartcard.CardRequest import CardRequest
from smartcard.Exceptions import CardRequestTimeoutException
from smartcard.CardType import AnyCardType
from smartcard import util

WAIT_FOR_SECONDS = 60
# respond to the insertion of any type of smart card
card_type = AnyCardType()

# create the request. Wait for up to x seconds for a card to be attached
request = CardRequest(timeout=WAIT_FOR_SECONDS, cardType=card_type)

while True:
    # listen for the card
    service = None
    try:
        service = request.waitforcard()
    except CardRequestTimeoutException:
        print("ERROR: No card detected")
        # could add "exit(-1)" to make code terminate

    # when a card is attached, open a connection
    try:
        conn = service.connection
        conn.connect()

        # get the ATR and UID of the card
        get_uid = util.toBytes("FF CA 00 00 00")
        data, sw1, sw2 = conn.transmit(get_uid)
        uid = util.toHexString(data)
        status = util.toHexString([sw1, sw2])


        # print the ATR and UID of the card
        print("ATR = {}".format(util.toHexString(conn.getATR())))
        print("UID = {}\tstatus = {}".format(uid, status))
    except:
        print("no connection")

Проблема в том, что я не могу понять, как создать цикл, в котором он печатается один раз. После печати UID он ожидает удаления карты и ввода другой карты, и цикл сбрасывается.

Редактировать: Мне удалось выполнить сброс кода, однако я не могу понять, как заставить программу печатать один раз, а не продолжать печать. Есть предложения?

Я ожидаю, что код будет напечатан один раз после наличия смарт-карты, а затем, когда смарт-карта извлечена, сбрасывается и снова прослушивает смарт-карту.

...