我无法理解我的症状。 Python正在使用pyscard

时间:2019-06-03 08:04:02

标签: python rfid pyscard

我正在使用Python编写一个程序,该程序可以使用tkinter识别Mifare卡并将其值写入卡中。

我当前的程序很少,但是效果很好。但是,更新卡上的二进制块时,它会间歇性地失败。 失败后,所有二进制块都将更改为0或255。

我不明白这种现象。

读取器发生故障,但卡已更换。

我想消除症状的原因和症状。帮助。

附加源。

  • 失败时
  

连接到ACS ACR122U 00 00

     

FF CA 00 00 04-uid获取

     

DB 96 AE 52 90 00

     

FF 82 00 00 06 05 00 00 00 00 00-加载密钥

     

[] 90 00-成功加载键

     

FF 86 00 00 05 01 00 00 60 00-身份验证

     

[] 90 00-成功认证

     

FF B0 00 01 10-数字1二进制块调用

     

00 00 00 00 40 00 00 00 AA 55 00 00 00 40 00 00 90 00-获取数字1二进制块

     

------------------------更新二进制块之前------------------- -----

     

二进制块之前>> [0,0,0,0,64,0,0,0,170,85,0,0,0,64,0,0]

     

在send_byte之前>> [0,0,0,0,64,0,0,0,170,85,0,0,0,64,0,0]

     
     

FF D6 00 01 10 00 00 00 00 40 00 00 00 AA 55 00 00 00 40 00 00-数字1二进制块更新

     

[] 63 00-失败

     

------------------------更新失败二进制块------------------- -----

     

发送字节>> [0,0,0,0,64,0,0,0,170,85,0,0,0,64,0,0]

     
     

FF 00 40 00 04 01 00 01 01蜂鸣器控制

     

[] 90 00-蜂鸣器控制成功

     

FF 00 40 00 04 01 00 01 01蜂鸣器控制

     

[] 90 00-蜂鸣器控制成功

     

FF B0 00 01 10-数字1二进制块调用

     

[] 63 00-失败

     

与ACS ACR122U 00 00断开连接

  • 失败之后
  

连接到ACS ACR122U 00 00

     

FF CA 00 00 04-uid获取

     

DB 96 AE 52 90 00

     

FF 82 00 00 06 05 00 00 00 00 00-加载密钥

     

[] 90 00-成功加载键

     

FF 86 00 00 05 01 00 00 60 00-身份验证

     

[] 90 00-身份验证成功

     

FF B0 00 01 10-数字1二进制块调用

     

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 90 00-获取数字1二进制块

 def rf_thread(self, second=1.0):

       rf_test()
       _rf_thread = threading.Timer(second, rf_thread)
       _rf_thread.daemon = True
       _rf_thread.start()


 def rf_test():
        hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
        assert hresult == SCARD_S_SUCCESS
        hresult, readers = SCardListReaders(hcontext, [])
        assert len(readers) > 0
        reader = readers[0]
        hresult, hcard, dwActiveProtocol = SCardConnect(
            hcontext,
            reader,
            SCARD_SHARE_SHARED,
            SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)

       # get uid
       try:
            hresult, uid = SCardTransmit(hcard, dwActiveProtocol, [0xFF, 0xCA, 0x00, 0x00, 0x04])
            key = "00000000"

            #load key  
            try:
                SELECT = [0xFF, 0x82, 0x00, 0x00, 0x06]
                DF_TELECOM = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

                hresult, response = SCardTransmit(hcard, SCARD_PCI_T1, SELECT + DF_TELECOM)

                if hresult != SCARD_S_SUCCESS:
                    print(str(SCardGetErrorMessage(hresult))
                    return []

                SELECT = [0xFF, 0x86, 0x00, 0x00, 0x05]
                DF_TELECOM = [0x01, 0x00, 0x00, 0x60, 0x00]


                #authentication
                try:
                    hresult, response = SCardTransmit(hcard, SCARD_PCI_T1, SELECT + DF_TELECOM)

                    if hresult != SCARD_S_SUCCESS:
                        return []

                    # Number 1 binary block get
                    req_byte = [0xFF, 0xB0, 0x00, 0x01, 0x10]
                    hresult, result_money = SCardControl(hcard, SCARD_CTL_CODE(3500), req_byte)


                    # Number 1 binary block update
                    SELECT = [0xFF, 0xD6, 0x00, 0x01, 0x10]
                    DF_TELECOM = [0, 0, 0, 0, 64, 0, 0, 0, 170, 85, 0, 0, 0, 64, 0, 0]

                    hresult, response = SCardTransmit(hcard, SCARD_PCI_T1,
SELECT + DF_TELECOM)

                    if hresult == SCARD_S_SUCCESS:
                        if response[0] == 144:
                             # some success code

                        else:
                            print("------------------------update fail binary block------------------------")
                            print("send byte>>" + str(SELECT + DF_TELECOM))
                            print("-----------------------------------------------------------")

                        try:
                            req_byte = [0xFF, 0x00, 0x40, 0x00, 0x04, 0x01, 0x00, 0x01,0x01]
                            hresult, response = SCardControl(hcard, SCARD_CTL_CODE(3500), req_byte)
                            hresult, response = SCardControl(hcard, SCARD_CTL_CODE(3500),req_byte)
                        except Exception as e:
                            print(e)

                    # Number 1 binary block get
                    res_req_byte = [0xFF, 0xB0, 0x00, 0x01, 0x10]
                    try:
                        hresult, response1 = SCardControl(hcard, SCARD_CTL_CODE(3500), res_req_byte)
                    print("after binary >>" + str(response1))

                    except Exception as e:
                        print(e)


                except Exception as e:
                    print("authentication except >>" + str(e))
            except Exception as e:
                print("load key except >> " + str(e))

       except SystemError:
            print("no card found")
       except Exception as e:
            print("uid err" + str(e))

       finally:
            hresult = SCardReleaseContext(hcontext)
            if hresult != SCARD_S_SUCCESS:
                print('Failed to release context: ' +SCardGetErrorMessage(hresult))

在更新块之后,预期结果应该保持不变,但要间歇性地更改为0或255。

0 个答案:

没有答案