#QQ:954486673
#微信:13822155058
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,QMessageBox
from mainwindow import Ui_MainWindow
import sys
import struct # struct的pack函数把任意数据类型变成字符串
import ctypes # 调用DLL动态库要有这个引用
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.pb_beep.clicked.connect(self.pb_beep_Clicked)
self.pb_getdevnum.clicked.connect(self.pb_getdevnum_Clicked)
self.pb_easyread.clicked.connect(self.pb_easyread_Clicked)
self.pb_easywrite.clicked.connect(self.pb_easywrite_Clicked)
self.pb_search1.clicked.connect(self.pb_search1_Clicked)
self.pb_quiet.clicked.connect(self.pb_quiet_Clicked)
self.pb_select.clicked.connect(self.pb_select_Clicked)
self.pb_restare.clicked.connect(self.pb_restare_Clicked)
self.pb_searchall.clicked.connect(self.pb_searchall_Clicked)
self.pb_afi.clicked.connect(self.pb_afi_Clicked)
self.pb_lockafi.clicked.connect(self.pb_lockafi_Clicked)
self.pb_lockdsfid.clicked.connect(self.pb_lockdsfid_Clicked)
self.pb_dsfid.clicked.connect(self.pb_dsfid_Clicked)
self.pb_lockdata.clicked.connect(self.pb_lockdata_Clicked)
self.pb_read.clicked.connect(self.pb_read_Clicked)
self.pb_write.clicked.connect(self.pb_write_Clicked)
self.pb_systeminf.clicked.connect(self.pb_systeminf_Clicked)
self.pb_writeUid.clicked.connect(self.pb_writeUid_Clicked)
self.pb_secure.clicked.connect(self.pb_secure_Clicked)
self.comboBox_uid.currentIndexChanged.connect(self.comboBox_uid_Changed)
def LoadLibrary(self):
import sys
if sys.platform == 'linux' or sys.platform == 'mac':
# Linux加载当前目录下的so库
dllfile = sys.path[0] + '/libOURMIFARE.so'
Objdll = ctypes.cdll.LoadLibrary(dllfile)
return Objdll
else:
# windows系统加载当前目录下的DLL库
dllfile = sys.path[0] + '\OUR_MIFARE.dll'
Objdll = ctypes.windll.LoadLibrary(dllfile)
Objdll = ctypes.WinDLL(dllfile)
return Objdll
def DispErrInf(self,Errcode):
if (Errcode == 8):
QMessageBox.critical(None, "提示", '错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!', QMessageBox.Yes)
elif (Errcode == 1):
QMessageBox.warning(None, "提示",'错误代码:1,0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!', QMessageBox.Yes)
elif (Errcode == 2):
QMessageBox.warning(None, "提示",'错误代码:2,第0块已被读出,但1~2块读取失败。卡序列号已被读出来!', QMessageBox.Yes)
elif (Errcode == 3):
QMessageBox.warning(None, "提示",'错误代码:3,第0、1块已被读出,但2块读取失败。卡序列号已被读出来!', QMessageBox.Yes)
elif (Errcode == 9):
QMessageBox.warning(None, "提示",'错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!', QMessageBox.Yes)
elif (Errcode == 10):
QMessageBox.warning(None, "提示",'错误代码:10,该卡可能已被休眠,无法选中卡片!', QMessageBox.Yes)
elif (Errcode == 11):
QMessageBox.warning(None, "提示",'错误代码:11,密码装载失败!', QMessageBox.Yes)
elif (Errcode == 12):
QMessageBox.warning(None, "提示",'错误代码:12,卡片密码认证失败!', QMessageBox.Yes)
elif (Errcode == 13):
QMessageBox.warning(None, "提示",'错误代码:13,读本块失败,原因是刷卡太快或本块所对应的区还没通过密码认证!', QMessageBox.Yes)
elif (Errcode == 14):
QMessageBox.warning(None, "提示",'错误代码:14,写本块失败,原因是刷卡太快或本块所对应的区还没通过密码认证!', QMessageBox.Yes)
elif (Errcode == 21):
QMessageBox.critical(None, "提示",'错误代码:21,没有动态库!', QMessageBox.Yes)
elif (Errcode == 22):
QMessageBox.critical(None, "提示",'错误代码:22,动态库或驱动程序异常!', QMessageBox.Yes)
elif (Errcode == 23):
QMessageBox.critical(None, "提示",'错误代码:23,驱动程序错误或发卡器尚未连接!', QMessageBox.Yes)
elif (Errcode == 24):
QMessageBox.critical(None, "提示",'错误代码:24,操作超时,一般是动态库没有反映!', QMessageBox.Yes)
elif (Errcode == 25):
QMessageBox.warning(None, "提示",'错误代码:25,发送字数不够!', QMessageBox.Yes)
elif (Errcode == 26):
QMessageBox.warning(None, "提示",'错误代码:26,发送的CRC错!', QMessageBox.Yes)
elif (Errcode == 27):
QMessageBox.warning(None, "提示",'错误代码:27,接收的字数不够!', QMessageBox.Yes)
elif (Errcode == 28):
QMessageBox.warning(None, "提示",'错误代码:28,接收的CRC错!', QMessageBox.Yes)
elif (Errcode == 29):
QMessageBox.critical(None, "提示",'错误代码:29,此块无法读取!', QMessageBox.Yes)
elif (Errcode == 40):
QMessageBox.critical(None, "提示",'错误代码:40,使卡进入静止(Quiet)状态失败!', QMessageBox.Yes)
elif (Errcode == 41):
QMessageBox.critical(None, "提示",'错误代码:41,选中卡操作失败!', QMessageBox.Yes)
elif (Errcode == 42):
QMessageBox.critical(None, "提示",'错误代码:42,让卡从静止中重起准备失败!', QMessageBox.Yes)
elif (Errcode == 44):
QMessageBox.critical(None, "提示",'错误代码:44,一次写块不能超过12块!', QMessageBox.Yes)
elif (Errcode == 46):
QMessageBox.critical(None, "提示",'错误代码:46,此块无法写入!', QMessageBox.Yes)
else:
QMessageBox.critical(None, "提示",'未知错误,错误代码:' + str(Errcode), QMessageBox.Yes)
def comboBox_uid_Changed(self):
infostr=self.comboBox_uid.currentText()
if (len(infostr)>20):
dsfid=infostr[6:8]
uid=infostr[-16:]
self.lineEdit_uid.setText(uid)
self.lineEdit_dsfid.setText(dsfid)
def pb_beep_Clicked(self):
Objdll=self.LoadLibrary()
status = Objdll.pcdbeep(50) % 256
if (status!=0):
self.DispErrInf(status)
def pb_getdevnum_Clicked(self):
Objdll=self.LoadLibrary()
devno = bytes(4) # 声明4个字节缓冲
status = Objdll.pcdgetdevicenumber(devno) % 256
if (status == 0):
Objdll.pcdbeep(38)
SerialNum = ''
for num in range(0, len(devno)):
SerialNum = SerialNum + '%02X' % (devno[num])
if (num < len(devno) - 1):
SerialNum = SerialNum + '-'
QMessageBox.information(None, "提示", "发卡器编号: " + SerialNum , QMessageBox.Yes )
else:
self.DispErrInf(status)
def pb_easyread_Clicked(self):
myctrlword = 0 # 读写控制字,一般取0 就行了
mypiccserial = bytes(8) # 8字节卡序列号缓冲
mypiccdata = bytes(255) # 读卡数据缓冲,一个扇区共255个字节
startblock=self.spinBox_star.value()
blocknum=self.spinBox_num.value()
self.lineEdit_uid.setText("")
self.plainTextEdit_data.setPlainText("")
try:
afi= eval('0x'+self.lineEdit_afi.text()) #应用标识AFI,取值 00 表示可操作全部不同应用标识的标签
except:
QMessageBox.warning(None, "提示", '请输入2位16进制AFI!', QMessageBox.Yes)
self.lineEdit_afi.setFocus()
return
if (blocknum>12):
QMessageBox.warning(None, "提示", '一次最多只能读取12块数据!', QMessageBox.Yes)
self.spinBox_num.setValue(12)
return
Objdll = self.LoadLibrary()
status = Objdll.iso15693readex(myctrlword, afi, startblock, blocknum, mypiccserial, mypiccdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
SerialNum = ''
for num in range(0, 8):
SerialNum = SerialNum + '%02X' % (mypiccserial[7-num])
self.lineEdit_uid.setText(SerialNum)
piccdataStr = ''
for num in range(1, mypiccdata[0] + 1):
piccdataStr = piccdataStr + '%02X ' % (mypiccdata[num])
self.plainTextEdit_data.setPlainText(piccdataStr)
QMessageBox.information(None, "提示", '读卡成功,卡片UID:'+SerialNum, QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_easywrite_Clicked(self):
myctrlword = 0 # 读写控制字,一般取0 就行了
mypiccserial = bytes(8) # 8字节卡序列号缓冲
mypiccdata = bytes(255) # 读卡数据缓冲,一个扇区共255个字节
startblock = self.spinBox_star.value()
blocknum = self.spinBox_num.value()
cardtype=self.comboBox_cardtype.currentIndex()
writestr=self.plainTextEdit_data.toPlainText()
writelen=0
try:
afi= eval('0x'+self.lineEdit_afi.text()) #应用标识AFI,取值 00 表示可操作全部不同应用标识的标签
except:
QMessageBox.warning(None, "提示", '请输入2位16进制AFI!', QMessageBox.Yes)
self.lineEdit_afi.setFocus()
return
if (cardtype==0 and blocknum>12):
QMessageBox.warning(None, "提示", '每块4字节的卡片一次最多只能写12块数据!', QMessageBox.Yes)
self.spinBox_num.setValue(12)
return
elif (cardtype==1 and blocknum>1):
QMessageBox.warning(None, "提示", '每块8字节的卡片一次最多只能写1块数据!', QMessageBox.Yes)
self.spinBox_num.setValue(1)
return
if (cardtype==0):
writelen=blocknum*4
elif (cardtype==1):
writelen = blocknum * 8
else:
writelen = blocknum * 32
writestr = self.plainTextEdit_data.toPlainText().strip()
bytestr = writestr.split(' ')
try:
for num in range(0, len(bytestr)):
bytenum = eval('0x' + bytestr[num])
writebuf = bytes.fromhex(writestr)
except:
QMessageBox.warning(None, "提示", '请输入正确的16进制写卡数据!', QMessageBox.Yes)
self.plainTextEdit_data.setFocus()
return
if (len(writebuf) < writelen):
res = QMessageBox.question(None, "警告", " 写入数据不足,是否后面加0继续写入?", QMessageBox.Yes | QMessageBox.No)
if (QMessageBox.Yes == res):
while (len(writebuf) < writelen):
writebuf = writebuf + bytes([0])
else:
return
mypiccdata=bytes([writelen])+writebuf #写入信息的第一个字节是本次要写入的长度
Objdll = self.LoadLibrary()
status = Objdll.iso15693writeex(myctrlword, afi, startblock, blocknum, mypiccserial, mypiccdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
SerialNum = ''
for num in range(0, 8):
SerialNum = SerialNum + '%02X' % (mypiccserial[7 - num])
self.lineEdit_uid.setText(SerialNum)
QMessageBox.information(None, "提示", '写卡成功,卡片UID:' + SerialNum, QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_search1_Clicked(self):
self.lineEdit_flags.setText('36')
flags = eval('0x36') # 操作卡片的标识字,详细说明参看文档
masklen = eval('0x00') # 掩码长度,有一张卡最大为40,一张卡为43,理论上为64
maskuidbuf = bytes(8) # 卡号掩码,一般可以不理这个参数
uidbuf = bytes(9) # 卡数据缓冲
try:
afi= eval('0x'+self.lineEdit_afi.text()) #应用标识AFI,取值 00 表示可操作全部不同应用标识的标签
except:
QMessageBox.warning(None, "提示", '请输入2位16进制AFI!', QMessageBox.Yes)
self.lineEdit_afi.setFocus()
return
self.comboBox_uid.clear()
self.lineEdit_uid.setText("")
Objdll = self.LoadLibrary()
status = Objdll.iso15693inventory(flags, afi, masklen, maskuidbuf, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
DSFID = '%02X' % (uidbuf[0])
SerialNum = ''
for num in range(1, 9):
SerialNum = SerialNum + '%02X' % (uidbuf[9 - num])
self.comboBox_uid.addItem('DSFID:' + DSFID + ' UID:' + SerialNum)
QMessageBox.information(None, "提示", '寻卡成功,卡片UID:' + SerialNum, QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_quiet_Clicked(self):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要静止标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要静止标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf= uidbufLH[::-1] #这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693stayquiet(flags, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '标签已静止并休眠!' , QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_select_Clicked(self):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要选用标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要选用标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693Select(flags, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '感应区上的标签已选定成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_restare_Clicked(self):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要重启标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要重启标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693resettoready(flags, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '感应区上已静止的卡片已重新起用!' , QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_searchall_Clicked(self):
self.lineEdit_flags.setText('16')
flags = eval('0x16') # 操作卡片的标识字,详细说明参看文档
masklen = eval('0x00') # 掩码长度,有一张卡最大为40,一张卡为43,理论上为64
maskuidbuf = bytes(8) # 卡号掩码,一般可以不理这个参数
uidbuf = bytes(81) # 卡数据缓冲
revlen = bytes(1)
try:
afi= eval('0x'+self.lineEdit_afi.text()) #应用标识AFI,取值 00 表示可操作全部不同应用标识的标签
except:
QMessageBox.warning(None, "提示", '请输入2位16进制AFI!', QMessageBox.Yes)
self.lineEdit_afi.setFocus()
return
self.comboBox_uid.clear()
self.lineEdit_uid.setText("")
Objdll = self.LoadLibrary()
status = Objdll.iso15693inventory16(flags, afi, masklen,maskuidbuf,revlen,uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
j = 0
while j < revlen[0]:
DSFID='%02X' % (uidbuf[j])
UID='%02X%02X%02X%02X%02X%02X%02X%02X' % (uidbuf[j + 8], uidbuf[j + 7], uidbuf[j + 6], uidbuf[j + 5], uidbuf[j + 4], uidbuf[j + 3], uidbuf[j + 2],uidbuf[j + 1])
self.comboBox_uid.addItem('DSFID:'+DSFID+' UID:'+UID)
j = j + 9
else:
self.DispErrInf(status)
def pb_afi_Clicked(self):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
try:
afi= eval('0x'+self.lineEdit_afi.text()) #新应用标识AFI
except:
QMessageBox.warning(None, "提示", '请输入2位16进制AFI!', QMessageBox.Yes)
self.lineEdit_afi.setFocus()
return
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要修改AFI标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693writeafi(flags,afi, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '写AIF操作成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_lockafi_Clicked(self):
res = QMessageBox.question(None, "警告", " 锁定应用标识AFI后,将不可再次修改!您确定要继续操作吗?", QMessageBox.Yes | QMessageBox.No)
if (QMessageBox.Yes == res):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要修改DSFID标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693lockafi(flags, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '锁定标签应用标识AFI操作成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_lockdsfid_Clicked(self):
res = QMessageBox.question(None, "警告", " 锁定数据存储格式DSFID后,将不可再次修改!您确定要继续操作吗?", QMessageBox.Yes | QMessageBox.No)
if (QMessageBox.Yes == res):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要修改DSFID标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693lockdsfid(flags, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '锁定标签数据存储格式DSFID操作成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_dsfid_Clicked(self):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
try:
DSFID = eval('0x'+self.lineEdit_dsfid.text()) # 新DSFID
except:
QMessageBox.warning(None, "提示", '请输入2位16进制DSFID!', QMessageBox.Yes)
self.lineEdit_dsfid.setFocus()
return
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要修改DSFID标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693writedsfid(flags, DSFID, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '写DSFID操作成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_lockdata_Clicked(self):
res = QMessageBox.question(None, "警告", " 锁定数据块后,标签数据将只能读取、不可再次修改!您确定要继续操作吗?", QMessageBox.Yes | QMessageBox.No)
if (QMessageBox.Yes == res):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
startblock = self.spinBox_star.value()
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要修改DSFID标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693lockblock(flags,startblock, uidbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '数据块锁定成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_read_Clicked(self):
revlen=bytes(1)
revbuf=bytes(255)
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
startblock = self.spinBox_star.value()
blocknum = startblock+self.spinBox_num.value()
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制标签UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
self.plainTextEdit_data.setPlainText('')
blockdata=''
Objdll = self.LoadLibrary()
while(startblock<blocknum):
status = Objdll.iso15693readblock(flags, startblock, 1, uidbuf, revlen, revbuf) % 256
if (status == 0):
j=0
while(j<revlen[0]):
blockdata=blockdata+'%02X ' %(revbuf[j])
j=j+1
startblock=startblock+1
else:
blocknum=startblock-1
if (startblock==blocknum):
Objdll.pcdbeep(38)
self.plainTextEdit_data.setPlainText(blockdata)
QMessageBox.information(None, "提示", '读卡成功!', QMessageBox.Yes)
else:
QMessageBox.critical(None, "提示", '在读取第 :%d' %(startblock) +' 块时返回错误代码:%d' %(status), QMessageBox.Yes)
def pb_write_Clicked(self):
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
startblock = self.spinBox_star.value()
blocknum = self.spinBox_num.value()
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制标签UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
writestr = self.plainTextEdit_data.toPlainText().strip()
bytestr = writestr.split(' ')
try:
for num in range(0, len(bytestr)):
bytenum=eval('0x'+bytestr[num])
writebuf = bytes.fromhex(writestr)
except:
QMessageBox.warning(None, "提示", '请输入正确的16进制写卡数据!', QMessageBox.Yes)
self.plainTextEdit_data.setFocus()
return
if (self.comboBox_cardtype.currentIndex()==0):
eachblocksize=4
elif (self.comboBox_cardtype.currentIndex()==1):
eachblocksize = 8
else:
eachblocksize = 32
if (len(writebuf)<blocknum*eachblocksize):
res = QMessageBox.question(None, "警告", " 写入数据不足,是否后面加0继续写入?", QMessageBox.Yes | QMessageBox.No)
if (QMessageBox.Yes == res):
while (len(writebuf)<blocknum*eachblocksize):
writebuf=writebuf+bytes([0])
else:
return
i=0
blocknum=startblock+blocknum
Objdll = self.LoadLibrary()
while(startblock<blocknum):
wbuf=writebuf[i:i+eachblocksize]
status = Objdll.iso15693writeblock(flags, startblock, 1, uidbuf, eachblocksize, wbuf) % 256
if (status==0):
startblock=startblock+1
i=i+eachblocksize
else:
blocknum=startblock-1
if (startblock==blocknum):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '写卡成功!', QMessageBox.Yes)
else:
QMessageBox.critical(None, "提示", '在写第 :%d' %(startblock) +' 块时返回错误代码:%d' %(status), QMessageBox.Yes)
def pb_systeminf_Clicked(self):
revlen=bytes(1)
revbuf=bytes(255)
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要选用标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要选用标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
self.plainTextEdit_data.setPlainText('')
Objdll = self.LoadLibrary()
status = Objdll.iso15693readinfo(flags, uidbuf,revlen,revbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
sysinfo = ''
for num in range(0, revlen[0]):
sysinfo = sysinfo + '%02X ' % (revbuf[num])
self.plainTextEdit_data.setPlainText(sysinfo)
QMessageBox.information(None, "提示", '读取卡片系统信息成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_writeUid_Clicked(self):
myctrlword = 0 # 读写控制字,一般取0 就行了
olduid=bytes(8)
newuid=bytes(8)
try:
afi = eval('0x' + self.lineEdit_afi.text()) # 新应用标识AFI
except:
QMessageBox.warning(None, "提示", '请输入2位16进制AFI!', QMessageBox.Yes)
self.lineEdit_afi.setFocus()
return
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要操作标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请输入16位16进制要写入的标签UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
newuid = uidbufLH[::-1] # 这里注意传入的UID高位在前
Objdll = self.LoadLibrary()
status = Objdll.iso15693writeuid(myctrlword, afi, olduid,newuid) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(None, "提示", '写AIF操作成功!', QMessageBox.Yes)
elif (status == 45):
QMessageBox.warning(None, "提示", '写UID操作失败,此卡UID不可以改写!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_secure_Clicked(self):
revlen = bytes(1)
revbuf = bytes(255)
self.lineEdit_flags.setText('22')
flags = eval('0x22') # 操作卡片的标识字,详细说明参看文档
startblock = self.spinBox_star.value()
blocknum = self.spinBox_num.value()
uidbufLH = bytes.fromhex(self.lineEdit_uid.text()) # 需要选用标签的UID
if (len(uidbufLH) != 8):
QMessageBox.warning(None, "提示", '请先寻卡或输入16位16进制要选用标签的UID!', QMessageBox.Yes)
self.lineEdit_uid.setFocus()
return
else:
uidbuf = uidbufLH[::-1] # 这里注意传入的UID高位在前
self.plainTextEdit_data.setPlainText('')
Objdll = self.LoadLibrary()
status = Objdll.iso15693readsecuritystate(flags, startblock,blocknum,uidbuf, revlen, revbuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
sysinfo = ''
for num in range(0, revlen[0]):
sysinfo = sysinfo + '%02X ' % (revbuf[num])
self.plainTextEdit_data.setPlainText(sysinfo)
QMessageBox.information(None, "提示", '读取标签块安全状态成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow()
screen = QDesktopWidget().screenGeometry()
size = mainWindow.geometry()
# 获得窗口相关坐标
newLeft = (screen.width() - size.width()) // 2
newTop = (screen.height() - size.height()) // 2
# 移动窗口使其居中
mainWindow.move(newLeft, newTop)
mainWindow.setWindowTitle("ISO15693 tag Python_Demo")
mainWindow.show()
sys.exit(app.exec_())