15693协议ICODE SLI 系列标签应用场景说明及读、写、密钥认证操作Qt c++源码,支持统信、麒麟等国产Linux系统

ICODE SLI系列智能标签是恩智浦(NXP)公司推出的第三代高频(HF)RFID产品,常用于物流追踪、产品供应链溯源、医疗设备标签、资产管理 、图书馆防盗等场景,ICODE SLI系列包含多个型号,各型号区别在于存储容量和安全功能,各常用型号参数如下图:

本示例使用广州荣士电子有限公司发卡器:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d292c1ba9CQER&ft=t&id=615391857885

一、接口函数声明

cpp 复制代码
//判断windows、linux系统,声明动态库函数----------------------------------------------------------------------------------------------------------------------------------------------
//让读写器发出声音
typedef  unsigned char (*pcdbeep)(unsigned long xms);
#ifdef Q_OS_WIN
    pcdbeep mypcdbeep = (pcdbeep)QLibrary("OUR_MIFARE.dll").resolve("pcdbeep");
#else
    pcdbeep mypcdbeep = (pcdbeep)QLibrary("./libOURMIFARE.so").resolve("pcdbeep");
#endif

//返回本读写器独一无二的设备编号
typedef  unsigned char (*pcdgetdevicenumber)(unsigned char *devicenumber);
#ifdef Q_OS_WIN
    pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("OUR_MIFARE.dll").resolve("pcdgetdevicenumber");
#else
    pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("./libOURMIFARE.so").resolve("pcdgetdevicenumber");
#endif

//轻松读15693卡
typedef unsigned char (*iso15693readex)(unsigned char ctrlword,unsigned char afi,unsigned char startblock,unsigned char blocknum,unsigned char *uid,unsigned char *piccdatabuf);
#ifdef Q_OS_WIN
    iso15693readex myiso15693readex = (iso15693readex)QLibrary("OUR_MIFARE.dll").resolve("iso15693readex");
#else
    iso15693readex myiso15693readex = (iso15693readex)QLibrary("./libOURMIFARE.so").resolve("iso15693readex");
#endif

//轻松写15693卡
typedef unsigned char (*iso15693writeex)(unsigned char ctrlword,unsigned char afi,unsigned char startblock,unsigned char blocknum,unsigned char *uid,unsigned char *piccdatabuf);
#ifdef Q_OS_WIN
    iso15693writeex myiso15693writeex = (iso15693writeex)QLibrary("OUR_MIFARE.dll").resolve("iso15693writeex");
#else
    iso15693writeex myiso15693writeex = (iso15693writeex)QLibrary("./libOURMIFARE.so").resolve("iso15693writeex");
#endif

