Как использовать Advanced Card Systems ACR1222U-A9 в качестве систем ввода с ключ-картой - PullRequest
0 голосов
/ 18 февраля 2020

Я только что получил устройство считывания карт 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()
...