Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

news2024/11/19 14:40:49

本示例使用的发卡器:https://item.taobao.com/item.htm?id=615391857885&spm=a1z10.5-c.w4002-21818769070.11.60ad789erlonvk         
        近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。近场通信技术是由诺基亚(Nokia)、飞利浦(Philips)和索尼(Sony)共同制定的标准 ,在ISO 18092、ECMA 340和ETSI TS 102 190框架下推动标准化,同时也兼容应用广泛的ISO 14443 、Type-A、ISO 15693、B以及Felica标准非接触式智能卡 的基础架构。

       NDEF 全称 NFC data exchange format 即 nfc 数据交换格式,是一种标准化的数据格式,可用于在任何兼容的NFC设备与另一个NFC设备或标签之间交换信息。数据格式由NDEF消息和NDEF记录组成 。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,QMessageBox
from PyQt5.QtGui import QFont
from NDEFTagTools import Ui_Frame
import sys
import struct  # struct的pack函数把任意数据类型变成字符串
import ctypes  # 调用DLL动态库要有这个引用

#'为防止测试时忘记卡片密码,本系统统一使用密码为 197402020111 ,MifareClassic的密码6字节 ,forumtype2标签的密码是前4个字节,密码为 19740202
oldpicckey = bytes.fromhex('197402020111')
newpicckey = bytes.fromhex('197402020111')

