Я работаю над программой на 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.