Я не могу понять мои симптомы.Python использует Pyscard - PullRequest
1 голос
/ 03 июня 2019

Я работаю над программой на Python, которая распознает карту Mifare с помощью tkinter и записывает значение на карту.

Моя текущая программа недостаточна, но работает хорошо.Тем не менее, периодически происходит сбой при обновлении двоичного блока на карте.После сбоя все двоичные блоки меняются на 0 или 255.

Я не могу понять это явление.

Сбой считывателя, но карта уже изменилась.

Iхотите устранить причину симптома и симптом.Справка.

Прикрепите источник.

  • Во время сбоя

подключение к ACS ACR122U 00 00

FF CA 00 00 04 - получить идентификатор

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 AA55 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 управление зуммером

[] 9000 - успех управления зуммером

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 - получение идентификатора

DB 96 AE 52 90 00

FF 82 00 00 06 05 00 00 0000 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 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.

...