我正在使用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。