Я только что получил устройство считывания карт NF C, и я хотел использовать его в качестве замка. Я использую библиотеку pyscard для получения ATR и UID моей карты. Я нашел эту библиотеку на этом сайте (https://forum.dangerousthings.com/t/introduction-to-smart-card-development-on-the-desktop-guide/2744/2). Я также буду использовать серводвигатель для симуляции в качестве дверного замка. То, что я пытаюсь сделать, это только моя карта способна открыть замок, а не другие. Но когда я пытался использовать другие мои карты с разными ATR и UID, блокировка все еще открывалась. Моя вторая проблема - когда кардридер не обнаруживает ни одной карты в течение 20 секунд, он убивает программу. Я использую Raspberry Pi 3B и запускаю код, используя Python 2.7.9. Ниже приведен код, полученный с сайта, и я просто добавляю код серводвигателя.
from smartcard.CardRequest import CardRequest
from smartcard.Exceptions import CardRequestTimeoutException
from smartcard.CardType import AnyCardType
from smartcard import util
from smartcard.CardType import ATRCardType
from smartcard.util import toHexString, toBytes
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
servo_pin = 19
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3)
WAIT_FOR_SECONDS = 20
card = ATRCardType( toBytes( "XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX" ) )
try:
while True:
if __name__ == '__main__':
# 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) #This is the part when it will kill the program if no card is detected for 20 seconds
# 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))
if (util.toHexString(data) == card): #This is the part where i tried to compare the ATR of the card
pwm.ChangeDutyCycle(3)
time.sleep(1)
else:
pwm.ChangeDutyCycle(11.5)
time.sleep(1)
except KeyboardInterrupt:
pass
pwm.stop()
finally:
GPIO.cleanup()