class MainWindow(QtWidgets.QMainWindow, Ui_Frame):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        self.pushButton_clearinf.clicked.connect(self.pushButton_clearinf_clicked)
        self.pushButton_beep.clicked.connect(self.pushButton_beep_clicked)
        self.pushButton_getdevnum.clicked.connect(self.pushButton_getdevnum_clicked)
        self.pushButton_clearbuff.clicked.connect(self.pushButton_clearbuff_clicked)
        self.pushButton_writetag.clicked.connect(self.pushButton_writetag_clicked)
        self.comboBox_seleapp.currentTextChanged.connect(self.comboBox_seleapp_currentindexchanged)
        self.pushButton_text.clicked.connect(self.pushButton_text_clicked)
        self.pushButton_App.clicked.connect(self.pushButton_App_clicked)
        self.pushButton_Url.clicked.connect(self.pushButton_Url_clicked)
        self.pushButton_Map.clicked.connect(self.pushButton_Map_clicked)
        self.pushButton_Bluetooth.clicked.connect(self.pushButton_Bluetooth_clicked)
        self.pushButton_Wifi.clicked.connect(self.pushButton_Wifi_clicked)
        self.pushButton_Card.clicked.connect(self.pushButton_Card_clicked)
        self.pushButton_Data.clicked.connect(self.pushButton_Data_clicked)
        self.pushButton_Call.clicked.connect(self.pushButton_Call_clicked)
        self.pushButton_readtag.clicked.connect(self.pushButton_readtag_clicked)
        self.pushButton_cleatag.clicked.connect(self.pushButton_cleatag_clicked)
        self.checkBox_later.toggled.connect(self.checkBox_later_toggled)


    def pushButton_clearinf_clicked(self):
        self.listWidget.clear()
        self.plainTextEdit_taginf.setPlainText('')

    def checkBox_later_toggled(self):
        if self.checkBox_later.isChecked():
            answ=QMessageBox.warning(self,'警告','      ISO15693协议标签锁定保护后就不能再解锁修改!请问确定要开启锁定保护功能吗?',QMessageBox.Yes|QMessageBox.No)
            if answ==QMessageBox.No:
                self.checkBox_later.setChecked(False)


    def ListErrInf(self,Errcode):
        if (Errcode == 8):
            self.ListBottom('错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!')
        elif (Errcode == 1):
            self.ListBottom('错误代码:1,0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!')
        elif (Errcode == 2):
            self.ListBottom('错误代码:2,第0块已被读出,但1~2块读取失败。卡序列号已被读出来!')
        elif (Errcode == 3):
            self.ListBottom('错误代码:3,第0、1块已被读出,但2块读取失败。卡序列号已被读出来!')
        elif (Errcode == 9):
            self.ListBottom('错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!')
        elif (Errcode == 10):
            self.ListBottom('错误代码:10,该卡可能已被休眠,无法选中卡片!')
        elif (Errcode == 11):
            self.ListBottom('错误代码:11,密码装载失败!')
        elif (Errcode == 12):
            self.ListBottom('错误代码:12,标签密码认证错误!')
        elif (Errcode == 13):
            self.ListBottom('错误代码:13,读指定块失败,原因是刷卡太快或本块所对应的区还没通过密码认证!')
        elif (Errcode == 14):
            self.ListBottom('错误代码:14,写标签失败,可能需要验证密码!')
        elif (Errcode == 21):
            self.ListBottom('错误代码:21,没有动态库!')
        elif (Errcode == 22):
            self.ListBottom('错误代码:22,动态库或驱动程序异常!')
        elif (Errcode == 23):
            self.ListBottom('错误代码:23,(表示未检测到免驱动读写器!)(有驱动读写器表示驱动程序错误或未检测到有驱读写器!)')
        elif (Errcode == 24):
            self.ListBottom('错误代码:24,操作超时,一般是动态库没有反映!')
        elif (Errcode == 25):
            self.ListBottom('错误代码:25,发送字数不够!')
        elif (Errcode == 26):
            self.ListBottom('错误代码:26,发送的CRC错!')
        elif (Errcode == 27):
            self.ListBottom('错误代码:27,接收的字数不够!')
        elif (Errcode == 28):
            self.ListBottom('错误代码:28,接收的CRC错!')
        elif (Errcode == 45):
            self.ListBottom('错误代码:45,此卡不支持更改UID号或UID块已被锁定!')
        elif (Errcode == 46):
            self.ListBottom('错误代码:46,标签存储空间不足!')
        elif (Errcode == 254):
            self.ListBottom('错误代码:254,标签存储空间不足!')
        elif (Errcode == 255):
            self.ListBottom('错误代码:255,暂不支持长度大于255字节的信息写入!')
        else:
            self.ListBottom('未知错误,错误代码:' + str(Errcode))

    def comboBox_seleapp_currentindexchanged(self):
        packstr=self.comboBox_seleapp.currentText().strip()
        FieldsList = packstr.split('|')
        self.lineEdit_appname.setText(FieldsList[1])

    def ListBottom(self,dispinf):
        if self.listWidget.count()>50:
            self.listWidget.clear()
        self.listWidget.addItem(dispinf)
        self.listWidget.scrollToBottom()
        seleid = self.listWidget.count() - 1
        self.listWidget.item(seleid).setSelected(True)

    def pushButton_beep_clicked(self):
        status = Objdll.pcdbeep(50) % 256
        if status == 0:
            self.ListBottom("读写器已执行响声指令!")
        else:
            self.ListErrInf(status)

    def pushButton_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 + '%03d' % (devno[num])
                if (num < len(devno) - 1):
                    SerialNum = SerialNum + '-'
            self.ListBottom('读取设备编号成功,设备编号:' + SerialNum)
        else:
            self.ListErrInf(status)

    def pushButton_clearbuff_clicked(self):
        Objdll.tagbuf_forumtype4_clear()
        Objdll.tagbuf_clear()
        self.ListBottom('NDEF写卡缓冲区数据清除成功!' )

    def checkcardtype(self):        #检测NFC标签类型
        myctrlword=0
        devno = bytes(4)        # 声明4个字节缓冲
        mypiccserial= bytes(8)  # 声明8个字节缓冲
        mypicckey=bytes(6)      # 声明6个字节缓冲
        mypicdata=bytes(48)
        mypiccseriallen=bytes(2)

        try:
            status = Objdll.pcdgetdevicenumber(devno) % 256
            if (status == 0):
                status = Objdll.piccreadex_ntag(myctrlword, mypiccserial, mypicckey, 4, 1, mypicdata) % 256
                if (status == 0):
                    return 1        #forumtype2 Ntag2标签
                else:
                    status = Objdll.iso15693readex(myctrlword,0,1,1, mypiccserial,mypicdata) % 256
                    if (status == 0):
                        return 2    #forumtype5 15693标签
                    else:
                        myctrlword = 23
                        mypicckey=bytes([255,255,255,255,255,255])
                        status = Objdll.piccreadex(myctrlword,mypiccserial,0,1,mypicckey,mypicdata) % 256
                        if (status == 0):
                            return 3    #MifareClissic标签,出厂全新状态
                        else:
                            mypicckey = bytes([160, 161, 162, 163, 164, 165])
                            status = Objdll.piccreadex(myctrlword, mypiccserial, 0, 1, mypicckey, mypicdata) % 256
                            if (status == 0):
                                return 3        #MifareClissic标签,已经写有NDEF数据
                            else:
                                myctrlword = 0
                                status = Objdll.forumtype4request(myctrlword, mypiccserial, mypiccseriallen) % 256
                                if (status == 0 or status == 52):
                                    return 4    #forumtype4 标签
                                else:
                                    return -1   #其他未知型号标签
            else:
                return 23   #未连接到发卡器

        except:
            return 23

    def WriteTag(self,funcname):     #将NDEF缓冲区数据写入各种不同类型的NFC标签,清除标签内NDEF数据
        mypiccserial = bytes(8)
        mypiccseriallen=bytes(1)

        try:
            cardtyep = self.checkcardtype()  #判断发卡器上的标签类型
            if(cardtyep==1):        #写forumtype2 Ntag2标签
                if self.checkBox_before.isChecked():
                    myctrlword = 16
                else:
                    myctrlword = 0
                status = Objdll.forumtype2_write_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'ForumType2,UID:'
                    for num in range(0, 7):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:'+cardno)
                    if (self.checkBox_before.isChecked() and not self.checkBox_later.isChecked()) or (not self.checkBox_before.isChecked() and self.checkBox_later.isChecked() or (self.checkBox_before.isChecked() and self.checkBox_later.isChecked())):
                        self.NtagkeyEn()
                else:
                    self.ListErrInf(status)

            elif(cardtyep==2):       #写forumtype5 15693标签
                myctrlword = 0
                afi=0
                status = Objdll.forumtype5_write_ndeftag(myctrlword,afi, mypiccserial) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'ForumType5,UID:'
                    for num in range(0, 8):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    if self.checkBox_later.isChecked():    #15693卡锁定块数据后只能读取不可再修改,为防止卡片锁死,请谨慎锁定
                        Objdll.iso15693lockblock(0,1,mypiccserial)
                    self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif (cardtyep == 3):  # 写MifareClassic标签
                if(funcname=='NDEF_Clear'):
                    if self.checkBox_before.isChecked():
                        myctrlword = 210
                    else:
                        myctrlword = 146
                    status = Objdll.piccclear_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256
                else:
                    if self.checkBox_before.isChecked():
                        myctrlword = 210
                    else:
                        myctrlword = 146
                    if self.checkBox_later.isChecked():  #写标签后给标签加密保护
                        myctrlword=myctrlword+4
                    status = Objdll.piccwrite_ndeftag(myctrlword, mypiccserial, oldpicckey,newpicckey) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'MifareClass,UID:'
                    for num in range(0, 4):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif(cardtyep==4):       #写forumtype4 标签
                if self.checkBox_before.isChecked():
                    myctrlword = 64
                else:
                    myctrlword = 0
                status = Objdll.forumtype4_write_ndeftag(myctrlword, mypiccserial,mypiccseriallen,newpicckey) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'ForumType4,UID:'
                    for num in range(0, mypiccseriallen[0]):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif (cardtyep == 23):
                self.ListErrInf(23)
            else:
                self.ListErrInf(8)

        except:
            self.ListErrInf(8)

    def ReadTag(self,funcname):      # 读取各种不同类型的NFC标签的NDEF数据
        mypiccserial = bytes(8)
        mypiccseriallen = bytes(1)
        mypiccdata = bytes(2048)
        revstrlen = bytes(2)
        recordnumber = bytes(2)

        try:
            cardtyep = self.checkcardtype()  #判断发卡器上的标签类型
            if (cardtyep == 1):         # 读forumtype2 Ntag2标签
                if self.checkBox_before.isChecked():
                    myctrlword = 16
                else:
                    myctrlword = 0
                status = Objdll.forumtype2_read_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256
                if(status==0):
                    Objdll.pcdbeep(38)
                    cardno = 'ForumType2,UID:'
                    for num in range(0, 7):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif(cardtyep==2):       #读forumtype5 15693标签
                myctrlword = 0
                afi=0
                status = Objdll.forumtype5_read_ndeftag(myctrlword,afi, mypiccserial) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'ForumType5,'
                    for num in range(0, 8):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif (cardtyep == 3):  # 读MifareClassic标签
                if self.checkBox_before.isChecked():
                    myctrlword = 208
                else:
                    myctrlword = 144
                status = Objdll.piccread_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'MifareClass,'
                    for num in range(0, 4):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif(cardtyep==4):       #读forumtype4 标签
                if self.checkBox_before.isChecked():
                    myctrlword = 64
                else:
                    myctrlword = 0
                status = Objdll.forumtype4_read_ndeftag(myctrlword, mypiccserial,mypiccseriallen,oldpicckey) % 256
                if (status == 0):
                    Objdll.pcdbeep(38)
                    cardno = 'ForumType4,'
                    for num in range(0, mypiccseriallen[0]):
                        cardno = cardno + '%02X' % (mypiccserial[num])
                    self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)
                else:
                    self.ListErrInf(status)

            elif (cardtyep == 23):
                self.ListErrInf(23)
            else:
                self.ListErrInf(8)

            if (status == 0):
                Objdll.tagbuf_read(mypiccdata,revstrlen,recordnumber)
                strlen=revstrlen[0]+revstrlen[1]*256
                strinf=mypiccdata[0:strlen]
                ndefstr=strinf.decode('gbk')
                self.plainTextEdit_taginf.setPlainText(ndefstr)

        except:
            self.ListErrInf(8)

    def NtagkeyEn(self):    #开启或关闭Ntag标签的密钥保护功能
        mypiccserial=bytes(8)

        if self.checkBox_before.isChecked():    #操作已经加密保护的ntag2x卡
            myctrlword=16
        else:
            myctrlword=0

        if self.checkBox_later.isChecked(): #需要开启Ntag卡的加密保护功能
            mypiccdata=bytes.fromhex('0000000400000000')
            mypiccdata=mypiccdata + newpicckey[0:4]
            mypiccdata = mypiccdata +bytes.fromhex('16160000')
            myctrlword=myctrlword+7
            status = Objdll.piccinit_ntag(myctrlword, mypiccserial, oldpicckey, mypiccdata)
            if status == 0:
                cardno = 'ForumType2,UID:'
                for num in range(0, 7):
                    cardno = cardno + '%02X' % (mypiccserial[num])
                self.ListBottom('NDEF标签加密锁定保护成功!标签类型:' + cardno)
            else:
                self.ListBottom('NDEF标签加密锁定保护失败!错误代码%d:' %(status))
        else:
            mypiccdata = bytes.fromhex('000000FF000000000000000000000000')      #关闭Ntag卡的密钥保护功能
            myctrlword = myctrlword + 3
            status=Objdll.piccinit_ntag(myctrlword,mypiccserial,oldpicckey,mypiccdata)
            if status == 0:
                cardno = 'ForumType2,UID:'
                for num in range(0, 7):
                    cardno = cardno + '%02X' % (mypiccserial[num])
                self.ListBottom('NDEF标签解密去除锁定保护成功!标签类型:' + cardno)
            else:
                self.ListBottom('NDEF标签解密去除锁定保护失败!错误代码%d:' %(status))

    def pushButton_writetag_clicked(self):
        self.WriteTag('NDEF缓冲区数据')

    def pushButton_text_clicked(self):
        languagecodestr = "en".encode('gbk')
        textstr=self.lineEdit_text.text().strip().encode('gbk')
        if len(textstr)<1:
            QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的文本信息!',QMessageBox.Yes)
            self.lineEdit_text.setFocus()
            return
        else:
            status = Objdll.tagbuf_addtext(languagecodestr, len(languagecodestr), textstr, len(textstr)) % 256
            if status == 0:
                self.ListBottom("文本信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
            else:
                self.ListBottom("文本信息加入NDEF写卡缓冲区失败!")

    def pushButton_App_clicked(self):
        packagestr = self.lineEdit_appname.text().strip().encode('gbk')
        if len(packagestr)<1:
            QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的自启动APP程序包名!',QMessageBox.Yes)
            self.lineEdit_appname.setFocus()
            return
        else:
            status = Objdll.tagbuf_addapp(packagestr, len(packagestr)) % 256
            if status == 0:
                self.ListBottom("自启动APP名称加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
            else:
                self.ListBottom("自启动APP名称加入NDEF写卡缓冲区失败!")

    def pushButton_Url_clicked(self):
        languagecodestr = "en".encode('gbk')
        titlestr=self.lineEdit_title.text().strip().encode('gbk')
        uriheaderindex = self.comboBox_headindex.currentIndex()
        uristr=self.lineEdit_uri.text().strip().encode('gbk')
        if len(uristr)<1:
            QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的网址URI!',QMessageBox.Yes)
            self.lineEdit_uri.setFocus()
            return
        else:
            status = Objdll.tagbuf_adduri(languagecodestr, len(languagecodestr), titlestr, len(titlestr), uriheaderindex,uristr, len(uristr)) % 256
            if status == 0:
                self.ListBottom("网址URL加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
            else:
                self.ListBottom("网址URL加入NDEF写卡缓冲区失败!")

    def pushButton_Map_clicked(self):
        languagecodestr = "en".encode('gbk')
        titlestr=self.lineEdit_mapname.text().strip().encode('gbk')
        latitude=self.lineEdit_latitude.text().strip()
        longitude=self.lineEdit_longitude.text().strip()
        mapcoord = ("geo:" + latitude + "," + longitude).encode('gbk')
        status = Objdll.tagbuf_adduri(languagecodestr, len(languagecodestr), titlestr, len(titlestr), 0, mapcoord,len(mapcoord)) % 256
        if status == 0:
            self.ListBottom("地图坐标加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
        else:
            self.ListBottom("地图坐标加入NDEF写卡缓冲区失败!")

    def pushButton_Bluetooth_clicked(self):
        try:
            macname = self.lineEdit_Bluetoothname.text().strip() .encode('gbk')
            maclist = self.lineEdit_Bluetoothmac.text().strip().split(':')
            if (len(maclist) == 6):
                macbuf = bytes(
                    [eval('0x' + maclist[0]), eval('0x' + maclist[1]), eval('0x' + maclist[2]), eval('0x' + maclist[3]),
                     eval('0x' + maclist[4]), eval('0x' + maclist[5])])
                status = Objdll.tagbuf_addbluetooth(macname, len(macname), macbuf) % 256
                if status == 0:
                    self.ListBottom("蓝牙连接信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
                else:
                    self.ListBottom("蓝牙连接信息加入NDEF写卡缓冲区失败!")
            else:
                QMessageBox.critical(self, '提示', '蓝牙MAC地址输入错误!', QMessageBox.Yes)
                self.lineEdit_Bluetoothmac.setFocus()
        except:
            QMessageBox.critical(self, '提示', '蓝牙MAC地址输入错误!', QMessageBox.Yes)
            self.lineEdit_Bluetoothmac.setFocus()

    def pushButton_Wifi_clicked(self):
        ssidstr = self.lineEdit_hostname.text().strip().encode('gbk')
        if len(ssidstr)<1:
            QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的热点名称!',QMessageBox.Yes)
            self.lineEdit_hostname.setFocus()
            return

        authtype=self.comboBox_auth.currentIndex()
        crypttype=self.comboBox_Calculation.currentIndex()
        keystr=self.lineEdit_password.text().strip().encode('gbk')
        status = Objdll.tagbuf_addwifi(ssidstr, len(ssidstr), authtype, crypttype, keystr, len(keystr)) % 256
        if status == 0:
            self.ListBottom("WIFI热点信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
        else:
            self.ListBottom("WIFI热点信息加入NDEF写卡缓冲区失败!")

    def pushButton_Card_clicked(self):
        infostr = "BEGIN:VCARD" + "\n"
        infostr = infostr + "VERSION:3.0" + "\n"
        infostr = infostr + "FN:"+self.lineEdit_name.text().strip()+ "\n"
        infostr = infostr + "TEL:" +self.lineEdit_tel.text().strip()+ "\n"
        infostr = infostr + "ORG:" +self.lineEdit_unilname.text().strip()+ "\n"
        infostr = infostr + "ADR:" +self.lineEdit_address.text().strip()+ "\n"
        infostr = infostr + "EMAIL:" +self.lineEdit_email.text().strip()+ "\n"
        infostr = infostr + "URL:" +self.lineEdit_net.text().strip()+ "\n"
        infostr = infostr + "END:VCARD"
        businesscard = infostr.encode('gbk')
        status = Objdll.tagbuf_addbusinesscard(businesscard, len(businesscard)) % 256
        if status == 0:
            self.ListBottom("电子名片信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
        else:
            self.ListBottom("电子名片信息加入NDEF写卡缓冲区失败!")

    def pushButton_Data_clicked(self):
        typestr = self.lineEdit_datatype.text().strip().encode('gbk')
        datastr = self.lineEdit_data.text().strip().encode('gbk')
        status = Objdll.tagbuf_adddata(typestr, len(typestr), datastr, len(datastr)) % 256
        if status == 0:
            self.ListBottom("自定义数据类型加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
        else:
            self.ListBottom("自定义数据类型加入NDEF写卡缓冲区失败!")

    def pushButton_Call_clicked(self):
        languagecodestr = "en".encode('gbk')
        titlestr = "".encode('gbk')
        CallNumber=self.lineEdit_callnum.text().strip().encode('gbk')
        status = Objdll.tagbuf_adduri(languagecodestr, len(languagecodestr), titlestr, len(titlestr), 5, CallNumber,len(CallNumber)) % 256
        if status == 0:
            self.ListBottom("呼叫电话加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")
        else:
            self.ListBottom("呼叫电话加入NDEF写卡缓冲区失败!")

    def pushButton_readtag_clicked(self):
        #Objdll.tagbuf_forumtype4_clear()
        #Objdll.tagbuf_clear()
        self.plainTextEdit_taginf.setPlainText('')
        self.ReadTag('NDEF_ReadInfo')

    def pushButton_cleatag_clicked(self):
        Objdll.tagbuf_forumtype4_clear()
        Objdll.tagbuf_clear()
        self.checkBox_later.setChecked(False)
        self.WriteTag('NDEF_Clear')


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.pushButton_clearbuff.setStyleSheet("color:red;")
    mainWindow.pushButton_writetag.setStyleSheet("color:blue;")
    mainWindow.move(newLeft, newTop)

    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)

    mainWindow.show()
    sys.exit(app.exec_())

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验:使用apache + yum实现自制yum仓库

实验准备 Web服务器端&#xff1a;cenos-1&#xff08;IP&#xff1a;10.9.25.33&#xff09; 客户端&#xff1a;centos-2 保证两台机器网络畅通&#xff0c;原yum仓库可用&#xff0c;关闭防火墙和selinux Web服务器端 ①安装httpd并运行&#xff0c;设置开机自启动 安装…

【人工智能基础】人工神经网络

一、人工神经网络的三要素 人工神经元数理模型 MP模型是世界上第一个神经计算模型&#xff0c;为神经网络理论提供了基础 MP模型功能 对树突输入u的线性加权求和对净输入的非线性转换\ 作用函数的功能作用函数的功能 MP神经元模型的作用函数是单位阶跃函数。当x≥0时f(x)…

实现Node.js安装与配置。

一 、Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;用于构建高性能、可扩展的网络应用程序。它发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;允许使用JavaScript进行服务器端编程&#xff0c;使开发者能够在前后端都使用同一种编程…

ASP.NET教务平台—学籍管理模块开发与设计

摘 要 教务平台之学籍管理模块是一个典型的教务信息管理系统(MIS)&#xff0c;其开发主要包括后台数据库的建立和前端应用程序的开发两个方面。对于后台数据库要求实现数据的完整性、一致性和安全性&#xff1b;对于前台应用程序开发则要求模块功能完备、界面友好、易使用等特…

进程状态和优先级(进程第2篇)【Linux复习篇】

目录 一、进程状态 1、进程有什么状态&#xff1f; 2、 Linux下的进程状态有什么&#xff1f; 二、进程优先级 1、进程优先级是什么&#xff1f; 2、为什么要有优先级 3、怎么改进程优先级&#xff1f;要改吗&#xff1f; 4、操作系统如何根据优先级开展调度的&#xff…

Spring MVC和Spring Boot

上节已经提到过请求&#xff0c;这次梳理响应。 响应 响应基本上都要被Controller所托管&#xff0c;告诉Spring帮我们管理这个代码&#xff0c;我们在后面需要访问时&#xff0c;才可以进行访问&#xff0c;否则将会报错。并且其是由RestController分离出来的&#xff0c;Re…

【MCU】栈溢出问题

项目场景&#xff1a; 硬件&#xff1a;STM32F407&#xff0c;操作系统&#xff1a;rt_thread master分支 问题描述 问题栈溢出 id 499 ide 00 rtr 00 len 8 9 Function[rt_completion_wait] shall not be used in ISR (0) assertion failed at function:rt_completion_wait,…

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)

牛客对应链接&#xff1a;数组中的最长连续子序列_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 排序 模拟。 注意&#xff1a;值连续&#xff0c;位置可以不连续&#xff01;小心处理数字相同的情况。 二、代码 //值得学习的代码 class Solution { public:int MLS(vecto…

【数据库】Redis

文章目录 [toc]Redis终端操作进入Redis终端Redis服务测试切换仓库 String命令存储字符串普通存储设置存储过期时间批量存储 查询字符串查询单条批量查询 Key命令查询key查询所有根据key首字母查询判断key是否存在查询指定的key对应的value的类型 删除键值对 Hash命令存储hash查…

前端补充17(JS)

一、JS组成成分 JS的组成成分&#xff0c;由三部分组成 第一、ECMAScript&#xff1a;语法规则&#xff0c;如何定义变量&#xff0c;数据类型有哪些&#xff0c;如何转换数据类型&#xff0c;if判断 if-else while for for-in forEach do-while switch 数组 函数 对…

HTML表单(详解网页表单如何实现)

目录 一、表单介绍 1.概念 二、表单用法 1.HTML表单 2.HTML 表单 - 输入元素 2.1.文本域&#xff08;Text Fields&#xff09; 2.2.密码字段 2.3.单选按钮&#xff08;Radio Buttons&#xff09; 2.4.复选框&#xff08;Checkboxes&#xff09; 2.5.提交按钮(Submit)…

SAP 变更记录表查询使用逻辑简介

通常用户在遇到问题后&#xff0c;经常会问某个单据的变更记录&#xff0c;很多模块中在前台的操作界面中都根据对应的菜单栏中可以找到对应的变更记录&#xff0c;像销售订单、交货单、采购申请、采购订单都在菜单栏位中都可以查询到对应的修改记录&#xff0c;但是对于想批量…

“豪门”子刊!中科院2区SCI,收稿范围广,发文量超20000!无预警记录,极速录用见刊!

&#xff08;一&#xff09;期刊简介概况 【期刊类型】网络数据类SCIE 【出版社】SPRINGER出版社 【期刊概况】IF&#xff1a;4.0-5.0&#xff0c;JCR2区&#xff0c;中科院2区 【版面类型】正刊&#xff0c;仅10篇版面 【预警情况】2020-2024年无预警记录 【收录年份】2…

【项目】基于JDBC+MySQL的Java教务管理系统(附源码+论文说明)

摘要 随着信息技术的不断发展&#xff0c;教育管理也在向数字化、智能化方向迈进。Java作为一种广泛应用于企业级应用开发的编程语言&#xff0c;与数据库技术的结合更是为教务管理系统的开发提供了强大的支持。 本文将介绍基于JDBC&#xff08;Java Database Connectivity&a…

跨越未知,拥抱挑战——新征程

在浩瀚的IT领域里&#xff0c;每一位开发工程师都如同一位探险家&#xff0c;不断地探索、挑战和成长。作为一名新入职的Java开发工程师&#xff0c;我面临着全新的技术栈和业务领域&#xff0c;这是一次跨越未知的征程&#xff0c;也是一次自我提升的机会。 新入职 初入公司…

mac系统镜像源管理之nrm的安装与使用

之前有介绍过&#xff1a;pnpm安装和使用&#xff0c;nvm安装及使用&#xff0c;在前端开发中其实还有一个工具也会偶尔用到&#xff0c;那就是nrm&#xff0c;本文就详解介绍一下这个工具&#xff0c;非常的简单且好用&#xff5e; 文章目录 1、什么是nrm&#xff1f;2、安装3…

为什么说这些倒腾AI的方式会把自己“搞死”

在AI技术的浪潮下&#xff0c;许多基于大模型的产品涌现而出&#xff0c;但并非所有创新都能带来成功&#xff0c;有时大模型的出现还会放大AI创业公司的内部矛盾。这个时候&#xff0c;我们需要搭建与AI相配的底层思考框架。 为什么说这些倒腾AI的方式会把自己“搞死”© …

go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件

实现日志收集服务的客户端 前言 从这篇文章开始我们就正式进入了日志收集系统的编写&#xff0c;后面几篇文章我们将学习到如何编写日志收集服务的客户端,话不多说,让我们进入今天的内容吧&#xff01; 需要实现的功能 我们要收集指定目录下的日志文件&#xff0c;将它们发…

Flink CDC详解

文章目录 Flink CDC一 CDC简介1.1 CDC定义1.2 CDC应用场景1.3 CDC实现机制1.4 开源CDC工具对比 二 Flink CDC简介2.1 Flink CDC介绍2.2 Flink CDC Connector(连接器)2.3 Flink CDC && Flink版本2.4 Flink CDC特点 三 Flink CDC发展3.1 发展历程3.2 背景Dynamic Table &…