У меня работает код, который успешно печатает 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 он ожидает удаления карты и ввода другой карты, и цикл сбрасывается.
Редактировать: Мне удалось выполнить сброс кода, однако я не могу понять, как заставить программу печатать один раз, а не продолжать печать. Есть предложения?
Я ожидаю, что код будет напечатан один раз после наличия смарт-карты, а затем, когда смарт-карта извлечена, сбрасывается и снова прослушивает смарт-карту.