Python调用带指针的DLL函数读写15693卡

#QQ:954486673

#微信:13822155058

#发卡器介绍: https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.13.4dfa24daKyMsZV&id=562087272462icon-default.png?t=N7T8https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.13.4dfa24daKyMsZV&id=562087272462

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_())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

vx_13822155058

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

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

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

打赏作者

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

抵扣说明:

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

余额充值