• Qt_C++读写NFC标签Ntag支持windows国产linux操作系统


    本示例使用的发卡器:Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) 

    ntag2标签存储结构说明
    1. #include "mainwindow.h"
    2. #include "./ui_mainwindow.h"
    3. #include
    4. #include "QLibrary"
    5. #include "QMessageBox"
    6. //本示例可在windows、linux系统内编译、运行
    7. //判断windows、linux系统,声明动态库函数----------------------------------------------------------------------------------------------------------------------------------------------
    8. //让读写器发出声音
    9. typedef unsigned char (*pcdbeep)(unsigned long xms);
    10. #ifdef Q_OS_WIN
    11. pcdbeep mypcdbeep = (pcdbeep)QLibrary("OUR_MIFARE.dll").resolve("pcdbeep");
    12. #else
    13. pcdbeep mypcdbeep = (pcdbeep)QLibrary("./libOURIDR.so").resolve("pcdbeep");
    14. #endif
    15. //返回本读写器独一无二的设备编号
    16. typedef unsigned char (*pcdgetdevicenumber)(unsigned char *devicenumber);
    17. #ifdef Q_OS_WIN
    18. pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("OUR_MIFARE.dll").resolve("pcdgetdevicenumber");
    19. #else
    20. pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("./libOURIDR.so").resolve("pcdgetdevicenumber");
    21. #endif
    22. //读取卡片的uid
    23. typedef unsigned char (*piccrequest_ul)(unsigned char *serial);
    24. #ifdef Q_OS_WIN
    25. piccrequest_ul mypiccrequest_ul = (piccrequest_ul)QLibrary("OUR_MIFARE.dll").resolve("piccrequest_ul");
    26. #else
    27. piccrequest_ul mypiccrequest_ul = (piccrequest_ul)QLibrary("./libOURIDR.so").resolve("piccrequest_ul");
    28. #endif
    29. //读取卡片4页数据
    30. typedef unsigned char (*piccread_ul)(unsigned char blockadd,unsigned char *piccdata);
    31. #ifdef Q_OS_WIN
    32. piccread_ul mypiccread_ul = (piccread_ul)QLibrary("OUR_MIFARE.dll").resolve("piccread_ul");
    33. #else
    34. piccread_ul mypiccread_ul = (piccread_ul)QLibrary("./libOURIDR.so").resolve("piccread_ul");
    35. #endif
    36. //写1页数据
    37. typedef unsigned char (*piccwrite_ul)(unsigned char blockadd,unsigned char *piccdata);
    38. #ifdef Q_OS_WIN
    39. piccwrite_ul mypiccwrite_ul = (piccwrite_ul)QLibrary("OUR_MIFARE.dll").resolve("piccwrite_ul");
    40. #else
    41. piccwrite_ul mypiccwrite_ul = (piccwrite_ul)QLibrary("./libOURIDR.so").resolve("piccwrite_ul");
    42. #endif
    43. //认证卡片密码
    44. typedef unsigned char (*piccauthkey_ntag)(unsigned char *picckey,unsigned char *piccntagpack);
    45. #ifdef Q_OS_WIN
    46. piccauthkey_ntag mypiccauthkey_ntag = (piccauthkey_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccauthkey_ntag");
    47. #else
    48. piccauthkey_ntag mypiccauthkey_ntag = (piccauthkey_ntag)QLibrary("./libOURIDR.so").resolve("piccauthkey_ntag");
    49. #endif
    50. //读取卡的版本号及型号
    51. typedef unsigned char (*piccgetversion_ntag)(unsigned char *mypiccversiondata);
    52. #ifdef Q_OS_WIN
    53. piccgetversion_ntag mypiccgetversion_ntag = (piccgetversion_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccgetversion_ntag");
    54. #else
    55. piccgetversion_ntag mypiccgetversion_ntag = (piccgetversion_ntag)QLibrary("./libOURIDR.so").resolve("piccgetversion_ntag");
    56. #endif
    57. //读取卡的签字信息
    58. typedef unsigned char (*piccreadsig_ntag)(unsigned char *piccsigdata);
    59. #ifdef Q_OS_WIN
    60. piccreadsig_ntag mypiccreadsig_ntag = (piccreadsig_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccreadsig_ntag");
    61. #else
    62. piccreadsig_ntag mypiccreadsig_ntag = (piccreadsig_ntag)QLibrary("./libOURIDR.so").resolve("piccreadsig_ntag");
    63. #endif
    64. //读取卡操作的单向计数器(卡操作流水号)
    65. typedef unsigned char (*piccreadcnt_ntag)(unsigned char *mypicccntdata);
    66. #ifdef Q_OS_WIN
    67. piccreadcnt_ntag mypiccreadcnt_ntag = (piccreadcnt_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccreadcnt_ntag");
    68. #else
    69. piccreadcnt_ntag mypiccreadcnt_ntag = (piccreadcnt_ntag)QLibrary("./libOURIDR.so").resolve("piccreadcnt_ntag");
    70. #endif
    71. //锁定页数据
    72. typedef unsigned char (*picclock_ntag)(unsigned char locktype,unsigned char *mypicclockdata);
    73. #ifdef Q_OS_WIN
    74. picclock_ntag mypicclock_ntag = (picclock_ntag)QLibrary("OUR_MIFARE.dll").resolve("picclock_ntag");
    75. #else
    76. picclock_ntag mypicclock_ntag = (picclock_ntag)QLibrary("./libOURIDR.so").resolve("picclock_ntag");
    77. #endif
    78. //初始化卡,开启读写卡密码保护功能
    79. typedef unsigned char (*piccinit_ntag)(unsigned char ctrlword,unsigned char *serial,unsigned char *pickey,unsigned char *configdata);
    80. #ifdef Q_OS_WIN
    81. piccinit_ntag mypiccinit_ntag = (piccinit_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccinit_ntag");
    82. #else
    83. piccinit_ntag mypiccinit_ntag = (piccinit_ntag)QLibrary("./libOURIDR.so").resolve("piccinit_ntag");
    84. #endif
    85. //轻松读卡
    86. typedef unsigned char (*piccreadex_ntag)(unsigned char ctrlword,unsigned char *serial,unsigned char *pickey,unsigned char blockadd,unsigned char blocksize,unsigned char *picdata);
    87. #ifdef Q_OS_WIN
    88. piccreadex_ntag mypiccreadex_ntag = (piccreadex_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccreadex_ntag");
    89. #else
    90. piccreadex_ntag mypiccreadex_ntag = (piccreadex_ntag)QLibrary("./libOURIDR.so").resolve("piccreadex_ntag");
    91. #endif
    92. //轻松写卡
    93. typedef unsigned char (*piccwriteex_ntag)(unsigned char ctrlword,unsigned char *serial,unsigned char *pickey,unsigned char blockadd,unsigned char blocksize,unsigned char *picdata);
    94. #ifdef Q_OS_WIN
    95. piccwriteex_ntag mypiccwriteex_ntag = (piccwriteex_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccwriteex_ntag");
    96. #else
    97. piccwriteex_ntag mypiccwriteex_ntag = (piccwriteex_ntag)QLibrary("./libOURIDR.so").resolve("piccwriteex_ntag");
    98. #endif
    99. //检测输入数据是否为16进制数------------------------------------------------------------------------------------------------------------------------------------------------------------
    100. static bool checkinput(QString inputstr){
    101. QString inputyes="0123456789abcdefABCDEF";
    102. for(int i=0;ilength();i++){
    103. if(inputyes.contains(inputstr.mid(i,1),Qt::CaseSensitive)){
    104. }else{return false;}
    105. }
    106. return true;
    107. }
    108. //检测动态库文件是否在运行目录内----------------------------------------------------------------------------------------------------------------------------------------------------------
    109. static bool checkdllos(){
    110. #ifdef Q_OS_WIN
    111. QLibrary mylib("OUR_MIFARE.dll");
    112. if (!mylib.load()){ //判断windows系统下,OUR_MIFARE.dll是否在运行目录内
    113. QMessageBox::information(NULL, "提示", "请将OUR_MIFARE.dll文件拷贝到生成exe文件相同目录下!");
    114. return false;
    115. }else{return true;}
    116. #else
    117. QLibrary mylib("./libOURIDR.so");
    118. if (!mylib.load()){ //判断linux系统下,libOURIDR.so是否正运行目录内
    119. QMessageBox::information(NULL, "提示", "请将libOURIDR.so文件拷贝到生成的运行文件相同目录下!");
    120. return false;
    121. }else{return true;}
    122. #endif
    123. }
    124. //显示返回的错误代码信息-----------------------------------------------------------------------------------------------------------------------------------------------------------------
    125. static void disperrinf(unsigned char result){
    126. switch (result) {
    127. case 1:
    128. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!");
    129. break;
    130. case 2:
    131. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",第0块已被读出,但1~2块读取失败。卡序列号已被读出来!");
    132. break;
    133. case 3:
    134. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",第0、1块已被读出,但2块读取失败。卡序列号已被读出来!");
    135. break;
    136. case 8:
    137. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未寻到卡,请重新拿开卡后再放到感应区!");
    138. break;
    139. case 9:
    140. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!");
    141. break;
    142. case 10:
    143. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",该卡可能已被休眠,无法选中卡片!");
    144. break;
    145. case 11:
    146. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",密码装载失败!");
    147. break;
    148. case 12:
    149. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",卡片密码认证失败!");
    150. break;
    151. case 13:
    152. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",读页数据失败,可能需要验证密码!");
    153. break;
    154. case 14:
    155. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",写页数据失败,可能需要验证密码!");
    156. break;
    157. case 18:
    158. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",写UID失败,此卡可能不是UID卡!");
    159. break;
    160. case 22:
    161. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",动态库或驱动程序异常!");
    162. break;
    163. case 23:
    164. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",驱动程序错误或发卡器尚未安装!");
    165. break;
    166. case 24:
    167. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",操作超时,一般是动态库没有反应!");
    168. break;
    169. case 25:
    170. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",发送字数不够!");
    171. break;
    172. case 26:
    173. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",驱动程序错误或发卡器尚未安装!");
    174. break;
    175. case 27:
    176. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",操作超时,一般是动态库没有反应!");
    177. break;
    178. case 28:
    179. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",发送字数不够!");
    180. break;
    181. default:
    182. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未知的错误信息!");
    183. break;
    184. }
    185. }
    186. MainWindow::MainWindow(QWidget *parent)
    187. : QMainWindow(parent)
    188. , ui(new Ui::MainWindow)
    189. {
    190. ui->setupUi(this);
    191. }
    192. MainWindow::~MainWindow()
    193. {
    194. delete ui;
    195. }
    196. void MainWindow::on_pb_beep_clicked()
    197. {
    198. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    199. unsigned char status;
    200. status = mypcdbeep(30);
    201. if(status==0){
    202. }
    203. else
    204. {
    205. disperrinf(status);
    206. }
    207. }
    208. void MainWindow::on_pb_getdevnum_clicked()
    209. {
    210. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    211. unsigned char devicenumber[4]; //设备编号缓冲
    212. unsigned char status; //函数返回状态
    213. status = mypcdgetdevicenumber(devicenumber);
    214. if(status==0){
    215. mypcdbeep(30);
    216. QMessageBox::information(NULL, "提示", QString::asprintf("设备编号:%03d-%03d-%03d-%03d", devicenumber[0],devicenumber[1],devicenumber[2],devicenumber[3]));
    217. }
    218. else
    219. {
    220. disperrinf(status);
    221. }
    222. }
    223. void MainWindow::on_pb_request_clicked()
    224. {
    225. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    226. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    227. unsigned char status; //函数返回状态
    228. ui->lineEdit_uid->setText("");
    229. status = mypiccrequest_ul(mypiccserial);
    230. if(status==0){
    231. mypcdbeep(30);
    232. QString uidstr="" ;
    233. for (int i = 0; i < 7; i++) {
    234. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    235. }
    236. ui->lineEdit_uid->setText(uidstr);
    237. }
    238. else
    239. {
    240. disperrinf(status);
    241. }
    242. }
    243. void MainWindow::on_pb_read4page_clicked()
    244. {
    245. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    246. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    247. unsigned char status; //函数返回状态
    248. unsigned char blockadd; //读卡起始页地址
    249. unsigned char mypicdata[16]; //读卡数据缓冲
    250. ui->lineEdit_uid->setText("");
    251. ui->plainTextEdit_data->setPlainText("");
    252. status = mypiccrequest_ul(mypiccserial);
    253. if(status==0){
    254. QString uidstr="" ;
    255. for (int i = 0; i < 7; i++) {
    256. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    257. }
    258. ui->lineEdit_uid->setText(uidstr);
    259. blockadd=ui->spinBox_star_rw->value();
    260. status = mypiccread_ul(blockadd,mypicdata);
    261. if(status==0){
    262. QString datastr="" ;
    263. for (int i = 0; i < 16; i++) {
    264. datastr=datastr+QString::asprintf("%02X ",mypicdata[i]);
    265. }
    266. ui->plainTextEdit_data->setPlainText(datastr);
    267. mypcdbeep(30);
    268. QMessageBox::information(NULL, "提示","读卡成功,卡号:"+uidstr );
    269. }else{
    270. disperrinf(status);
    271. }
    272. }
    273. else
    274. {
    275. disperrinf(status);
    276. }
    277. }
    278. void MainWindow::on_pb_write1page_clicked()
    279. {
    280. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    281. //检测写卡数据
    282. unsigned char piccdatabuf[255]; //写卡数据缓冲
    283. QChar ch;
    284. QString writinf = ui->plainTextEdit_data->toPlainText().trimmed();
    285. QString writinf1 = "";
    286. int m = 0;
    287. int n = 0;
    288. char s;
    289. if(writinf.length()<1){
    290. QMessageBox::critical(NULL, "提示", "请输入正确的16进制写卡数据!");
    291. ui->plainTextEdit_data->setFocus();
    292. return;
    293. }
    294. ch = writinf.at(0);
    295. s = writinf.at(0).toLatin1();
    296. for(int i=0; ilength() ; i++)
    297. {
    298. ch = writinf.at(i);
    299. s = writinf.at(i).toLatin1();
    300. if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
    301. {
    302. writinf1 += ch;
    303. n++;
    304. if(n==2){
    305. bool ok;
    306. piccdatabuf[m++] = writinf1.toInt(&ok,16);
    307. writinf1 = "";
    308. n = 0;
    309. if(m>=49){
    310. break;
    311. }
    312. }
    313. }
    314. else if(s == ' '){
    315. }
    316. else
    317. {
    318. QMessageBox::critical(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");
    319. ui->plainTextEdit_data->setFocus();
    320. return;
    321. }
    322. }
    323. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    324. unsigned char status; //函数返回状态
    325. unsigned char blockadd; //写卡起始页地址
    326. ui->lineEdit_uid->setText("");
    327. status = mypiccrequest_ul(mypiccserial);
    328. if(status==0){
    329. QString uidstr="" ;
    330. for (int i = 0; i < 7; i++) {
    331. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    332. }
    333. ui->lineEdit_uid->setText(uidstr);
    334. blockadd=ui->spinBox_star_rw->value();
    335. status = mypiccwrite_ul(blockadd,piccdatabuf);
    336. if(status==0){
    337. mypcdbeep(30);
    338. QMessageBox::information(NULL, "提示","写卡成功,卡号:"+uidstr );
    339. }else{
    340. disperrinf(status);
    341. }
    342. }
    343. else
    344. {
    345. disperrinf(status);
    346. }
    347. }
    348. void MainWindow::on_pb_auth_clicked()
    349. {
    350. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    351. unsigned char mypickey[4]; //认证密码
    352. QString keystr=ui->lineEdit_authkey->text().trimmed();
    353. if(keystr.length()==8 and checkinput(keystr)){
    354. bool ok;
    355. for(int i=0;i<4;i++){
    356. mypickey[i]=QString(keystr.mid(i*2,2)).toInt(&ok,16);
    357. }
    358. }else{
    359. QMessageBox::critical(NULL, "提示","请输入8位16进制卡认证密码!");
    360. ui->lineEdit_authkey->setFocus();
    361. return;
    362. }
    363. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    364. unsigned char status; //函数返回状态
    365. unsigned char mypiccntagpack[2]; //认证后返回的确认码
    366. ui->lineEdit_uid->setText("");
    367. status = mypiccrequest_ul(mypiccserial);
    368. if(status==0){
    369. QString uidstr="" ;
    370. for (int i = 0; i < 7; i++) {
    371. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    372. }
    373. ui->lineEdit_uid->setText(uidstr);
    374. status = mypiccauthkey_ntag(mypickey,mypiccntagpack);
    375. if(status==0){
    376. mypcdbeep(30);
    377. QMessageBox::information(NULL, "提示","卡密码认证成功,卡号:"+uidstr );
    378. }else{
    379. disperrinf(status);
    380. }
    381. }
    382. else
    383. {
    384. disperrinf(status);
    385. }
    386. }
    387. void MainWindow::on_pb_getver_clicked()
    388. {
    389. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    390. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    391. unsigned char status; //函数返回状态
    392. unsigned char mypiccversiondata[8]; //卡版本及型号缓冲
    393. ui->lineEdit_uid->setText("");
    394. status = mypiccrequest_ul(mypiccserial);
    395. if(status==0){
    396. QString uidstr="" ;
    397. for (int i = 0; i < 7; i++) {
    398. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    399. }
    400. ui->lineEdit_uid->setText(uidstr);
    401. status = mypiccgetversion_ntag(mypiccversiondata);
    402. if(status==0){
    403. QString datastr="" ;
    404. for (int i = 0; i < 8; i++) {
    405. datastr=datastr+QString::asprintf("%02X",mypiccversiondata[i]);
    406. }
    407. mypcdbeep(30);
    408. QMessageBox::information(NULL, "提示","读卡成功,卡号:"+uidstr +",版本型号:"+datastr);
    409. }else{
    410. disperrinf(status);
    411. }
    412. }
    413. else
    414. {
    415. disperrinf(status);
    416. }
    417. }
    418. void MainWindow::on_pb_getsign_clicked()
    419. {
    420. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    421. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    422. unsigned char status; //函数返回状态
    423. unsigned char piccsigdata[32]; //卡签名信息
    424. ui->lineEdit_uid->setText("");
    425. status = mypiccrequest_ul(mypiccserial);
    426. if(status==0){
    427. QString uidstr="" ;
    428. for (int i = 0; i < 7; i++) {
    429. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    430. }
    431. ui->lineEdit_uid->setText(uidstr);
    432. status = mypiccreadsig_ntag(piccsigdata);
    433. if(status==0){
    434. QString datastr="" ;
    435. for (int i = 0; i < 32; i++) {
    436. datastr=datastr+QString::asprintf("%02X",piccsigdata[i]);
    437. }
    438. mypcdbeep(30);
    439. QMessageBox::information(NULL, "提示","卡签字信息:"+datastr );
    440. }else{
    441. disperrinf(status);
    442. }
    443. }
    444. else
    445. {
    446. disperrinf(status);
    447. }
    448. }
    449. void MainWindow::on_pb_getcounter_clicked()
    450. {
    451. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    452. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    453. unsigned char status; //函数返回状态
    454. unsigned char mypicccntdata[3]; //卡操作计数器缓冲
    455. ui->lineEdit_uid->setText("");
    456. status = mypiccrequest_ul(mypiccserial);
    457. if(status==0){
    458. QString uidstr="" ;
    459. for (int i = 0; i < 7; i++) {
    460. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    461. }
    462. ui->lineEdit_uid->setText(uidstr);
    463. status = mypiccreadcnt_ntag(mypicccntdata);
    464. if(status==0){
    465. QString datastr="" ;
    466. for (int i = 0; i < 3; i++) {
    467. datastr=datastr+QString::asprintf("%02X",mypicccntdata[i]);
    468. }
    469. mypcdbeep(30);
    470. QMessageBox::information(NULL, "提示","读卡成功,卡号:"+uidstr +",卡操作的单向计数器:"+datastr);
    471. }else{
    472. if(status==13){
    473. QMessageBox::critical(NULL, "提示","卡号:"+uidstr +",可能是计数器功能尚未启用或卡片不支持计数功能!");
    474. }else{
    475. disperrinf(status);
    476. }
    477. }
    478. }
    479. else
    480. {
    481. disperrinf(status);
    482. }
    483. }
    484. void MainWindow::on_pb_staticlock_clicked()
    485. {
    486. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    487. int answ=QMessageBox::question (this, "警告", "你确定要开启卡片的静态锁吗 ?锁定后3-15页数据不能再次修改!", QMessageBox::Ok, QMessageBox::Cancel);
    488. if (answ ==1024){
    489. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    490. unsigned char status; //函数返回状态
    491. unsigned char mypicclockdata[4]; //锁定状态
    492. ui->lineEdit_uid->setText("");
    493. status = mypiccrequest_ul(mypiccserial);
    494. if(status==0){
    495. QString uidstr="" ;
    496. for (int i = 0; i < 7; i++) {
    497. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    498. }
    499. ui->lineEdit_uid->setText(uidstr);
    500. mypicclockdata[0] = 0x00;
    501. mypicclockdata[1] = 0x00;
    502. mypicclockdata[2] = 0xF9;
    503. mypicclockdata[3] = 0x00;
    504. status = mypicclock_ntag(0,mypicclockdata);
    505. if(status==0){
    506. mypcdbeep(30);
    507. QMessageBox::information(NULL, "提示","3~15页静态锁数据写入成功!" );
    508. }else{
    509. disperrinf(status);
    510. }
    511. }
    512. else
    513. {
    514. disperrinf(status);
    515. }
    516. }
    517. }
    518. void MainWindow::on_pb_dynamiclock_clicked()
    519. {
    520. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    521. int answ=QMessageBox::question (this, "警告", "你确定要开启卡片的动态锁吗 ?锁定后16及以后的页数据不能再次修改!", QMessageBox::Ok, QMessageBox::Cancel);
    522. if (answ ==1024){
    523. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    524. unsigned char status; //函数返回状态
    525. unsigned char mypicclockdata[4]; //锁定状态
    526. ui->lineEdit_uid->setText("");
    527. status = mypiccrequest_ul(mypiccserial);
    528. if(status==0){
    529. QString uidstr="" ;
    530. for (int i = 0; i < 7; i++) {
    531. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    532. }
    533. ui->lineEdit_uid->setText(uidstr);
    534. mypicclockdata[0] = 0x01;
    535. mypicclockdata[1] = 0x01;
    536. mypicclockdata[2] = 0x00;
    537. mypicclockdata[3] = 0x00;
    538. status = mypicclock_ntag(1,mypicclockdata);
    539. if(status==0){
    540. mypcdbeep(30);
    541. QMessageBox::information(NULL, "提示","16之后页动态锁数据写入成功!" );
    542. }else{
    543. disperrinf(status);
    544. }
    545. }
    546. else
    547. {
    548. disperrinf(status);
    549. }
    550. }
    551. }
    552. void MainWindow::on_pb_init_clicked()
    553. {
    554. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    555. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    556. unsigned char status; //函数返回状态
    557. unsigned char myctrlword; //写卡控制字
    558. unsigned char mypiccdata[16]; //卡配置数据
    559. unsigned char mypickey[4]; //卡片认证密码
    560. ui->lineEdit_uid->setText("");
    561. if(ui->checkbox_sele->isChecked()){ //选择先认证卡密码成功再读写卡
    562. QString authkey=ui->lineEdit_authkey->text().trimmed();
    563. if(authkey.length()==8 and checkinput(authkey)){
    564. for(int i=0;i<4;i++){
    565. bool ok;
    566. mypickey[i]=QString(authkey.mid(i*2,2)).toInt(&ok,16);
    567. }
    568. myctrlword=0x10;
    569. }else{
    570. QMessageBox::critical(NULL, "提示","请输入8位16进制认证密码!");
    571. ui->lineEdit_authkey->setFocus();
    572. return;
    573. }
    574. }else{
    575. myctrlword=0x00; //无需认证卡密码
    576. }
    577. if(ui->comboBox_init->currentIndex()==0){ //开启卡密码保护功能
    578. int answ=QMessageBox::question (this, "警告", " 您确定要开启卡片的密码保护功能吗 ?开启密码保护功能后需记住卡片的新密码,否则卡片将报废!", QMessageBox::Ok, QMessageBox::Cancel);
    579. if (answ !=1024){
    580. return;
    581. }
    582. mypiccdata[0] = 0x00;
    583. mypiccdata[1] = 0x00;
    584. mypiccdata[2] = 0x00;
    585. mypiccdata[3] = ui->spinBox_star->value(); //密码保护起始页地址
    586. myctrlword=myctrlword+0x01;
    587. mypiccdata[4] = (ui->spinBox_num->value() % 8); //认证次数
    588. if(ui->checkBox_readen->isChecked()){
    589. mypiccdata[4] =mypiccdata[4] +0x80; //开启读密码保护
    590. }
    591. mypiccdata[5] = 0x00; //启用计数器
    592. mypiccdata[6] = 0x00;
    593. mypiccdata[7] = 0x00;
    594. myctrlword=myctrlword+0x02;
    595. QString newkey=ui->lineEdit_authkey->text().trimmed();
    596. if(newkey.length()==8 and checkinput(newkey)){
    597. for(int i=0;i<4;i++){
    598. bool ok;
    599. mypiccdata[8+i]=QString(newkey.mid(i*2,2)).toInt(&ok,16);
    600. }
    601. mypiccdata[12] = 0x16;
    602. mypiccdata[13] = 0x16;
    603. mypiccdata[14] = 0x00;
    604. mypiccdata[15] = 0x00;
    605. myctrlword=myctrlword+0x04;
    606. }else{
    607. QMessageBox::critical(NULL, "提示","请输入8位16进制认证密码!");
    608. return;
    609. }
    610. }else{ //取消卡密码保护功能
    611. mypiccdata[0] = 0x00;
    612. mypiccdata[1] = 0x00;
    613. mypiccdata[2] = 0x00;
    614. mypiccdata[3] = 0xff;
    615. myctrlword=myctrlword+0x01;
    616. mypiccdata[4] = 0x00;
    617. mypiccdata[5] = 0x00;
    618. mypiccdata[6] = 0x00;
    619. mypiccdata[7] = 0x00;
    620. myctrlword=myctrlword+0x02;
    621. }
    622. status = mypiccinit_ntag(myctrlword,mypiccserial,mypickey,mypiccdata);
    623. if(status==0){
    624. QString uidstr="" ;
    625. for (int i = 0; i < 7; i++) {
    626. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    627. }
    628. ui->lineEdit_uid->setText(uidstr);
    629. mypcdbeep(30);
    630. QMessageBox::information(NULL, "提示","卡片初始化成功,卡号:"+uidstr );
    631. }
    632. else
    633. {
    634. disperrinf(status);
    635. }
    636. }
    637. void MainWindow::on_pb_easy_read_clicked()
    638. {
    639. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    640. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    641. unsigned char status; //函数返回状态
    642. unsigned char myctrlword; //写卡控制字
    643. unsigned char mypicdata[48]; //读卡数据缓冲
    644. unsigned char mypickey[4]; //卡片认证密码
    645. unsigned char blockadd; //操作超始页地址
    646. unsigned char blocksize; //操作页数
    647. if(ui->spinBox_num_rw->value()>12 || ui->spinBox_num_rw->value()<1){
    648. QMessageBox::critical(NULL, "提示","一次最多只能读12页!超过12页请分次读取。");
    649. return;
    650. }
    651. ui->lineEdit_uid->setText("");
    652. ui->plainTextEdit_data->setPlainText("");
    653. if(ui->checkbox_sele->isChecked()){ //选择先认证卡密码成功再读写卡
    654. QString authkey=ui->lineEdit_authkey->text().trimmed();
    655. if(authkey.length()==8 and checkinput(authkey)){
    656. for(int i=0;i<4;i++){
    657. bool ok;
    658. mypickey[i]=QString(authkey.mid(i*2,2)).toInt(&ok,16);
    659. }
    660. myctrlword=0x10;
    661. }else{
    662. QMessageBox::critical(NULL, "提示","请输入8位16进制认证密码!");
    663. ui->lineEdit_authkey->setFocus();
    664. return;
    665. }
    666. }else{
    667. myctrlword=0x00; //无需认证卡密码
    668. }
    669. blockadd=ui->spinBox_star_rw->value();
    670. blocksize=ui->spinBox_num_rw->value();
    671. status = mypiccreadex_ntag(myctrlword, mypiccserial, mypickey, blockadd, blocksize, mypicdata);
    672. if(status==0){
    673. QString uidstr="" ;
    674. for (int i = 0; i < 7; i++) {
    675. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    676. }
    677. ui->lineEdit_uid->setText(uidstr);
    678. QString datastr="" ;
    679. for (int i = 0; i < blocksize*4; i++) {
    680. datastr=datastr+QString::asprintf("%02X ",mypicdata[i]);
    681. }
    682. ui->plainTextEdit_data->setPlainText(datastr);
    683. mypcdbeep(30);
    684. QMessageBox::information(NULL, "提示","读卡成功,卡号:"+uidstr );
    685. }
    686. else
    687. {
    688. disperrinf(status);
    689. }
    690. }
    691. void MainWindow::on_pb_easy_write_clicked()
    692. {
    693. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    694. unsigned char mypiccserial[7]; //卡唯一序列号uid缓冲
    695. unsigned char status; //函数返回状态
    696. unsigned char myctrlword; //写卡控制字
    697. unsigned char mypickey[4]; //卡片认证密码
    698. unsigned char blockadd; //操作超始页地址
    699. unsigned char blocksize; //操作页数
    700. if(ui->spinBox_num_rw->value()>11 || ui->spinBox_num_rw->value()<1){
    701. QMessageBox::critical(NULL, "提示","一次最多只能写11页!超过11页请分次写入。");
    702. return;
    703. }
    704. //检测写卡数据
    705. unsigned char piccdatabuf[255]; //写卡数据缓冲
    706. QChar ch;
    707. QString writinf = ui->plainTextEdit_data->toPlainText().trimmed();
    708. QString writinf1 = "";
    709. int m = 0;
    710. int n = 0;
    711. char s;
    712. if(writinf.length()<1){
    713. QMessageBox::critical(NULL, "提示", "请输入正确的16进制写卡数据!");
    714. ui->plainTextEdit_data->setFocus();
    715. return;
    716. }
    717. ch = writinf.at(0);
    718. s = writinf.at(0).toLatin1();
    719. for(int i=0; ilength() ; i++)
    720. {
    721. ch = writinf.at(i);
    722. s = writinf.at(i).toLatin1();
    723. if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
    724. {
    725. writinf1 += ch;
    726. n++;
    727. if(n==2){
    728. bool ok;
    729. piccdatabuf[m++] = writinf1.toInt(&ok,16);
    730. writinf1 = "";
    731. n = 0;
    732. if(m>=49){
    733. break;
    734. }
    735. }
    736. }
    737. else if(s == ' '){
    738. }
    739. else
    740. {
    741. QMessageBox::critical(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");
    742. ui->plainTextEdit_data->setFocus();
    743. return;
    744. }
    745. }
    746. ui->lineEdit_uid->setText("");
    747. if(ui->checkbox_sele->isChecked()){ //选择先认证卡密码成功再读写卡
    748. QString authkey=ui->lineEdit_authkey->text().trimmed();
    749. if(authkey.length()==8 and checkinput(authkey)){
    750. for(int i=0;i<4;i++){
    751. bool ok;
    752. mypickey[i]=QString(authkey.mid(i*2,2)).toInt(&ok,16);
    753. }
    754. myctrlword=0x10;
    755. }else{
    756. QMessageBox::critical(NULL, "提示","请输入8位16进制认证密码!");
    757. ui->lineEdit_authkey->setFocus();
    758. return;
    759. }
    760. }else{
    761. myctrlword=0x00; //无需认证卡密码
    762. }
    763. blockadd=ui->spinBox_star_rw->value();
    764. blocksize=ui->spinBox_num_rw->value();
    765. status = mypiccwriteex_ntag(myctrlword, mypiccserial, mypickey, blockadd, blocksize, piccdatabuf);
    766. if(status==0){
    767. QString uidstr="" ;
    768. for (int i = 0; i < 7; i++) {
    769. uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);
    770. }
    771. ui->lineEdit_uid->setText(uidstr);
    772. mypcdbeep(30);
    773. QMessageBox::information(NULL, "提示","写卡成功,卡号:"+uidstr );
    774. }
    775. else
    776. {
    777. disperrinf(status);
    778. }
    779. }

  • 相关阅读:
    VMware三种网络模式详解
    Android焦点机制结合WMS
    定义爬虫规则和数据存储
    sql server 设置字段自增
    吴恩达机器学习系列课程笔记——第十二章:支持向量机(Support Vector Machines)
    程序设计一_实训8_函数参数训练
    PPT的“限制编辑”模式如何设置?
    CTFHub | 默认口令
    UML设计系列(7):UML设计阶段性总结
    jenkins调用metersphere自动化接口
  • 原文地址:https://blog.csdn.net/zhangjin7422/article/details/133267187