IC卡特點:
1IC卡的內(nèi)部存儲結(jié)構(gòu)分為16個扇區(qū),從第0區(qū)到第15區(qū),每個扇區(qū)有獨立的密碼和權(quán)限控制字,可作為卡的密碼和權(quán)限控制字專用獨立的電子錢包,每個扇區(qū)有4個塊,序號為第0塊、第1塊、第2塊、第3塊,每塊16個字節(jié),第3塊是塊,禁止在此存放數(shù)據(jù)。第0塊、第1塊、第2塊可隨意存放數(shù)據(jù)。但第0區(qū)的第0塊已被固化了IC卡出廠信息,此塊只能讀出信息,不可更改。
調(diào)用DLL動態(tài)庫代碼:
unsigned char result;
QLibrary mylib("OUR_MIFARE.dll");
if (!mylib.load()) //判斷是否正確加載
{
QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!");
return;
}
pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
if (mypcdbeep == NULL) //是否成功連接上 idr_beep()函數(shù)
{
mylib.unload();
QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
return;
}
result = mypcdbeep(30); //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
mylib.unload();
if(result > 0)
{
if(result == 23)
{
QMessageBox::information(NULL, "提示", "機器沒連上或者驅(qū)動沒下載");
}
else
{
QMessageBox::information(NULL, "提示", "錯誤代碼:" + QString::number(result));
};
}
讀出IC卡數(shù)據(jù)的代碼:
void MainWindow::on_pushButton_3_clicked()//輕松讀卡
{
unsigned char ctrlword;//控制字
unsigned char serial[4];//可寫數(shù)組
unsigned char area;//讀出的區(qū)號
unsigned char keyA1B0;//AB密碼認(rèn)證
unsigned char picckey[6];//存放卡密碼的數(shù)組
unsigned char piccdata0_2[48];//下標(biāo)0~15存放作為讀出的塊0的數(shù)據(jù),下標(biāo)16~31存放作為讀出的塊1的數(shù)據(jù),下標(biāo)32~47存放作為讀出的塊2的數(shù)據(jù)
unsigned char status;//返回
unsigned char status1;
unsigned char result;
unsigned char piccdata[16]; //卡數(shù)據(jù)緩沖
//以下控制字含義:讀塊0、塊1、塊2,僅讀指定序列號的卡,需要每次指定密碼
if (ui->radioButton->isChecked())
{
ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;
}
else
{//內(nèi)部密碼
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, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫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()函數(shù)
{
mylib.unload();
QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
return;
}
result = mypcdbeep(30); //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
mylib.unload();
}
else if(status == 8)
{
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應(yīng)區(qū)");
}
else if(status == 12)
{
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
QMessageBox::information(NULL, "提示", "密碼認(rèn)證失敗");
}
}
寫入數(shù)據(jù)到IC卡的代碼:
void MainWindow::on_pushButton_12_clicked()//輕松寫卡
{
unsigned char serial[4];//可寫數(shù)組
unsigned char area;//讀出的區(qū)號
unsigned char keyA1B0;//AB密碼認(rèn)證
unsigned char picckey[6];//存放卡密碼的數(shù)組
unsigned char piccdata0_2[48];//下標(biāo)0~15存放作為讀出的塊0的數(shù)據(jù),下標(biāo)16~31存放作為讀出的塊1的數(shù)據(jù),下標(biāo)32~47存放作為讀出的塊2的數(shù)據(jù)
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
{//內(nèi)部密碼
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塊數(shù)據(jù)
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, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進制數(shù)據(jù)!");
ui->lineEdit_2->setSelection(i,1);
ui->lineEdit_2->setFocus();
return;
}
}
if(m16)
{
QMessageBox::information(NULL, "提示", "第0塊輸入數(shù)據(jù)不足!");
ui-?>lineEdit_2->setFocus();
return;
}
//第1塊數(shù)據(jù)
writinf = ui->lineEdit_3->text().trimmed();
QString writinf2 = "";
m = 16;
for(int i=0; i=32)
{
break;
}
}
}
else if(s == ' ')
{
}
else
{
QMessageBox::information(NULL, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進制數(shù)據(jù)!");
qDebug() < i;
ui-?>lineEdit_3->setSelection(i,1);
ui->lineEdit_3->setFocus();
return;
}
}
if(m16)
{
QMessageBox::information(NULL, "提示", "第1塊輸入數(shù)據(jù)不足!");
ui-?>lineEdit_3->setFocus();
return;
}
//第2塊數(shù)據(jù)
writinf = ui->lineEdit_4->text().trimmed();
QString writinf3 = "";
m = 32;
for(int i=0; i=48)
{
break;
}
}
}
else if(s == ' ')
{
}
else
{
QMessageBox::information(NULL, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進制數(shù)據(jù)!");
ui->lineEdit_4->setSelection(i,1);
ui->lineEdit_4->setFocus();
return;
}
}
if(m48)
{
QMessageBox::information(NULL, "提示", "第2塊輸入數(shù)據(jù)不足!");
ui-?>lineEdit_4->setFocus();
return;
}
QLibrary mylib("OUR_MIFARE.dll");
if (!mylib.load()) //判斷是否正確加載
{
QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫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()函數(shù)
{
mylib.unload();
QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
return;
}
result = mypcdbeep(30); //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
mylib.unload();
QMessageBox::information(NULL, "提示", "寫卡成功!");
}
else if(status == 8)
{
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應(yīng)區(qū)");
}
else if(status == 12)
{
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
QMessageBox::information(NULL, "提示", "密碼認(rèn)證失敗");
}
}
修改A,B區(qū)密碼:
void MainWindow::on_pushButton_14_clicked()
{
unsigned char ctrlword;//控制字
unsigned char serial[4];//可寫數(shù)組
unsigned char area;//讀出的區(qū)號
unsigned char keyA1B0;//AB密碼認(rèn)證
unsigned char piccoldkey[6];//存放卡原始密碼的數(shù)組
unsigned char piccdata[17];//存放卡新A密碼(也就是準(zhǔn)備改成的密碼)、密碼權(quán)限訪問字、新B密碼的數(shù)組、指定更改項目的標(biāo)志
unsigned char status;//返回
unsigned char result;
if (ui->radioButton->isChecked())
{
ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT;
}
else
{//內(nèi)部密碼
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, "提示", "寫卡數(shù)據(jù)錯誤,請輸入正確的16進制數(shù)據(jù)!");
ui->lineEdit_5->setSelection(i,1);
ui->lineEdit_5->setFocus();
return;
}
}
if(m16)
{
QMessageBox::information(NULL, "提示", "第3塊輸入數(shù)據(jù)不足!");
ui-?>lineEdit_5->setFocus();
return;
}
QLibrary mylib("OUR_MIFARE.dll");
if (!mylib.load()) //判斷是否正確加載
{
QMessageBox::information(NULL, "提示", "動態(tài)庫沒裝載!原因是動態(tài)庫OUR_MIFARE.dll沒放在生成exe文件相同目錄下!");
return;
}
piccchangesinglekeyex mypiccchangesinglekeyex = (piccchangesinglekeyex)mylib.resolve("piccchangesinglekeyex");
status = mypiccchangesinglekeyex(ctrlword,serial,area,keyA1B0,piccoldkey,piccdata);
QMessageBox::warning(this, "警告", "你確定修改密碼控制塊的數(shù)據(jù)嗎 ?此數(shù)據(jù)塊如果改寫錯誤,數(shù)據(jù)卡將會被限制", QMessageBox::Ok, QMessageBox::Cancel);
if(status == 0)
{
QMessageBox::information(NULL, "提示", "操作成功,寫卡數(shù)據(jù)有效!");
pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
if (mypcdbeep == NULL) //是否成功連接上 idr_beep()函數(shù)
{
mylib.unload();
QMessageBox::information(NULL, "提示", "請檢查函數(shù)名是否正確!");
return;
}
result = mypcdbeep(30); //這里函數(shù)指針調(diào)用dll中的idr_beep() 函數(shù)
mylib.unload();
}
else if(status == 8)
{
QMessageBox::information(NULL, "提示", "尋卡錯誤,根本就沒有卡在感應(yīng)區(qū)");
}
else if(status == 12)
{
QMessageBox::information(NULL, "提示", "密碼認(rèn)證失敗");
}
}
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
IC卡
+關(guān)注
關(guān)注
2文章
175瀏覽量
36941 -
Qt
+關(guān)注
關(guān)注
2文章
320瀏覽量
40852
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
RK3562 單板機圖形用戶界面開發(fā)完全手冊:Qt Creator 配置與 LVGL 案例詳解(二)
程序自啟動與 GPU 加速實現(xiàn)。通過圖片顯示、LED 控制等案例,明確關(guān)鍵代碼與測試步驟。創(chuàng)龍科技以清晰實操指引,幫助開發(fā)者高效完成 Qt 圖形界面開發(fā),適用于工業(yè)控制、智能終端等場景
RK3562 單板機圖形用戶界面開發(fā)完全手冊:Qt Creator 配置與 LVGL 案例詳解(一)
程序自啟動與 GPU 加速實現(xiàn)。通過圖片顯示、LED 控制等案例,明確關(guān)鍵代碼與測試步驟。創(chuàng)龍科技以清晰實操指引,幫助開發(fā)者高效完成 Qt 圖形界面開發(fā),適用于工業(yè)控制、智能終端等場景
matlab調(diào)用dll動態(tài)庫函數(shù),死機問題,如何強行跳出?
matlab調(diào)用dll動態(tài)庫中的函數(shù),例如圖莫斯,發(fā)送數(shù)據(jù)時,經(jīng)常會卡死,是否有辦法限制時間,比如3秒,沒有回應(yīng),就強行結(jié)束函數(shù)調(diào)用。執(zhí)行后續(xù)邏輯。
發(fā)表于 12-31 10:14
SD卡讀寫均衡失效問題分析
一、讀寫均衡失效引發(fā)的核心問題 讀寫均衡(磨損均衡,Wear Leveling)是SD卡固件通過算法將數(shù)據(jù)均勻分配到閃存芯片各單元,避免局部單元過度擦寫的關(guān)鍵機制。瀚海微SD卡出現(xiàn)
鷹速光電的Cameralink采集卡接入Labview辦法
使用鷹速光電的Cameralink轉(zhuǎn)USB采集卡,型號:ES-CV-CLF-U3或者ES-CV-CLB-U3,除了提供開放的SDK支持常用的VC、C#、QT等開發(fā)。還提供的便利的Labview
發(fā)表于 12-25 21:48
從0開始使用LabVIEW操作數(shù)據(jù)采集卡-概述和新建新建項目
可以調(diào)用該動態(tài)庫來操作采集卡,本文默認(rèn)讀者已經(jīng)安裝好LabVIEW開發(fā)環(huán)境,示例程序使用LabV
RK3506開發(fā)板QT Creator開發(fā)手冊,交叉編譯工具鏈與QT應(yīng)用示例,入門必備
本文基于觸覺智能RK3506核心板/開發(fā)板介紹QTCreator交叉編譯配置與QT應(yīng)用示例。如需購買開發(fā)板進行評估驗證簡介QTCreatorQtCreator?是由TheQtCompany開發(fā)
創(chuàng)龍 瑞芯微 RK3588 國產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—Qt工程編譯、GPU核心使用說明
及 Kits 配置;還介紹評估板運行 Qt 程序、程序自啟動設(shè)置,以及通過 textures 案例演示 Qt+OpenGL 調(diào)用 GPU
【匯思博SEEK100開發(fā)板試用體驗】在開發(fā)板鴻蒙OS搭建QT開發(fā)環(huán)境
應(yīng)用所需的功能邏輯。比如與開發(fā)板的硬件功能進行交互,若要調(diào)用開發(fā)板的攝像頭功能,可通過相關(guān)的 Qt 多媒體庫結(jié)合鴻蒙系統(tǒng)提供的攝像頭接口進行
發(fā)表于 08-24 18:34
【飛凌T527N開發(fā)板試用】QT應(yīng)用開發(fā)
qt介紹
Qt 是一個跨平臺的C++ 應(yīng)用程序開發(fā)框架 ,由挪威公司 Trolltech(現(xiàn)為 The Qt Company)
發(fā)表于 08-19 15:04
【EASY EAI Orin Nano開發(fā)板試用體驗】03-安裝QT Creator和QT6
。
內(nèi)核編譯
內(nèi)核編譯這塊其實可以參考官方的內(nèi)核開發(fā)流程說明,但是官方有所更新,所以有些地方需要動態(tài)修改一下。
首先,安裝編譯需要的軟件。
sudo apt update
sudo apt upgrade
發(fā)表于 07-07 14:37
基于RK3576開發(fā)板的QT GUI例程
EASYEAI Orin-Nano開發(fā)板搭載了帶有xfce桌面環(huán)境的Debian系統(tǒng),支持Qt應(yīng)用程序的開發(fā)和運行。開發(fā)板采用RK3576
EtherCAT運動控制器實時數(shù)據(jù)的Qt示波器
基于QT開發(fā)調(diào)用正運動函數(shù)接口實現(xiàn)控制器數(shù)據(jù)實時監(jiān)測的示波器效果
【技術(shù)案例】Qt 環(huán)境部署 - Ubuntu 篇
什么是Qt?Qt是一個跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架,可構(gòu)建高性能的桌面、移動及Web應(yīng)用程序,也可用于
QT調(diào)用動態(tài)庫開發(fā)IC卡讀寫程序
評論