用python发送APDU命令(RC522,RaspberryPi)

2024-04-29 07:45:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我构建了一个带有树莓皮3和RC522的RFID阅读器,使用以下代码作为起点:https://github.com/mxgxw/MFRC522-python。 不幸的是,在发送了任何APDU命令之后,我无法从我的卡上获得APDU响应。在

我目前的工作流程大致是ISO 14443-4:

  1. 搜索卡片
  2. 接收ATQA
  3. 防撞选卡
  4. 确定卡是否支持ISO-14443-4协议
  5. 发送老鼠和接收ATS
  6. 执行PPS请求[直到这里一切正常,我得到回复。]
  7. 发送APDU命令[顺便说一句,这个命令可以很好地与我的智能手机和应用程序配合使用]

    #Scan for cards    
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
    
    #If a card is found
    if status == MIFAREReader.MI_OK:
    print "Card detected"
    TagType = (TagType >> 6) | 0 #(Länge der UID errechnen 
    print "Tagtype:  %s" % (TagType)
    
    # START  ANTI-COLLISION AS OF ISO 14443
    
    if TagType == 0:
        print "UID length is single -- starting ANTI-COLLISION CL1"
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
    
        if status == MIFAREReader.MI_OK:
            print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
    
    elif TagType == 1: # Ignore this part as there is no functionality by now
        print "CARD IS NOT SUPPORTED YET"
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
    
    elif TagType == 2:
        print "CARD IS NOT SUPPORTED YET"
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
    
    elif TagType == 3:
        print "CARD IS NOT SUPPORTED YET"
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
    
    
    else:
        print "An unexpected error occured: UID length is not covered by ISO-14443."
    
    (size, APDU) = MIFAREReader.MFRC522_SelectTag(uid)
    
    print "Card selected"
    print "ISO 14443-4 Compatibility: %s" % (APDU)
    
    if APDU == 1: # Card supports ISO 14443-4 protocol [Problem could be here]
    
        #SEND RATS
        print "Sening RATS"
        RATS_Sequenz = [0xE0, 0x50]
        CRC_RATS = []
        CRC_RATS = MIFAREReader.CalulateCRC(RATS_Sequenz)
        RATS_Sequenz.append(CRC_RATS[0])
        RATS_Sequenz.append(CRC_RATS[1])
        (stat, res, leng) = MIFAREReader.MFRC522_ToCard(MIFAREReader.PCD_TRANSCEIVE, RATS_Sequenz)
    
        # Muss: Auswertung des ATS
    
        # PPS
        print "Initialisiere PPS-Kommando"
        PPSS_Sequenz = [0xD0, 0x11, 0x00]
        CRC_PPSS = []
        CRC_PPSS = MIFAREReader.CalulateCRC(PPSS_Sequenz)
        PPSS_Sequenz.append(CRC_PPSS[0])
        PPSS_Sequenz.append(CRC_PPSS[1])
        (stat, res, leng) = MIFAREReader.MFRC522_ToCard(MIFAREReader.PCD_TRANSCEIVE, PPSS_Sequenz)
    
        #PCB = [0x02]
        #PCB.append(PCB[0])
        #PCB.append(PCB[1])
        #(stat, res, leng) = MIFAREReader.MFRC522_ToCard(MIFAREReader.PCD_TRANSCEIVE, PCB)
    
        command = [0xFF, 0x41, 0x00, 0x00, 0x00] # NOT THE COMMAND!
        Header = [0x00, 0x22, 0xC1, 0xA4, 0x12, 0x80, 0x0A, 0x04, 0x00, 0x7F, 0x00, 0x07, 0x02, 0x02, 0x04, 0x02, 0x02, 0x83, 0x01, 0x02, 0x84, 0x01, 0x0D] #Command to be sent
        pOut = MIFAREReader.CalulateCRC(Header)
        Header.append(pOut[0])
        Header.append(pOut[1])
    
        (stat, res, leng) = MIFAREReader.MFRC522_ToCard(MIFAREReader.PCD_TRANSCEIVE, (Header))
        time.sleep(1) # Leftover from here / another non working try
    
        Body = [0x80, 0x0A, 0x04, 0x00, 0x7F, 0x00, 0x07, 0x02, 0x02, 0x04, 0x02, 0x02, 0x83, 0x01, 0x02, 0x84, 0x01, 0x0D]
        #pOut = MIFAREReader.CalulateCRC(Body)
        #Body.append(pOut[0])
        #Body.append(pOut[1])
    
        #(stat, res, leng) = MIFAREReader.MFRC522_ToCard(MIFAREReader.PCD_TRANSCEIVE, Body)
    elif APDU == 0:
        #HALT
        command = [0x50]
        pOut = MIFAREReader.CalulateCRC(command)
        command.append(pOut[0])
        command.append(pOut[1])
        (stat, res, leng) = MIFAREReader.MFRC522_ToCard(MIFAREReader.PCD_TRANSCEIVE, command)
        #WOP
    

这是“库”中的send函数:

^{pr2}$

使用上述代码的“toCard”函数发送命令,其结构如下:

APDU命令+CRC字节。在


例如0x00[CLA]、0x22[INS]、0xC1[P1]、0xA4[P2]、0x12[长度]、0x80[数据、0x0A、0x04、0x00、0x7F、0x00、0x07、0x02、0x02、0x04、0x02、0x02、0x83、0x01、0x02、0x84、0x01、0x0D、CRC1、CRC2


我还尝试用一个额外的PCB或多个部分发送命令(例如,先发送头,然后发送主体)。 我不确定APDU命令的结构是,还是我忘记了iso14443中激活过程的某些部分。如果有人能帮我,我会很高兴的。在


Tags: 命令uidstatuscrcprintappendpcbapdu