//寻一张15693卡
typedef unsigned char (*iso15693inventory)(unsigned char flags,unsigned char afi,unsigned char masklen,unsigned char *maskuid,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693inventory myiso15693inventory = (iso15693inventory)QLibrary("OUR_MIFARE.dll").resolve("iso15693inventory");
#else
    iso15693inventory myiso15693inventory = (iso15693inventory)QLibrary("./libOURMIFARE.so").resolve("iso15693inventory");
#endif

//寻多张15693卡
typedef unsigned char (*iso15693inventory16)(unsigned char flags,unsigned char afi,unsigned char masklen,unsigned char *maskuid,unsigned char *revlen,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693inventory16 myiso15693inventory16 = (iso15693inventory16)QLibrary("OUR_MIFARE.dll").resolve("iso15693inventory16");
#else
    iso15693inventory16 myiso15693inventory16 = (iso15693inventory16)QLibrary("./libOURMIFARE.so").resolve("iso15693inventory16");
#endif

//让15693卡进入闲置(Quiet)静止状态
typedef unsigned char (*iso15693stayquiet)(unsigned char flags,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693stayquiet myiso15693stayquiet = (iso15693stayquiet)QLibrary("OUR_MIFARE.dll").resolve("iso15693stayquiet");
#else
    iso15693stayquiet myiso15693stayquiet = (iso15693stayquiet)QLibrary("./libOURMIFARE.so").resolve("iso15693stayquiet");
#endif

//使15693卡进入选择(selected )状态
typedef unsigned char (*iso15693Select)(unsigned char flags,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693Select myiso15693Select = (iso15693Select)QLibrary("OUR_MIFARE.dll").resolve("iso15693Select");
#else
    iso15693Select myiso15693Select = (iso15693Select)QLibrary("./libOURMIFARE.so").resolve("iso15693Select");
#endif

//使15693卡进入准备(Ready)状态
typedef unsigned char (*iso15693resettoready)(unsigned char flags,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693resettoready myiso15693resettoready = (iso15693resettoready)QLibrary("OUR_MIFARE.dll").resolve("iso15693resettoready");
#else
    iso15693resettoready myiso15693resettoready = (iso15693resettoready)QLibrary("./libOURMIFARE.so").resolve("iso15693resettoready");
#endif

//写15693卡AFI
typedef unsigned char (*iso15693writeafi)(unsigned char flags,unsigned char afi,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693writeafi myiso15693writeafi = (iso15693writeafi)QLibrary("OUR_MIFARE.dll").resolve("iso15693writeafi");
#else
    iso15693writeafi myiso15693writeafi = (iso15693writeafi)QLibrary("./libOURMIFARE.so").resolve("iso15693writeafi");
#endif

//锁15693卡AFI
typedef unsigned char (*iso15693lockafi)(unsigned char flags,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693lockafi myiso15693lockafi = (iso15693lockafi)QLibrary("OUR_MIFARE.dll").resolve("iso15693lockafi");
#else
    iso15693lockafi myiso15693lockafi = (iso15693lockafi)QLibrary("./libOURMIFARE.so").resolve("iso15693lockafi");
#endif

//写15693卡DSFID
typedef unsigned char (*iso15693writedsfid)(unsigned char flags,unsigned char dsfid,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693writedsfid myiso15693writedsfid = (iso15693writedsfid)QLibrary("OUR_MIFARE.dll").resolve("iso15693writedsfid");
#else
    iso15693writedsfid myiso15693writedsfid = (iso15693writedsfid)QLibrary("./libOURMIFARE.so").resolve("iso15693writedsfid");
#endif

//锁15693卡DSFID
typedef unsigned char (*iso15693lockdsfid)(unsigned char flags,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693lockdsfid myiso15693lockdsfid = (iso15693lockdsfid)QLibrary("OUR_MIFARE.dll").resolve("iso15693lockdsfid");
#else
    iso15693lockdsfid myiso15693lockdsfid = (iso15693lockdsfid)QLibrary("./libOURMIFARE.so").resolve("iso15693lockdsfid");
#endif

//锁15693卡数据块
typedef unsigned char (*iso15693lockblock)(unsigned char flags,unsigned char startblock,unsigned char *uid);
#ifdef Q_OS_WIN
    iso15693lockblock myiso15693lockblock = (iso15693lockblock)QLibrary("OUR_MIFARE.dll").resolve("iso15693lockblock");
#else
    iso15693lockblock myiso15693lockblock = (iso15693lockblock)QLibrary("./libOURMIFARE.so").resolve("iso15693lockblock");
#endif

//获取15693卡系统信息
typedef unsigned char (*iso15693readinfo)(unsigned char flags,unsigned char *uid,unsigned char *revlen,unsigned char *revbuf);
#ifdef Q_OS_WIN
    iso15693readinfo myiso15693readinfo = (iso15693readinfo)QLibrary("OUR_MIFARE.dll").resolve("iso15693readinfo");
#else
    iso15693readinfo myiso15693readinfo = (iso15693readinfo)QLibrary("./libOURMIFARE.so").resolve("iso15693readinfo");
#endif

//获取15693卡块安全信息
typedef unsigned char (*iso15693readsecuritystate)(unsigned char flags,unsigned char startblock,unsigned char blocknum,unsigned char *uid,unsigned char *revlen,unsigned char *revbuf);
#ifdef Q_OS_WIN
    iso15693readsecuritystate myiso15693readsecuritystate = (iso15693readsecuritystate)QLibrary("OUR_MIFARE.dll").resolve("iso15693readsecuritystate");
#else
    iso15693readsecuritystate myiso15693readsecuritystate = (iso15693readsecuritystate)QLibrary("./libOURMIFARE.so").resolve("iso15693readsecuritystate");
#endif

//读15693卡指定块
typedef unsigned char (*iso15693readblock)(unsigned char flags,unsigned char startblock,unsigned char blocknum,unsigned char *uid,unsigned char *revlen,unsigned char *piccdatabuf);
#ifdef Q_OS_WIN
    iso15693readblock myiso15693readblock = (iso15693readblock)QLibrary("OUR_MIFARE.dll").resolve("iso15693readblock");
#else
    iso15693readblock myiso15693readblock = (iso15693readblock)QLibrary("./libOURMIFARE.so").resolve("iso15693readblock");
#endif

//写15693卡指定块
typedef unsigned char (*iso15693writeblock)(unsigned char flags,unsigned char startblock,unsigned char blocknum,unsigned char *uid,unsigned char writelen,unsigned char *writebuf);
#ifdef Q_OS_WIN
    iso15693writeblock myiso15693writeblock= (iso15693writeblock)QLibrary("OUR_MIFARE.dll").resolve("iso15693writeblock");
#else
    iso15693writeblock myiso15693writeblock= (iso15693writeblock)QLibrary("./libOURMIFARE.so").resolve("iso15693writeblock");
#endif

//写SLIX1830卡UID
typedef unsigned char (*iso15693writeuid)(unsigned char ctrlword,unsigned char afi,unsigned char *olduid,unsigned char *newuid);
#ifdef Q_OS_WIN
    iso15693writeuid myiso15693writeuid= (iso15693writeuid)QLibrary("OUR_MIFARE.dll").resolve("iso15693writeuid");
#else
    iso15693writeuid myiso15693writeuid= (iso15693writeuid)QLibrary("./libOURMIFARE.so").resolve("iso15693writeuid");
#endif

//驱动发卡器显示
typedef unsigned char (*lcddispfull)(unsigned char *dispbuf);
#ifdef Q_OS_WIN
    lcddispfull mylcddispfull= (lcddispfull)QLibrary("OUR_MIFARE.dll").resolve("lcddispfull");
#else
    lcddispfull mylcddispfull= (lcddispfull)QLibrary("./libOURMIFARE.so").resolve("lcddispfull");
#endif

//密钥认证
typedef unsigned char (*iso15693authkey)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char passwordid,unsigned char *authkeybuf);
#ifdef Q_OS_WIN
    iso15693authkey myiso15693authkey= (iso15693authkey)QLibrary("OUR_MIFARE.dll").resolve("iso15693authkey");
#else
    iso15693authkey myiso15693authkey= (iso15693authkey)QLibrary("./libOURMIFARE.so").resolve("iso15693authkey");
#endif

//更改密钥
typedef unsigned char (*iso15693writekey)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char passwordid,unsigned char *newkeybuf);
#ifdef Q_OS_WIN
    iso15693writekey myiso15693writekey= (iso15693writekey)QLibrary("OUR_MIFARE.dll").resolve("iso15693writekey");
#else
    iso15693writekey myiso15693writekey= (iso15693writekey)QLibrary("./libOURMIFARE.so").resolve("iso15693writekey");
#endif

//启用EAS电子防盗
typedef unsigned char (*iso15693seteas)(unsigned char ctrlword,unsigned char *uidbuf);
#ifdef Q_OS_WIN
    iso15693seteas myiso15693seteas= (iso15693seteas)QLibrary("OUR_MIFARE.dll").resolve("iso15693seteas");
#else
    iso15693seteas myiso15693seteas= (iso15693seteas)QLibrary("./libOURMIFARE.so").resolve("iso15693seteas");
#endif

//禁用EAS电子防盗
typedef unsigned char (*iso15693reseteas)(unsigned char ctrlword,unsigned char *uidbuf);
#ifdef Q_OS_WIN
    iso15693reseteas myiso15693reseteas= (iso15693reseteas)QLibrary("OUR_MIFARE.dll").resolve("iso15693reseteas");
#else
    iso15693reseteas myiso15693reseteas= (iso15693reseteas)QLibrary("./libOURMIFARE.so").resolve("iso15693reseteas");
#endif

//读取EAS防盗序列号
typedef unsigned char (*iso15693easalarm)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char *eassequencelen,unsigned char *eassequence);
#ifdef Q_OS_WIN
    iso15693easalarm myiso15693easalarm= (iso15693easalarm)QLibrary("OUR_MIFARE.dll").resolve("iso15693easalarm");
#else
    iso15693easalarm myiso15693easalarm= (iso15693easalarm)QLibrary("./libOURMIFARE.so").resolve("iso15693easalarm");
#endif

//块密码保护设定
typedef unsigned char (*iso15693protectblock)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char blockpoint,unsigned char extprotectstatus);
#ifdef Q_OS_WIN
    iso15693protectblock myiso15693protectblock= (iso15693protectblock)QLibrary("OUR_MIFARE.dll").resolve("iso15693protectblock");
#else
    iso15693protectblock myiso15693protectblock= (iso15693protectblock)QLibrary("./libOURMIFARE.so").resolve("iso15693protectblock");
#endif

//启用隐私保
typedef unsigned char (*iso15693privacyen)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char *password);
#ifdef Q_OS_WIN
    iso15693privacyen myiso15693privacyen= (iso15693privacyen)QLibrary("OUR_MIFARE.dll").resolve("iso15693privacyen");
#else
    iso15693privacyen myiso15693privacyen= (iso15693privacyen)QLibrary("./libOURMIFARE.so").resolve("iso15693privacyen");
#endif

//读取配置信息
typedef unsigned char (*iso15693getnxpsysinfo)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char *eassequencelen,unsigned char *eassequence);
#ifdef Q_OS_WIN
    iso15693getnxpsysinfo myiso15693getnxpsysinfo= (iso15693getnxpsysinfo)QLibrary("OUR_MIFARE.dll").resolve("iso15693getnxpsysinfo");
#else
    iso15693getnxpsysinfo myiso15693getnxpsysinfo= (iso15693getnxpsysinfo)QLibrary("./libOURMIFARE.so").resolve("iso15693getnxpsysinfo");
#endif

//卡密钥锁定
typedef unsigned char (*iso15693lockkey)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char passwordid);
#ifdef Q_OS_WIN
    iso15693lockkey myiso15693lockkey= (iso15693lockkey)QLibrary("OUR_MIFARE.dll").resolve("iso15693lockkey");
#else
    iso15693lockkey myiso15693lockkey= (iso15693lockkey)QLibrary("./libOURMIFARE.so").resolve("iso15693lockkey");
#endif

//启用卡读写双密码认证
typedef unsigned char (*iso15693readpluswritekeyen)(unsigned char ctrlword,unsigned char *uidbuf);
#ifdef Q_OS_WIN
    iso15693readpluswritekeyen myiso15693readpluswritekeyen= (iso15693readpluswritekeyen)QLibrary("OUR_MIFARE.dll").resolve("iso15693readpluswritekeyen");
#else
    iso15693readpluswritekeyen myiso15693readpluswritekeyen= (iso15693readpluswritekeyen)QLibrary("./libOURMIFARE.so").resolve("iso15693readpluswritekeyen");
#endif

//锁定启用或禁用EAS模式设置
typedef unsigned char (*iso15693lockeas)(unsigned char ctrlword,unsigned char *uidbuf);
#ifdef Q_OS_WIN
    iso15693lockeas myiso15693lockeas= (iso15693lockeas)QLibrary("OUR_MIFARE.dll").resolve("iso15693lockeas");
#else
    iso15693lockeas myiso15693lockeas= (iso15693lockeas)QLibrary("./libOURMIFARE.so").resolve("iso15693lockeas");
#endif

//锁 启用密码保护 AFI
typedef unsigned char (*iso15693protectafi)(unsigned char ctrlword,unsigned char *uidbuf);
#ifdef Q_OS_WIN
    iso15693protectafi myiso15693protectafi= (iso15693protectafi)QLibrary("OUR_MIFARE.dll").resolve("iso15693protectafi");
#else
    iso15693protectafi myiso15693protectafi= (iso15693protectafi)QLibrary("./libOURMIFARE.so").resolve("iso15693protectafi");
#endif

//锁 启用密码保护 EAS 功能
typedef unsigned char (*iso15693protecteas)(unsigned char ctrlword,unsigned char *uidbuf);
#ifdef Q_OS_WIN
    iso15693protecteas myiso15693protecteas= (iso15693protecteas)QLibrary("OUR_MIFARE.dll").resolve("iso15693protecteas");
#else
    iso15693protecteas myiso15693protecteas= (iso15693protecteas)QLibrary("./libOURMIFARE.so").resolve("iso15693protecteas");
#endif

//锁 块的密码保护设置
typedef unsigned char (*iso15693lockprotectblock)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char blockpoint);
#ifdef Q_OS_WIN
    iso15693lockprotectblock myiso15693lockprotectblock= (iso15693lockprotectblock)QLibrary("OUR_MIFARE.dll").resolve("iso15693lockprotectblock");
#else
    iso15693lockprotectblock myiso15693lockprotectblock= (iso15693lockprotectblock)QLibrary("./libOURMIFARE.so").resolve("iso15693lockprotectblock");
#endif

//销毁卡片
typedef unsigned char (*iso15693destroy)(unsigned char ctrlword,unsigned char *uidbuf,unsigned char *authkeybuf);
#ifdef Q_OS_WIN
    iso15693destroy myiso15693destroy= (iso15693destroy)QLibrary("OUR_MIFARE.dll").resolve("iso15693destroy");
#else
    iso15693destroy myiso15693destroy= (iso15693destroy)QLibrary("./libOURMIFARE.so").resolve("iso15693destroy");
#endif

二、选定发卡器上的卡片

cpp 复制代码
void MainWindow::on_pb_search1_clicked()
{
    if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在
    if (myiso15693inventory != NULL){
        unsigned char status;
        unsigned char flags;
        unsigned char afi;
        unsigned char maskuid[8];   //卡号掩码,一般可以不理这个参数
        unsigned char masklen;
        unsigned char uid[9];

        ui->lineEdit_uid->setText("");

        ui->lineEdit_flags->setText("36");
        flags=54;

        QString afistr=ui->lineEdit_afi->text().trimmed();
        if(afistr.length()==2 and checkinput(afistr)){
            bool ok;
            afi=afistr.toInt(&ok,16);
        }else{
            QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");
            return;
        }

        QString masklstr=ui->lineEdit_masklen->text().trimmed();
        if(masklstr.length()==2 and checkinput(masklstr)){
            bool ok;
            masklen=masklstr.toInt(&ok,16);
        }else{
            QMessageBox::critical(NULL, "提示","请输入2位16进制掩码长度!");
            return;
        }

        status = myiso15693inventory(flags, afi, masklen, maskuid, uid);
        if(status==0){
            mypcdbeep(30);
            ui->lineEdit_dsfid->setText(QString::asprintf("%02X", uid[0]));
            QString uidstr="";
            for(int i=1;i<9;i++){
                uidstr=uidstr+QString::asprintf("%02X", uid[i]);
            }
            ui->lineEdit_uid->setText(uidstr);
        }else{
            disperrinf(status);
        }
    }else{
        QMessageBox::critical(NULL, "提示", "函数'iso15693inventory'未正确载入,请查询 "+runDir+" OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确!");
    }
}

三、卡密钥认证

cpp 复制代码
void MainWindow::on_pb_authkey_clicked()
{    
    if(!checkdllos()){return;}       //判断运行目录内动态库文件是否存在
    if (myiso15693authkey != NULL){
        unsigned char uidbuf[8];
        QString uidstr=ui->lineEdit_uid->text().trimmed();
        int checkbuflen=checkhexdata(uidstr,uidbuf);
        if (checkbuflen!=8){
            QMessageBox::critical(NULL, "提示", "需要操作的卡片UID错误,可先执行寻卡操作获取UID!");
            ui->lineEdit_uid->setFocus();
            return;
        }

        unsigned char authkeybuf[4];
        QString authkeystr=ui->lineEdit_authkey->text().trimmed();
        checkbuflen=checkhexdata(authkeystr,authkeybuf);
        if (checkbuflen!=4){
            QMessageBox::critical(NULL, "提示", "卡片认证密钥输入错误,请输入8位16进制卡认证密钥!");
            ui->lineEdit_authkey->setFocus();
            return;
        }

        unsigned char passwordid;
        switch(ui->comboBox_keymodel->currentIndex()){
        case 4:
            passwordid=0x10;
            break;
        case 3:
            passwordid=0x08;
            break;
        case 2:
            passwordid=0x04;
            break;
        case 1:
            passwordid=0x02;
            break;
        default:
            passwordid=0x01;
            break;
        }

        unsigned char ctrlword=0x04;
        unsigned char status=myiso15693authkey(ctrlword,uidbuf,passwordid,authkeybuf);
        if(status==0){
            mypcdbeep(30);
            QMessageBox::information(NULL, "提示", "UID:"+ uidstr+" 密钥认证成功!");
        }else{
            disperrinf(status);
        }

    }else{
        QMessageBox::critical(NULL, "提示", "函数'iso15693authkey'未正确载入,请查询 "+runDir+" OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确!");
    }
}

四、更改卡片密钥

cpp 复制代码
void MainWindow::on_pb_editkey_clicked()
{
    if(!checkdllos()){return;}       //判断运行目录内动态库文件是否存在
    if (myiso15693writekey != NULL){
        unsigned char uidbuf[8];
        QString uidstr=ui->lineEdit_uid->text().trimmed();
        int checkbuflen=checkhexdata(uidstr,uidbuf);
        if (checkbuflen!=8){
            QMessageBox::critical(NULL, "提示", "需要操作的卡片UID错误,可先执行寻卡操作获取UID!");
            ui->lineEdit_uid->setFocus();
            return;
        }

        unsigned char newkeybuf[4];
        QString newkeystr=ui->lineEdit_newkey->text().trimmed();
        checkbuflen=checkhexdata(newkeystr,newkeybuf);
        if (checkbuflen!=4){
            QMessageBox::critical(NULL, "提示", "卡片新密钥输入错误,请输入8位16进制新密钥!");
            ui->lineEdit_newkey->setFocus();
            return;
        }

        unsigned char passwordid;
        switch(ui->comboBox_keymodel->currentIndex()){
        case 4:
            passwordid=0x10;
            break;
        case 3:
            passwordid=0x08;
            break;
        case 2:
            passwordid=0x04;
            break;
        case 1:
            passwordid=0x02;
            break;
        default:
            passwordid=0x01;
            break;
        }

        unsigned char ctrlword=0x04;
        unsigned char status=myiso15693writekey(ctrlword,uidbuf,passwordid,newkeybuf);
        if(status==0){
            mypcdbeep(30);
            QMessageBox::information(NULL, "提示", "UID:"+ uidstr+" 更改卡密钥成功!");
        }else{
            if(status==47){
                QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", status)+",上一条指令必须是认证密码指令......!");
            }else{
                 disperrinf(status);
            }
        }

    }else{
        QMessageBox::critical(NULL, "提示", "函数'iso15693writekey'未正确载入,请查询 "+runDir+" OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确!");
    }
}

五、读取卡内数据

cpp 复制代码
void MainWindow::on_pb_read_clicked()
{
    if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在
    if(myiso15693readblock != NULL){
        unsigned char status;
        unsigned char flags;
        unsigned char startblock;
        unsigned char blocknum;
        unsigned char uid[8];
        unsigned char revlen[1];
        unsigned char revbuf[255];

        ui->plainTextEdit_data->setPlainText("");

        ui->lineEdit_flags->setText("22");
        flags=34;

        startblock=ui->spinBox_star->value();
        blocknum=startblock+ui->spinBox_num->value();

        QString uidstr=ui->lineEdit_uid->text().trimmed();
        if(uidstr.length()==16 and checkinput(uidstr)){
            bool ok;
            for(int i=0;i<8;i++){
                uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);
            }
        }else{
            QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");
            ui->lineEdit_uid->setFocus();
            return;
        }

        QString blockdata="";
        while (startblock<blocknum){
            status = myiso15693readblock(flags, startblock, 1, uid, revlen, revbuf);
            if(status==0){
                int j=0;

                while(j<revlen[0]){
                    blockdata=blockdata+QString::asprintf("%02X ", revbuf[j]);
                    j++;
                }
                startblock++;
            }else{
                blocknum=startblock-1;
                break;
            }
        }
        if(startblock==blocknum){
            mypcdbeep(30);
            ui->plainTextEdit_data->setPlainText(blockdata);
            QMessageBox::information(NULL, "提示", "读卡成功,卡片UID:"+uidstr);
        }else{
             QMessageBox::critical(NULL, "提示",QString::asprintf("在读取第 :%d", startblock)+",块时返回错误代码:"+QString::asprintf("%d", status));
        }
    }else{
        QMessageBox::critical(NULL, "提示", "函数'iso15693readblock'未正确载入,请查询 "+runDir+" OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确!");
    }
}

