IC卡特點:
1IC卡的內部存儲結構分為16個扇區,從第0區到第15區,每個扇區有獨立的密碼和權限控制字,可作為卡的密碼和權限控制字專用獨立的電子錢包,每個扇區有4個塊,序號為第0塊、第1塊、第2塊、第3塊,每塊16個字節,第3塊是塊,禁止在此存放數據。第0塊、第1塊、第2塊可隨意存放數據。但第0區的第0塊已被固化了IC卡出廠信息,此塊只能讀出信息,不可更改。
調用DLL動態庫代碼: unsigned char result; QLibrary mylib("OUR_MIFARE.dll"); if (!mylib.load()) //判斷是否正確加載 { QMessageBox::information(NULL, "提示", "動態庫沒裝載!原因是動態庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!"); return; } pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep"); if (mypcdbeep == NULL) //是否成功連接上 idr_beep()函數 { mylib.unload(); QMessageBox::information(NULL, "提示", "請檢查函數名是否正確!"); return; } result = mypcdbeep(30); //這里函數指針調用dll中的idr_beep() 函數 mylib.unload(); if(result > 0) { if(result == 23) { QMessageBox::information(NULL, "提示", "機器沒連上或者驅動沒下載"); } else { QMessageBox::information(NULL, "提示", "錯誤代碼:" + QString::number(result)); }; }
讀出IC卡數據的代碼:
void MainWindow::on_pushButton_3_clicked()//輕松讀卡 { unsigned char ctrlword;//控制字 unsigned char serial[4];//可寫數組 unsigned char area;//讀出的區號 unsigned char keyA1B0;//AB密碼認證 unsigned char picckey[6];//存放卡密碼的數組 unsigned char piccdata0_2[48];//下標0~15存放作為讀出的塊0的數據,下標16~31存放作為讀出的塊1的數據,下標32~47存放作為讀出的塊2的數據 unsigned char status;//返回 unsigned char status1; unsigned char result; unsigned char piccdata[16]; //卡數據緩沖 //以下控制字含義:讀塊0、塊1、塊2,僅讀指定序列號的卡,需要每次指定密碼 if (ui->radioButton->isChecked()) { ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY; } else {//內部密碼 ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN; } area = ui->comboBox->currentText().toUShort(); keyA1B0 = 1;//用A密碼 QString Key_str = ui->lineEdit->text().trimmed(); if(Key_str.length() < 12) { QMessageBox::information(NULL, "提示", "密碼長度不夠12位!"); ui-?>lineEdit->setFocus(); return; } char c; for (int var = 0; var < 12; ++var) { c = Key_str.at(var).toLatin1(); if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f')))) { QMessageBox::information(NULL, "提示", "密碼輸入字符不正確!"); ui-?>lineEdit->setSelection(var,1); ui->lineEdit->setFocus(); return; } } bool ok; for(int i = 0; i < 6; i++) { picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16); } QLibrary mylib("OUR_MIFARE.dll"); if (!mylib.load()) //判斷是否正確加載 { QMessageBox::information(NULL, "提示", "動態庫沒裝載!原因是動態庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!"); return; } piccreadex mypiccreadex = (piccreadex)mylib.resolve("piccreadex"); status = mypiccreadex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2); if(status == 0) { ui-?>lineEdit_2->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[0],piccdata0_2[1],piccdata0_2[2],piccdata0_2[3],piccdata0_2[4],piccdata0_2[5],piccdata0_2[6],piccdata0_2[7],piccdata0_2[8],piccdata0_2[9],piccdata0_2[10],piccdata0_2[11],piccdata0_2[12],piccdata0_2[13],piccdata0_2[14],piccdata0_2[15])); ui->lineEdit_3->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[16],piccdata0_2[17],piccdata0_2[18],piccdata0_2[19],piccdata0_2[20],piccdata0_2[21],piccdata0_2[22],piccdata0_2[23],piccdata0_2[24],piccdata0_2[25],piccdata0_2[26],piccdata0_2[27],piccdata0_2[28],piccdata0_2[29],piccdata0_2[30],piccdata0_2[31])); ui->lineEdit_4->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[32],piccdata0_2[33],piccdata0_2[34],piccdata0_2[35],piccdata0_2[36],piccdata0_2[37],piccdata0_2[38],piccdata0_2[39],piccdata0_2[40],piccdata0_2[41],piccdata0_2[42],piccdata0_2[43],piccdata0_2[44],piccdata0_2[45],piccdata0_2[46],piccdata0_2[47])); piccread mypiccread = (piccread)mylib.resolve("piccread"); status1 = mypiccread(area * 4 + 3,piccdata); if(status1 == 0) { ui->lineEdit_5->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata[0],piccdata[1],piccdata[2],piccdata[3],piccdata[4],piccdata[5],piccdata0_2[6],piccdata[7],piccdata[8],piccdata[9],piccdata[10],piccdata[11],piccdata[12],piccdata[13],piccdata[14],piccdata[15])); } pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep"); if (mypcdbeep == NULL) //是否成功連接上 idr_beep()函數 { mylib.unload(); QMessageBox::information(NULL, "提示", "請檢查函數名是否正確!"); return; } result = mypcdbeep(30); //這里函數指針調用dll中的idr_beep() 函數 mylib.unload(); } else if(status == 8) { ui->lineEdit_2->clear(); ui->lineEdit_3->clear(); ui->lineEdit_4->clear(); QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應區"); } else if(status == 12) { ui->lineEdit_2->clear(); ui->lineEdit_3->clear(); ui->lineEdit_4->clear(); QMessageBox::information(NULL, "提示", "密碼認證失敗"); } }
寫入數據到IC卡的代碼:
void MainWindow::on_pushButton_12_clicked()//輕松寫卡 { unsigned char serial[4];//可寫數組 unsigned char area;//讀出的區號 unsigned char keyA1B0;//AB密碼認證 unsigned char picckey[6];//存放卡密碼的數組 unsigned char piccdata0_2[48];//下標0~15存放作為讀出的塊0的數據,下標16~31存放作為讀出的塊1的數據,下標32~47存放作為讀出的塊2的數據 unsigned char status;//返回 unsigned char result; char s; //以下控制字含義:讀塊0、塊1、塊2,僅讀指定序列號的卡,需要每次指定密碼 if (ui->radioButton->isChecked()) { ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT; } else {//內部密碼 ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN; } area = ui->comboBox->currentText().toUShort(); keyA1B0 = 1;//用A密碼 QString Key_str = ui->lineEdit->text().trimmed(); if(Key_str.length() < 12) { QMessageBox::information(NULL, "提示", "密碼長度不夠12位!"); ui-?>lineEdit->setFocus(); return; } char c; for (int var = 0; var < 12; ++var) { c = Key_str.simplified().at(var).toLatin1(); if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f')))) { QMessageBox::information(NULL, "提示", "密碼輸入字符不正確!"); //ui-?>lineEdit->setSelection(var,1); ui->lineEdit->setSelection(var,1); ui->lineEdit->setFocus(); return; } } bool ok; for(int i = 0; i < 6; i++) { picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16); } //第0塊數據 QChar ch; QString writinf = ui-?>lineEdit_2->text().trimmed(); QString writinf1 = ""; int m = 0; int n = 0; ch = writinf.at(0); s = writinf.at(0).toLatin1(); for(int i=0; i=16) { break; } } } else if(s == ' ') { } else { QMessageBox::information(NULL, "提示", "寫卡數據錯誤,請輸入正確的16進制數據!"); ui->lineEdit_2->setSelection(i,1); ui->lineEdit_2->setFocus(); return; } } if(m16) { QMessageBox::information(NULL, "提示", "第0塊輸入數據不足!"); ui-?>lineEdit_2->setFocus(); return; } //第1塊數據 writinf = ui->lineEdit_3->text().trimmed(); QString writinf2 = ""; m = 16; for(int i=0; i=32) { break; } } } else if(s == ' ') { } else { QMessageBox::information(NULL, "提示", "寫卡數據錯誤,請輸入正確的16進制數據!"); qDebug() < i; ui-?>lineEdit_3->setSelection(i,1); ui->lineEdit_3->setFocus(); return; } } if(m16) { QMessageBox::information(NULL, "提示", "第1塊輸入數據不足!"); ui-?>lineEdit_3->setFocus(); return; } //第2塊數據 writinf = ui->lineEdit_4->text().trimmed(); QString writinf3 = ""; m = 32; for(int i=0; i=48) { break; } } } else if(s == ' ') { } else { QMessageBox::information(NULL, "提示", "寫卡數據錯誤,請輸入正確的16進制數據!"); ui->lineEdit_4->setSelection(i,1); ui->lineEdit_4->setFocus(); return; } } if(m48) { QMessageBox::information(NULL, "提示", "第2塊輸入數據不足!"); ui-?>lineEdit_4->setFocus(); return; } QLibrary mylib("OUR_MIFARE.dll"); if (!mylib.load()) //判斷是否正確加載 { QMessageBox::information(NULL, "提示", "動態庫沒裝載!原因是動態庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!"); return; } piccwriteex mypiccwriteex = (piccwriteex)mylib.resolve("piccwriteex"); status = mypiccwriteex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2); if(status == 0) { pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep"); if (mypcdbeep == NULL) //是否成功連接上 idr_beep()函數 { mylib.unload(); QMessageBox::information(NULL, "提示", "請檢查函數名是否正確!"); return; } result = mypcdbeep(30); //這里函數指針調用dll中的idr_beep() 函數 mylib.unload(); QMessageBox::information(NULL, "提示", "寫卡成功!"); } else if(status == 8) { ui->lineEdit_2->clear(); ui->lineEdit_3->clear(); ui->lineEdit_4->clear(); QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應區"); } else if(status == 12) { ui->lineEdit_2->clear(); ui->lineEdit_3->clear(); ui->lineEdit_4->clear(); QMessageBox::information(NULL, "提示", "密碼認證失敗"); } }
修改A,B區密碼:
void MainWindow::on_pushButton_14_clicked() { unsigned char ctrlword;//控制字 unsigned char serial[4];//可寫數組 unsigned char area;//讀出的區號 unsigned char keyA1B0;//AB密碼認證 unsigned char piccoldkey[6];//存放卡原始密碼的數組 unsigned char piccdata[17];//存放卡新A密碼(也就是準備改成的密碼)、密碼權限訪問字、新B密碼的數組、指定更改項目的標志 unsigned char status;//返回 unsigned char result; if (ui->radioButton->isChecked()) { ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT; } else {//內部密碼 ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN; } area = ui->comboBox->currentText().toUShort(); keyA1B0 = 1;//用A密碼 QString Key_str = ui->lineEdit->text().trimmed(); if(Key_str.length() < 12) { QMessageBox::information(NULL, "提示", "密碼長度不夠12位!"); ui-?>lineEdit->setFocus(); return; } char c; for (int var = 0; var < 12; ++var) { c = Key_str.simplified().at(var).toLatin1(); if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f')))) { QMessageBox::information(NULL, "提示", "密碼輸入字符不正確!"); ui-?>lineEdit->setSelection(var,1); ui->lineEdit->setFocus(); return; } } bool ok; for(int i = 0; i < 6; i++) { piccoldkey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16); } QChar ch; QString writinf = ui-?>lineEdit_5->text().trimmed(); QString writinf4 = ""; int m = 0; int n = 0; char s; for(int i=0; i=16) { break; } } } else if(s == ' ') { } else { QMessageBox::information(NULL, "提示", "寫卡數據錯誤,請輸入正確的16進制數據!"); ui->lineEdit_5->setSelection(i,1); ui->lineEdit_5->setFocus(); return; } } if(m16) { QMessageBox::information(NULL, "提示", "第3塊輸入數據不足!"); ui-?>lineEdit_5->setFocus(); return; } QLibrary mylib("OUR_MIFARE.dll"); if (!mylib.load()) //判斷是否正確加載 { QMessageBox::information(NULL, "提示", "動態庫沒裝載!原因是動態庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!"); return; } piccchangesinglekeyex mypiccchangesinglekeyex = (piccchangesinglekeyex)mylib.resolve("piccchangesinglekeyex"); status = mypiccchangesinglekeyex(ctrlword,serial,area,keyA1B0,piccoldkey,piccdata); QMessageBox::warning(this, "警告", "你確定修改密碼控制塊的數據嗎 ?此數據塊如果改寫錯誤,數據卡將會被限制", QMessageBox::Ok, QMessageBox::Cancel); if(status == 0) { QMessageBox::information(NULL, "提示", "操作成功,寫卡數據有效!"); pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep"); if (mypcdbeep == NULL) //是否成功連接上 idr_beep()函數 { mylib.unload(); QMessageBox::information(NULL, "提示", "請檢查函數名是否正確!"); return; } result = mypcdbeep(30); //這里函數指針調用dll中的idr_beep() 函數 mylib.unload(); } else if(status == 8) { QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應區"); } else if(status == 12) { QMessageBox::information(NULL, "提示", "密碼認證失敗"); } } 審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
IC卡
+關注
關注
2文章
172瀏覽量
34637 -
Qt
+關注
關注
1文章
311瀏覽量
38598
發布評論請先 登錄
相關推薦
請問可以直接參考DLP4500軟件源碼的調用方式進行控制嗎?需要添加哪些庫文件嗎?
軟件源碼的調用方式進行控制嗎?需要添加哪些庫文件嗎?
2. 在論壇中看到有人使用基于MFC進行控制投影的,請問使用MFC和Qt哪個更兼容、開發起來更容易些呢?
發表于 03-03 08:23
基于QT開發國產主板終端桌面程序 高效、穩定、跨平臺的解決方案
了開發者們面臨的一個重要挑戰。本文將介紹如何基于QT框架,開發適用于國產主板的終端桌面程序,并探討其優勢和應用場景。 QT是一個跨平臺的C+
ID讀卡器TCP協議QT小程序開發
ID卡網絡讀卡器TCP協議QT小程序開發。 TCP(傳輸控制協議,Transmission Control Protocol)是互聯網中最核心、最基本的協議之一。以下是對TCP協議的詳

USB免驅全協議IC卡讀寫器 QT程序開發
? 讀取15693卡,IC讀卡器如下入所示: 15693卡片,通常指的是符合ISO/IEC 15693標準的非接觸式智能卡或RFID卡。以下是對15693卡片的詳細介紹: 一、基本概述

QT調用動態庫
\", \"動態庫沒裝載!原因是動態庫OUR_IDR.dll沒放在生成exe文件相同目錄下!\");
return;
}
idr_beep myidr_beep
發表于 12-28 16:19
EEPROM輕量級的簡易類文件的數據讀寫庫:EEPROMFS
小。 這里就給大家分享一款EEPROM輕量級的簡易類文件的數據讀寫庫:EEPROMFS 1 關于EEPROMFS EEPROMFS,基于EEPROM的簡易類文件的數據讀寫庫,方便做

Arduino程序:實現SD NAND(貼片sd卡)的讀寫功能
單片機上傳程序的時候,有時候感覺它的rom和 ram有時直接限制了他的使用,之前使用eeprom,和sd卡模塊.
[]()
然后最近看到了出的SD NAND 就是下面這個
發表于 11-07 17:45
EEPROM讀寫程序詳解
EEPROM(Electrically Erasable Programmable Read-Only Memory)讀寫程序的詳解涉及多個方面,包括EEPROM的基本工作原理、讀寫流程、編程接口、代碼示例以及注意事項等。以下是
LabVIEW調用Aspose.dll實現excel讀寫、圖片插入,
使用labview讀寫excel,有多種方式。
1、使用LV自帶的excel函數庫,缺點是電腦必須安裝相應版本的excel,且容易報各種錯誤。放棄。
2、調用NPOI的dll,免費,不用安裝
發表于 06-24 17:01
評論