
ICODE SLI系列智能标签是恩智浦(NXP)公司推出的第三代高频(HF)RFID产品常用于物流追踪、产品供应链溯源、医疗设备标签、资产管理 、图书馆防盗等场景ICODE SLI系列包含多个型号各型号区别在于存储容量和安全功能各常用型号参数如下图本示例使用广州荣士电子有限公司发卡器https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1ba9CQERfttid615391857885一、接口函数声明//判断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二、选定发卡器上的卡片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); flags54; QString afistrui-lineEdit_afi-text().trimmed(); if(afistr.length()2 and checkinput(afistr)){ bool ok; afiafistr.toInt(ok,16); }else{ QMessageBox::critical(NULL, 提示,请输入2位16进制AFI); return; } QString masklstrui-lineEdit_masklen-text().trimmed(); if(masklstr.length()2 and checkinput(masklstr)){ bool ok; masklenmasklstr.toInt(ok,16); }else{ QMessageBox::critical(NULL, 提示,请输入2位16进制掩码长度); return; } status myiso15693inventory(flags, afi, masklen, maskuid, uid); if(status0){ mypcdbeep(30); ui-lineEdit_dsfid-setText(QString::asprintf(%02X, uid[0])); QString uidstr; for(int i1;i9;i){ uidstruidstrQString::asprintf(%02X, uid[i]); } ui-lineEdit_uid-setText(uidstr); }else{ disperrinf(status); } }else{ QMessageBox::critical(NULL, 提示, 函数‘iso15693inventory’未正确载入请查询 runDir OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确); } }三、卡密钥认证void MainWindow::on_pb_authkey_clicked() { if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在 if (myiso15693authkey ! NULL){ unsigned char uidbuf[8]; QString uidstrui-lineEdit_uid-text().trimmed(); int checkbuflencheckhexdata(uidstr,uidbuf); if (checkbuflen!8){ QMessageBox::critical(NULL, 提示, 需要操作的卡片UID错误可先执行寻卡操作获取UID); ui-lineEdit_uid-setFocus(); return; } unsigned char authkeybuf[4]; QString authkeystrui-lineEdit_authkey-text().trimmed(); checkbuflencheckhexdata(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: passwordid0x10; break; case 3: passwordid0x08; break; case 2: passwordid0x04; break; case 1: passwordid0x02; break; default: passwordid0x01; break; } unsigned char ctrlword0x04; unsigned char statusmyiso15693authkey(ctrlword,uidbuf,passwordid,authkeybuf); if(status0){ mypcdbeep(30); QMessageBox::information(NULL, 提示, UID uidstr 密钥认证成功); }else{ disperrinf(status); } }else{ QMessageBox::critical(NULL, 提示, 函数‘iso15693authkey’未正确载入请查询 runDir OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确); } }四、更改卡片密钥void MainWindow::on_pb_editkey_clicked() { if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在 if (myiso15693writekey ! NULL){ unsigned char uidbuf[8]; QString uidstrui-lineEdit_uid-text().trimmed(); int checkbuflencheckhexdata(uidstr,uidbuf); if (checkbuflen!8){ QMessageBox::critical(NULL, 提示, 需要操作的卡片UID错误可先执行寻卡操作获取UID); ui-lineEdit_uid-setFocus(); return; } unsigned char newkeybuf[4]; QString newkeystrui-lineEdit_newkey-text().trimmed(); checkbuflencheckhexdata(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: passwordid0x10; break; case 3: passwordid0x08; break; case 2: passwordid0x04; break; case 1: passwordid0x02; break; default: passwordid0x01; break; } unsigned char ctrlword0x04; unsigned char statusmyiso15693writekey(ctrlword,uidbuf,passwordid,newkeybuf); if(status0){ mypcdbeep(30); QMessageBox::information(NULL, 提示, UID uidstr 更改卡密钥成功); }else{ if(status47){ QMessageBox::critical(NULL, 提示, QString::asprintf(错误代码%d, status)上一条指令必须是认证密码指令......); }else{ disperrinf(status); } } }else{ QMessageBox::critical(NULL, 提示, 函数‘iso15693writekey’未正确载入请查询 runDir OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确); } }五、读取卡内数据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); flags34; startblockui-spinBox_star-value(); blocknumstartblockui-spinBox_num-value(); QString uidstrui-lineEdit_uid-text().trimmed(); if(uidstr.length()16 and checkinput(uidstr)){ bool ok; for(int i0;i8;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 (startblockblocknum){ status myiso15693readblock(flags, startblock, 1, uid, revlen, revbuf); if(status0){ int j0; while(jrevlen[0]){ blockdatablockdataQString::asprintf(%02X , revbuf[j]); j; } startblock; }else{ blocknumstartblock-1; break; } } if(startblockblocknum){ mypcdbeep(30); ui-plainTextEdit_data-setPlainText(blockdata); QMessageBox::information(NULL, 提示, 读卡成功卡片UIDuidstr); }else{ QMessageBox::critical(NULL, 提示,QString::asprintf(在读取第 %d, startblock)块时返回错误代码QString::asprintf(%d, status)); } }else{ QMessageBox::critical(NULL, 提示, 函数‘iso15693readblock’未正确载入请查询 runDir OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确); } }六、写入数据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); flags34; startblockui-spinBox_star-value(); blocknumstartblockui-spinBox_num-value(); switch(ui-comboBox_cardtype-currentIndex()){ case 0: eachblocksize4; break; case 1: eachblocksize8; break; default: eachblocksize32; break; } int writelenblocknum*eachblocksize; QString uidstrui-lineEdit_uid-text().trimmed(); if(uidstr.length()16 and checkinput(uidstr)){ bool ok; for(int i0;i8;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 i0;i2000;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 i0; iwritinf.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(n2){ 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 i0; while (startblockblocknum){ unsigned char wbuf[eachblocksize]; for(int j0;jeachblocksize;j){ wbuf[j]writebuf[ij]; } status myiso15693writeblock(flags, startblock, 1, uid, eachblocksize, wbuf); if(status0){ startblockstartblock1; iieachblocksize; }else{ blocknumstartblock-1; break; } } if(startblockblocknum){ mypcdbeep(30); QMessageBox::information(NULL, 提示, 写卡成功卡片UIDuidstr); }else{ QMessageBox::critical(NULL, 提示,QString::asprintf(在写第 %d, startblock)块时返回错误代码QString::asprintf(%d, status)); } }else{ QMessageBox::critical(NULL, 提示, 函数‘iso15693writeblock’未正确载入请查询 runDir OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确); } }七、开启块密钥保护功能void MainWindow::on_pb_setblockauth_clicked() { if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在 if (myiso15693protectblock ! NULL){ unsigned char uidbuf[8]; QString uidstrui-lineEdit_uid-text().trimmed(); int checkbuflencheckhexdata(uidstr,uidbuf); if (checkbuflen!8){ QMessageBox::critical(NULL, 提示, 需要操作的卡片UID错误可先执行寻卡操作获取UID); ui-lineEdit_uid-setFocus(); return; } unsigned char ctrlword0x04; unsigned char blockpointui-spinBox_hllockb-value(); //高低块分隔地址 unsigned char extprotectstatusui-comboBox_lowblock-currentIndex()ui-comboBox_highblock-currentIndex()*16; //密钥保护方式 unsigned char statusmyiso15693protectblock(ctrlword,uidbuf,blockpoint,extprotectstatus); if(status0){ mypcdbeep(30); QMessageBox::information(NULL, 提示, UID uidstr 的卡块密码保护设定成功); }else{ if(status47){ QMessageBox::critical(NULL, 提示, QString::asprintf(错误代码%d, status)必须都认证读取密码和写入密码成功后再进行块密码保护设定); }else{ disperrinf(status); } } }else{ QMessageBox::critical(NULL, 提示, 函数‘iso15693protectblock’未正确载入请查询 runDir OUR_MIFARE.dll、libOURMIFARE.so文件版本是否正确); } }