六、写入数据

cpp 复制代码
void MainWindow::on_pb_write_clicked()
{
    if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在
    if(myiso15693writeblock != NULL){
        unsigned char status;
        unsigned char flags;
        unsigned char eachblocksize;
        unsigned char startblock;
        unsigned char blocknum;
        unsigned char uid[8];

        unsigned char writebuf[2000];

        ui->lineEdit_flags->setText("22");
        flags=34;

        startblock=ui->spinBox_star->value();
        blocknum=startblock+ui->spinBox_num->value();
        switch(ui->comboBox_cardtype->currentIndex()){
        case 0:
             eachblocksize=4;
             break;
        case 1:
             eachblocksize=8;
             break;
        default:
             eachblocksize=32;
             break;
        }
        int writelen=blocknum*eachblocksize;

        QString uidstr=ui->lineEdit_uid->text().trimmed();
        if(uidstr.length()==16 and checkinput(uidstr)){
             bool ok;
             for(int i=0;i<8;i++){
                uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);
             }
        }else{
             QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");
             ui->lineEdit_uid->setFocus();
             return;
        }

        for(int i=0;i<2000;i++){writebuf[i]=0x00;}


        //检测写卡数据
        QChar ch;
        QString writinf = ui->plainTextEdit_data->toPlainText().trimmed();
        QString writinf1 = "";
        int m = 0;
        int n = 0;
        char s;

        if(writinf.length()<1){
             QMessageBox::critical(NULL, "提示", "请输入正确的16进制写卡数据!");
             ui->plainTextEdit_data->setFocus();
             return;
        }

        ch = writinf.at(0);
        s = writinf.at(0).toLatin1();
        for(int i=0; i<writinf.length() ; i++)
        {
             ch = writinf.at(i);
             s = writinf.at(i).toLatin1();
             if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
             {
                writinf1 += ch;
                n++;
                if(n==2){
                    bool ok;
                    writebuf[m++] = writinf1.toInt(&ok,16);
                    writinf1 = "";
                    n = 0;
                }
             }
             else if(s == ' '){

             }
             else
             {
                QMessageBox::critical(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");
                ui->plainTextEdit_data->setFocus();
                return;
             }
        }

        int i=0;
        while (startblock<blocknum){
             unsigned char wbuf[eachblocksize];
             for(int j=0;j<eachblocksize;j++){
                wbuf[j]=writebuf[i+j];

             }
             status = myiso15693writeblock(flags, startblock, 1, uid, eachblocksize, wbuf);
             if(status==0){
                startblock=startblock+1;
                i=i+eachblocksize;
             }else{
                blocknum=startblock-1;
                break;
             }
        }
        if(startblock==blocknum){
            mypcdbeep(30);
            QMessageBox::information(NULL, "提示", "写卡成功,卡片UID:"+uidstr);
        }else{
             QMessageBox::critical(NULL, "提示",QString::asprintf("在写第 :%d", startblock)+",块时返回错误代码:"+QString::asprintf("%d", status));
        }
    }else{
        QMessageBox::critical(NULL, "提示", "函数'iso15693writeblock'未正确载入,请查询 "+runDir+" OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确!");
    }
}

