Python 读写NFC Ntag21x标签 支持Windows、linux系统

#发卡器介绍:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.2141789eoDdZ7K&id=615391857885icon-default.png?t=N7T8https://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_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vx_13822155058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值