#发卡器介绍:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.2141789eoDdZ7K&id=615391857885https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.2141789eoDdZ7K&id=615391857885
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,QMessageBox
from PyQt5.QtGui import QFont
from Ntag21xDemo 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_init.clicked.connect(self.pb_init_clicked)
self.pb_easy_read.clicked.connect(self.pb_easy_read_clicked)
self.pb_easy_write.clicked.connect(self.pb_easy_write_clicked)
self.pb_request.clicked.connect(self.pb_request_clicked)
self.pb_read4page.clicked.connect(self.pb_read4page_clicked)
self.pb_write1page.clicked.connect(self.pb_write1page_clicked)
self.pb_auth.clicked.connect(self.pb_auth_clicked)
self.pb_getver.clicked.connect(self.pb_getver_clicked)
self.pb_getsign.clicked.connect(self.pb_getsign_clicked)
self.pb_getcounter.clicked.connect(self.pb_getcounter_clicked)
self.pb_staticlock.clicked.connect(self.pb_staticlock_clicked)
self.pb_dynamiclock.clicked.connect(self.pb_dynamiclock_clicked)
def DispErrInf(self, Errcode):
if (Errcode == 8):
QMessageBox.critical(self,'提示','错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!', QMessageBox.Yes)
elif (Errcode == 1):
QMessageBox.critical(self,'提示','错误代码:1,0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!', QMessageBox.Yes)
elif (Errcode == 2):
QMessageBox.critical(self,'提示','错误代码:2,第0块已被读出,但1~2块读取失败。卡序列号已被读出来!', QMessageBox.Yes)
elif (Errcode == 3):
QMessageBox.critical(self,'提示','错误代码:3,第0、1块已被读出,但2块读取失败。卡序列号已被读出来!', QMessageBox.Yes)
elif (Errcode == 9):
QMessageBox.critical(self,'提示','错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!', QMessageBox.Yes)
elif (Errcode == 10):
QMessageBox.critical(self,'提示','错误代码:10,该卡可能已被休眠,无法选中卡片!', QMessageBox.Yes)
elif (Errcode == 11):
QMessageBox.critical(self,'提示','错误代码:11,密码装载失败!', QMessageBox.Yes)
elif (Errcode == 12):
QMessageBox.critical(self,'提示','错误代码:12,卡片密码认证失败!', QMessageBox.Yes)
elif (Errcode == 13):
QMessageBox.critical(self,'提示','错误代码:13,读本块失败,可能需要验证密码!', QMessageBox.Yes)
elif (Errcode == 14):
QMessageBox.critical(self,'提示','错误代码:14,写本块失败,可能需要验证密码!', QMessageBox.Yes)
elif (Errcode == 21):
QMessageBox.critical(self,'提示','错误代码:21,没有动态库!', QMessageBox.Yes)
elif (Errcode == 22):
QMessageBox.critical(self,'提示','错误代码:22,动态库或驱动程序异常!', QMessageBox.Yes)
elif (Errcode == 23):
QMessageBox.critical(self,'提示','错误代码:23,驱动程序错误或尚未安装!', QMessageBox.Yes)
elif (Errcode == 24):
QMessageBox.critical(self,'提示','错误代码:24,操作超时,一般是动态库没有反映!', QMessageBox.Yes)
elif (Errcode == 25):
QMessageBox.critical(self,'提示','错误代码:25,发送字数不够!', QMessageBox.Yes)
elif (Errcode == 26):
QMessageBox.critical(self,'提示','错误代码:26,发送的CRC错!', QMessageBox.Yes)
elif (Errcode == 27):
QMessageBox.critical(self,'提示','错误代码:27,接收的字数不够!', QMessageBox.Yes)
elif (Errcode == 28):
QMessageBox.critical(self,'提示','错误代码:28,接收的CRC错!', QMessageBox.Yes)
else:
QMessageBox.critical(self,'提示','未知错误,错误代码:' + str(Errcode), QMessageBox.Yes)
def pb_beep_clicked(self):
status = Objdll.pcdbeep(50) % 256
if (status != 0):
self.DispErrInf(status)
def pb_getdevnum_clicked(self):
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(self, "提示", '设备序列号:' + SerialNum, QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_init_clicked(self):
myctrlword = eval('0x00')
if (self.checkbox_sele.isChecked()):
try:
mypicckeystr=self.lineEdit_authkey.text().strip()
mypicckeybuf=bytes.fromhex(mypicckeystr)
if (len(mypicckeybuf)!=4):
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!' , QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
myctrlword=eval('0x10')
except:
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!', QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
else:
mypicckeybuf=bytes.fromhex("00000000")
if (self.comboBox_init.currentIndex()==0): #开启卡片的密钥保护功能
answ=QMessageBox.question(self,"询问"," 您确定要开启卡片的密码保护功能吗?开启密码保护功能后需记住卡片的新密码,否则卡片将报废!",QMessageBox.Yes | QMessageBox.No)
if (answ==QMessageBox.No):
return
mypiccdata=bytes.fromhex("00 00 00")
mypiccdata=mypiccdata+bytes([self.spinBox_star.value()]) #密码保护起始页地址
myctrlword=myctrlword+eval('0x01')
numread=self.spinBox_num.value()//8 #允许密钥认证失败次数
if (self.checkBox_readen.isChecked()): #读操作 也需认证密码
numread=numread+eval('0x80')
mypiccdata = mypiccdata + bytes([numread])
mypiccdata = mypiccdata + bytes.fromhex("00 00 00")
myctrlword = myctrlword + eval('0x02')
try:
newkeystr=self.lineEdit_newkey.text().strip()
newkeybuf=bytes.fromhex(newkeystr)
if (len(newkeybuf)!=4):
QMessageBox.critical(self, "提示", '新密码输入错误,请输入8位16进制新密码!' , QMessageBox.Yes)
self.lineEdit_newkey.setFocus()
return
mypiccdata = mypiccdata + newkeybuf
mypiccdata = mypiccdata + bytes.fromhex("16 16 00 00")
myctrlword=myctrlword + eval('0x04')
except:
QMessageBox.critical(self, "提示", '新密码输入错误,请输入8位16进制新密码!', QMessageBox.Yes)
self.lineEdit_newkey.setFocus()
return
else: #关闭卡片的密钥保护功能
mypiccdata=bytes.fromhex("00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00")
myctrlword = myctrlword + eval('0x01')
myctrlword = myctrlword + eval('0x02')
mypiccserial=bytes(7)
status = Objdll.piccinit_ntag(myctrlword, mypiccserial, mypicckeybuf, mypiccdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
QMessageBox.information(self, "提示", '7字节卡序号:' + piccserialStr + ',设置卡密码及保护机制成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_easy_read_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号缓冲
mypicckey = bytes(4) # 4个字节的认证密码缓冲
mypiccdata = bytes(48) # 48个字节读卡的数据缓冲
blockadd=self.spinBox_star_rw.value()
blocksize=self.spinBox_num_rw.value()
if (blocksize>12 or blocksize<1):
QMessageBox.critical(self, "提示", '一次最多只能读12页!超过12页请分次读取。', QMessageBox.Yes)
self.spinBox_num_rw.setFocus()
return
if (self.checkbox_sele.isChecked()):
try:
mypicckeystr=self.lineEdit_authkey.text().strip()
mypicckey=bytes.fromhex(mypicckeystr)
if (len(mypicckey)!=4):
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!' , QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
myctrlword=eval('0x10')
except:
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!', QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
else:
mypicckey=bytes.fromhex("00000000")
myctrlword = eval('0x00')
status = Objdll.piccreadex_ntag(myctrlword, mypiccserial, mypicckey, blockadd, blocksize, mypiccdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
ReadInf = ''
for num in range(0, blocksize * 4):
ReadInf = ReadInf + '%02X ' % (mypiccdata[num])
self.plainTextEdit_data.setPlainText(ReadInf)
else:
self.DispErrInf(status)
def pb_easy_write_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号缓冲
mypicckey = bytes(4) # 4个字节的认证密码缓冲
mypiccdata = bytes(48) # 48个字节读卡的数据缓冲
blockadd = self.spinBox_star_rw.value()
blocksize = self.spinBox_num_rw.value()
if (blocksize > 11 or blocksize < 1):
QMessageBox.critical(self, "提示", '一次最多只能读11页!超过11页请分次写入。', QMessageBox.Yes)
self.spinBox_num_rw.setFocus()
return
if (self.checkbox_sele.isChecked()):
try:
mypicckeystr = self.lineEdit_authkey.text().strip()
mypicckey = bytes.fromhex(mypicckeystr)
if (len(mypicckey) != 4):
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!', QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
myctrlword = eval('0x10')
except:
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!', QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
else:
mypicckey = bytes.fromhex("00000000")
myctrlword = eval('0x00')
try:
writestr=self.plainTextEdit_data.toPlainText().strip()
writebuf=bytes.fromhex(writestr)
if (len(writebuf)<blocksize*4):
QMessageBox.critical(self,"询问","写卡数据不足 %d" %(blocksize)+" 块,请输入 %d" %(blocksize*4*2) +" 位16进制写卡数据。", QMessageBox.Yes)
return
except:
QMessageBox.critical(self, "提示", '写卡数据输入错误,请输入正确的16进制写卡数据!', QMessageBox.Yes)
self.plainTextEdit_data.setFocus()
return
status = Objdll.piccwriteex_ntag(myctrlword, mypiccserial, mypicckey, blockadd, blocksize,writebuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
QMessageBox.information(self, "提示", '7字节卡序号:' + piccserialStr + ',写卡成功!', QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_request_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256
if (status == 0):
Objdll.pcdbeep(38)
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
QMessageBox.information(self, "提示", '获取7字节卡序号:' + piccserialStr , QMessageBox.Yes)
else:
self.DispErrInf(status)
def pb_read4page_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号缓冲
mypiccdata = bytes(16) # 16个字节读卡的数据缓冲
ReadPageBegin = self.spinBox_star_rw.value() # 起始页地址
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
status = Objdll.piccread_ul(ReadPageBegin, mypiccdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
piccdataStr = ''
for num in range(0, len(mypiccdata)):
piccdataStr = piccdataStr + '%02X ' % (mypiccdata[num])
self.plainTextEdit_data.setPlainText(piccdataStr)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_write1page_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号
WritePage = self.spinBox_star_rw.value() # 改写页地址
try:
writestr=self.plainTextEdit_data.toPlainText().strip()
writebuf=bytes.fromhex(writestr)
if (len(writebuf)<4):
QMessageBox.critical(self,"询问","写卡数据不足 1 块,请输入8位16进制写卡数据。", QMessageBox.Yes)
return
except:
QMessageBox.critical(self, "提示", '写卡数据输入错误,请输入正确的16进制写卡数据!', QMessageBox.Yes)
self.plainTextEdit_data.setFocus()
return
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
status = Objdll.piccwrite_ul(WritePage, writebuf) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(self,'提示','改写块%d内数据成功!' % (WritePage), QMessageBox.Yes)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_auth_clicked(self):
try:
mypicckeystr = self.lineEdit_authkey.text().strip()
mypicckey = bytes.fromhex(mypicckeystr)
if (len(mypicckey) != 4):
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!', QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
myctrlword = eval('0x10')
except:
QMessageBox.critical(self, "提示", '认证密码输入错误,请输入8位16进制认证密码!', QMessageBox.Yes)
self.lineEdit_authkey.setFocus()
return
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
mypiccntagpack = bytes([0, 0]) # 返回的确认码
status = Objdll.piccauthkey_ntag(mypicckey,mypiccntagpack) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(self, '提示','卡密码认证成功!确认码为:%02x%02x' % (mypiccntagpack[0], mypiccntagpack[1]), QMessageBox.Yes)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_getver_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
mypiccversiondata = bytes(8) # 卡版本及型号缓冲
status = Objdll.piccgetversion_ntag(mypiccversiondata) % 256
if (status == 0):
Objdll.pcdbeep(38)
version=''
for num in range(0, len(mypiccversiondata)):
version = version + '%02X ' % (mypiccversiondata[num])
QMessageBox.information(self, '提示', '卡版本型号:'+ version, QMessageBox.Yes)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_getsign_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
piccsigdata = bytes(32) # 卡验签信息缓冲
status = Objdll.piccreadsig_ntag(piccsigdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
version=''
for num in range(0, len(piccsigdata)):
version = version + '%02X ' % (piccsigdata[num])
QMessageBox.information(self, '提示', '卡签字信息:'+ version, QMessageBox.Yes)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_getcounter_clicked(self):
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
mypicccntdata = bytes(3) # 卡卡操作计数器缓冲
status = Objdll.piccreadsig_ntag(mypicccntdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
version = ''
for num in range(0, len(mypicccntdata)):
version = version + '%02X ' % (mypicccntdata[num])
QMessageBox.information(self, '提示', '卡操作的单向计数器:' + version, QMessageBox.Yes)
elif (status == 13):
QMessageBox.critical(self, '提示', '可能是计数器功能尚未启用或卡片不支持计数功能!' , QMessageBox.Yes)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_staticlock_clicked(self):
answ=QMessageBox.question(self,'询问','你确定要开启卡片的静态锁吗 ?锁定后3-15页数据不能再次修改!',QMessageBox.Yes|QMessageBox.No)
if (answ==QMessageBox.No):
return
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
mypicclockdata = bytes.fromhex("00 00 F9 00") # 卡锁定状态
status = Objdll.picclock_ntag(0,mypicclockdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(self, '提示', '3~15页静态锁数据写入成功!' , QMessageBox.Yes)
else:
self.DispErrInf(status)
else:
self.DispErrInf(status)
def pb_dynamiclock_clicked(self):
answ=QMessageBox.question(self,'询问','你确定要开启卡片的动态锁吗 ?锁定后16及以后的页数据不能再次修改!',QMessageBox.Yes|QMessageBox.No)
if (answ==QMessageBox.No):
return
mypiccserial = bytes(7) # 7个字节卡序列号
status = Objdll.piccrequest_ul(mypiccserial) % 256 # 寻卡并读卡的序列号
if (status == 0):
piccserialStr = ''
for num in range(0, len(mypiccserial)):
piccserialStr = piccserialStr + '%02X' % (mypiccserial[num])
self.lineEdit_uid.setText(piccserialStr)
mypicclockdata = bytes.fromhex("01 01 00 00") # 卡锁定状态
status = Objdll.picclock_ntag(1,mypicclockdata) % 256
if (status == 0):
Objdll.pcdbeep(38)
QMessageBox.information(self, '提示', '16之后页动态锁数据写入成功!' , QMessageBox.Yes)
else:
self.DispErrInf(status)
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("Ntag21x Python Demo")
mainWindow.show()
mainWindow.label_7.setStyleSheet("color: red;")
mainWindow.label_8.setStyleSheet("color: red;")
mainWindow.label_9.setStyleSheet("color: red;")
font = QFont()
font.setFamily('Arial') # 设置字体名称
font.setPointSize(8)
if sys.platform == 'linux' or sys.platform == 'mac':
# Linux加载当前目录下的so库
dllfile = sys.path[0] + '/libOURMIFARE.so'
Objdll = ctypes.cdll.LoadLibrary(dllfile)
else:
# windows系统加载当前目录下的DLL库
dllfile = sys.path[0] + '\OUR_MIFARE.dll'
Objdll = ctypes.windll.LoadLibrary(dllfile)
sys.exit(app.exec_())
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Ntag21xDemo.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(712, 652)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pb_beep = QtWidgets.QPushButton(self.centralwidget)
self.pb_beep.setGeometry(QtCore.QRect(7, 8, 140, 31))
self.pb_beep.setObjectName("pb_beep")
self.pb_getdevnum = QtWidgets.QPushButton(self.centralwidget)
self.pb_getdevnum.setGeometry(QtCore.QRect(147, 8, 260, 31))
self.pb_getdevnum.setObjectName("pb_getdevnum")
self.lineEdit_uid = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_uid.setGeometry(QtCore.QRect(160, 253, 161, 21))
self.lineEdit_uid.setObjectName("lineEdit_uid")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(288, 91, 111, 16))
font = QtGui.QFont()
font.setPointSize(10)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.spinBox_star = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_star.setGeometry(QtCore.QRect(227, 87, 51, 22))
self.spinBox_star.setMaximum(255)
self.spinBox_star.setProperty("value", 30)
self.spinBox_star.setObjectName("spinBox_star")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(206, 91, 16, 16))
font = QtGui.QFont()
font.setPointSize(10)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(56, 196, 101, 20))
font = QtGui.QFont()
font.setPointSize(10)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(8, 253, 150, 20))
font = QtGui.QFont()
font.setPointSize(10)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.spinBox_num = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_num.setGeometry(QtCore.QRect(614, 115, 70, 22))
self.spinBox_num.setMaximum(255)
self.spinBox_num.setProperty("value", 0)
self.spinBox_num.setObjectName("spinBox_num")
self.plainTextEdit_data = QtWidgets.QPlainTextEdit(self.centralwidget)
self.plainTextEdit_data.setGeometry(QtCore.QRect(160, 282, 530, 100))
self.plainTextEdit_data.setObjectName("plainTextEdit_data")
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setGeometry(QtCore.QRect(83, 283, 70, 20))
font = QtGui.QFont()
font.setPointSize(10)
self.label_6.setFont(font)
self.label_6.setObjectName("label_6")
self.checkbox_sele = QtWidgets.QCheckBox(self.centralwidget)
self.checkbox_sele.setGeometry(QtCore.QRect(19, 50, 320, 19))
self.checkbox_sele.setObjectName("checkbox_sele")
self.lineEdit_authkey = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_authkey.setGeometry(QtCore.QRect(334, 48, 71, 21))
self.lineEdit_authkey.setObjectName("lineEdit_authkey")
self.comboBox_init = QtWidgets.QComboBox(self.centralwidget)
self.comboBox_init.setGeometry(QtCore.QRect(50, 89, 150, 22))
self.comboBox_init.setObjectName("comboBox_init")
self.comboBox_init.addItem("")
self.comboBox_init.addItem("")
self.checkBox_readen = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_readen.setGeometry(QtCore.QRect(404, 89, 211, 19))
self.checkBox_readen.setObjectName("checkBox_readen")
self.lineEdit_newkey = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_newkey.setGeometry(QtCore.QRect(613, 87, 71, 21))
self.lineEdit_newkey.setObjectName("lineEdit_newkey")
self.label_7 = QtWidgets.QLabel(self.centralwidget)
self.label_7.setGeometry(QtCore.QRect(112, 119, 501, 20))
font = QtGui.QFont()
font.setPointSize(10)
self.label_7.setFont(font)
self.label_7.setObjectName("label_7")
self.pb_init = QtWidgets.QPushButton(self.centralwidget)
self.pb_init.setGeometry(QtCore.QRect(15, 143, 670, 30))
self.pb_init.setObjectName("pb_init")
self.pb_easy_read = QtWidgets.QPushButton(self.centralwidget)
self.pb_easy_read.setGeometry(QtCore.QRect(465, 212, 221, 31))
self.pb_easy_read.setObjectName("pb_easy_read")
self.spinBox_star_rw = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_star_rw.setGeometry(QtCore.QRect(160, 193, 51, 22))
self.spinBox_star_rw.setMaximum(255)
self.spinBox_star_rw.setProperty("value", 4)
self.spinBox_star_rw.setObjectName("spinBox_star_rw")
self.spinBox_num_rw = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_num_rw.setGeometry(QtCore.QRect(160, 223, 51, 22))
self.spinBox_num_rw.setMaximum(255)
self.spinBox_num_rw.setProperty("value", 11)
self.spinBox_num_rw.setObjectName("spinBox_num_rw")
self.label_8 = QtWidgets.QLabel(self.centralwidget)
self.label_8.setGeometry(QtCore.QRect(96, 226, 61, 16))
font = QtGui.QFont()
font.setPointSize(10)
self.label_8.setFont(font)
self.label_8.setObjectName("label_8")
self.pb_easy_write = QtWidgets.QPushButton(self.centralwidget)
self.pb_easy_write.setGeometry(QtCore.QRect(465, 246, 221, 31))
self.pb_easy_write.setObjectName("pb_easy_write")
self.pb_request = QtWidgets.QPushButton(self.centralwidget)
self.pb_request.setGeometry(QtCore.QRect(427, 387, 260, 31))
self.pb_request.setObjectName("pb_request")
self.pb_read4page = QtWidgets.QPushButton(self.centralwidget)
self.pb_read4page.setGeometry(QtCore.QRect(428, 418, 260, 31))
self.pb_read4page.setObjectName("pb_read4page")
self.pb_write1page = QtWidgets.QPushButton(self.centralwidget)
self.pb_write1page.setGeometry(QtCore.QRect(427, 449, 260, 31))
self.pb_write1page.setObjectName("pb_write1page")
self.pb_auth = QtWidgets.QPushButton(self.centralwidget)
self.pb_auth.setGeometry(QtCore.QRect(428, 480, 260, 31))
self.pb_auth.setObjectName("pb_auth")
self.pb_getver = QtWidgets.QPushButton(self.centralwidget)
self.pb_getver.setGeometry(QtCore.QRect(427, 511, 260, 31))
self.pb_getver.setObjectName("pb_getver")
self.pb_getsign = QtWidgets.QPushButton(self.centralwidget)
self.pb_getsign.setGeometry(QtCore.QRect(427, 542, 260, 31))
self.pb_getsign.setObjectName("pb_getsign")
self.pb_getcounter = QtWidgets.QPushButton(self.centralwidget)
self.pb_getcounter.setGeometry(QtCore.QRect(427, 573, 261, 31))
self.pb_getcounter.setObjectName("pb_getcounter")
self.pb_staticlock = QtWidgets.QPushButton(self.centralwidget)
self.pb_staticlock.setGeometry(QtCore.QRect(10, 542, 321, 31))
self.pb_staticlock.setObjectName("pb_staticlock")
self.pb_dynamiclock = QtWidgets.QPushButton(self.centralwidget)
self.pb_dynamiclock.setGeometry(QtCore.QRect(10, 576, 321, 31))
self.pb_dynamiclock.setObjectName("pb_dynamiclock")
self.label_9 = QtWidgets.QLabel(self.centralwidget)
self.label_9.setGeometry(QtCore.QRect(471, 183, 101, 20))
font = QtGui.QFont()
font.setPointSize(10)
self.label_9.setFont(font)
self.label_9.setObjectName("label_9")
self.label_10 = QtWidgets.QLabel(self.centralwidget)
self.label_10.setGeometry(QtCore.QRect(14, 517, 151, 20))
font = QtGui.QFont()
font.setPointSize(10)
self.label_10.setFont(font)
self.label_10.setObjectName("label_10")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 712, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.comboBox_init.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Ntag2_Qt_Demo"))
self.pb_beep.setText(_translate("MainWindow", "驱动读写器发出响声"))
self.pb_getdevnum.setText(_translate("MainWindow", "读出设备全球唯一的设备编号,作为加密狗用"))
self.label_2.setText(_translate("MainWindow", "页开始有密码保护,"))
self.label_3.setText(_translate("MainWindow", "从"))
self.label_4.setText(_translate("MainWindow", "读写起始页地址:"))
self.label_5.setText(_translate("MainWindow", "卡片全球唯一标识符UID:"))
self.label_6.setText(_translate("MainWindow", "读写卡数据:"))
self.checkbox_sele.setText(_translate("MainWindow", "选择先认证卡密码再继续以下的读写卡操作,认证密码:"))
self.lineEdit_authkey.setText(_translate("MainWindow", "12345678"))
self.comboBox_init.setItemText(0, _translate("MainWindow", "开启卡片密码保护功能"))
self.comboBox_init.setItemText(1, _translate("MainWindow", "取消卡片密码保护功能"))
self.checkBox_readen.setText(_translate("MainWindow", "选择开启读操作密码保护,新密码:"))
self.lineEdit_newkey.setText(_translate("MainWindow", "12345678"))
self.label_7.setText(_translate("MainWindow", "允许密码认证错误次数,当密码认证失败次数大于设置值卡片将报废,0为不限制次数:"))
self.pb_init.setText(_translate("MainWindow", "按以上参数 设置卡片认证密码及读写保护机制,新卡出厂时一般没有开启此机制可以直接读写。"))
self.pb_easy_read.setText(_translate("MainWindow", "轻松读卡,每次最多可读取12页数据"))
self.label_8.setText(_translate("MainWindow", "读写页数:"))
self.pb_easy_write.setText(_translate("MainWindow", "轻松写卡,每次最多可写入11页数据"))
self.pb_request.setText(_translate("MainWindow", "读取卡片唯一标识符UID"))
self.pb_read4page.setText(_translate("MainWindow", "从起始页开始读取连续的4个页数据"))
self.pb_write1page.setText(_translate("MainWindow", "写1页数据"))
self.pb_auth.setText(_translate("MainWindow", "认证卡片密码"))
self.pb_getver.setText(_translate("MainWindow", "读取卡片的版本号及型号"))
self.pb_getsign.setText(_translate("MainWindow", "读取卡片的签名信息,可验证卡是否NXP原厂"))
self.pb_getcounter.setText(_translate("MainWindow", "读取卡片单向计数器值"))
self.pb_staticlock.setText(_translate("MainWindow", "静态锁,锁定3-15页,锁死后数据无法再次修改"))
self.pb_dynamiclock.setText(_translate("MainWindow", "动态锁,锁定16页以后的页,锁死后数据无法再次修改"))
self.label_9.setText(_translate("MainWindow", "常用指令"))
self.label_10.setText(_translate("MainWindow", "危险指令,请谨慎使用!"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())