七、开启块密钥保护功能

cpp 复制代码
void MainWindow::on_pb_setblockauth_clicked()
{
    if(!checkdllos()){return;}       //判断运行目录内动态库文件是否存在
    if (myiso15693protectblock != NULL){
        unsigned char uidbuf[8];
        QString uidstr=ui->lineEdit_uid->text().trimmed();
        int checkbuflen=checkhexdata(uidstr,uidbuf);
        if (checkbuflen!=8){
            QMessageBox::critical(NULL, "提示", "需要操作的卡片UID错误,可先执行寻卡操作获取UID!");
            ui->lineEdit_uid->setFocus();
            return;
        }

        unsigned char ctrlword=0x04;
        unsigned char blockpoint=ui->spinBox_hllockb->value();      //高低块分隔地址
        unsigned char extprotectstatus=ui->comboBox_lowblock->currentIndex()+ui->comboBox_highblock->currentIndex()*16;  //密钥保护方式
        unsigned char status=myiso15693protectblock(ctrlword,uidbuf,blockpoint,extprotectstatus);
        if(status==0){
            mypcdbeep(30);
            QMessageBox::information(NULL, "提示", "UID:"+ uidstr+" 的卡块密码保护设定成功!");
        }else{
            if(status==47){
                QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", status)+",必须都认证读取密码和写入密码成功后再进行块密码保护设定!");
            }else{
                disperrinf(status);
            }
        }
    }else{
        QMessageBox::critical(NULL, "提示", "函数'iso15693protectblock'未正确载入,请查询 "+runDir+" OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确!");
    }
}
相关推荐
一枝小雨7 小时前
【C++】编写通用模板代码的重要技巧:T()
开发语言·c++·笔记·学习笔记
Lynnxiaowen8 小时前
今天我们继续学习shell编程语言的内容
linux·运维·学习·云计算·bash
蒹葭玉树10 小时前
【C++上岸】C++常见面试题目--数据结构篇(第十七期)
数据结构·c++·面试
喜欢你,还有大家10 小时前
Linux笔记14——shell编程基础-8
linux·前端·笔记
skywalk816311 小时前
mayfly-go:web 版 linux、数据库等管理平台
linux·运维·数据库
dbdr090111 小时前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十四天
linux·运维·c语言·python·学习
绵绵细雨中的乡音11 小时前
简易TCP网络程序
linux·网络
风亦辰73914 小时前
大数据开发环境搭建(Linux + Hadoop + Spark + Flink + Hive + Kafka)
大数据·linux·hadoop
Joy-鬼魅14 小时前
vim中常见操作及命令
linux·编辑器·vim