伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

QT調用動態庫開發IC卡讀寫程序

鄒振豪 ? 來源:jf_51178285 ? 作者:jf_51178285 ? 2024-12-30 09:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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(mlineEdit_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() lineEdit_3->setSelection(i,1);
         ui->lineEdit_3->setFocus();
         return;
       }
   }
   if(mlineEdit_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(mlineEdit_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(mlineEdit_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

    文章

    175

    瀏覽量

    37097
  • Qt
    Qt
    +關注

    關注

    2

    文章

    320

    瀏覽量

    41078
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(二)

    程序自啟動與 GPU 加速實現。通過圖片顯示、LED 控制等案例,明確關鍵代碼與測試步驟。創龍科技以清晰實操指引,幫助開發者高效完成 Qt 圖形界面開發,適用于工業控制、智能終端等場景
    的頭像 發表于 02-27 10:42 ?5942次閱讀
    RK3562 單板機圖形用戶界面<b class='flag-5'>開發</b>完全手冊:<b class='flag-5'>Qt</b> Creator 配置與 LVGL 案例詳解(二)

    RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(一)

    程序自啟動與 GPU 加速實現。通過圖片顯示、LED 控制等案例,明確關鍵代碼與測試步驟。創龍科技以清晰實操指引,幫助開發者高效完成 Qt 圖形界面開發,適用于工業控制、智能終端等場景
    的頭像 發表于 02-26 11:41 ?1222次閱讀
    RK3562 單板機圖形用戶界面<b class='flag-5'>開發</b>完全手冊:<b class='flag-5'>Qt</b> Creator 配置與 LVGL 案例詳解(一)

    matlab調用dll動態庫函數,死機問題,如何強行跳出?

    matlab調用dll動態中的函數,例如圖莫斯,發送數據時,經常會卡死,是否有辦法限制時間,比如3秒,沒有回應,就強行結束函數調用。執行后續邏輯。
    發表于 12-31 10:14

    SD讀寫均衡失效問題分析

    一、讀寫均衡失效引發的核心問題 讀寫均衡(磨損均衡,Wear Leveling)是SD固件通過算法將數據均勻分配到閃存芯片各單元,避免局部單元過度擦寫的關鍵機制。瀚海微SD出現
    的頭像 發表于 12-29 15:08 ?534次閱讀
    SD<b class='flag-5'>卡</b><b class='flag-5'>讀寫</b>均衡失效問題分析

    鷹速光電的Cameralink采集接入Labview辦法

    使用鷹速光電的Cameralink轉USB采集,型號:ES-CV-CLF-U3或者ES-CV-CLB-U3,除了提供開放的SDK支持常用的VC、C#、QT開發。還提供的便利的Labview
    發表于 12-25 21:48

    從0開始使用LabVIEW操作數據采集-概述和新建新建項目

    可以調用動態來操作采集,本文默認讀者已經安裝好LabVIEW開發環境,示例程序使用LabV
    的頭像 發表于 10-10 14:54 ?603次閱讀
    從0開始使用LabVIEW操作數據采集<b class='flag-5'>卡</b>-概述和新建新建項目

    RK3506開發QT Creator開發手冊,交叉編譯工具鏈與QT應用示例,入門必備

    本文基于觸覺智能RK3506核心板/開發板介紹QTCreator交叉編譯配置與QT應用示例。如需購買開發板進行評估驗證簡介QTCreatorQtCreator?是由TheQtCompany開發
    的頭像 發表于 09-30 16:26 ?3854次閱讀
    RK3506<b class='flag-5'>開發</b>板<b class='flag-5'>QT</b> Creator<b class='flag-5'>開發</b>手冊,交叉編譯工具鏈與<b class='flag-5'>QT</b>應用示例,入門必備

    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業開發板—Qt工程編譯、GPU核心使用說明

    及 Kits 配置;還介紹評估板運行 Qt 程序程序自啟動設置,以及通過 textures 案例演示 Qt+OpenGL 調用 GPU
    的頭像 發表于 09-29 14:16 ?861次閱讀
    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業<b class='flag-5'>開發</b>板—<b class='flag-5'>Qt</b>工程編譯、GPU核心使用說明

    【匯思博SEEK100開發板試用體驗】在開發板鴻蒙OS搭建QT開發環境

    應用所需的功能邏輯。比如與開發板的硬件功能進行交互,若要調用開發板的攝像頭功能,可通過相關的 Qt 多媒體結合鴻蒙系統提供的攝像頭接口進行
    發表于 08-24 18:34

    【飛凌T527N開發板試用】QT應用開發

    qt介紹 Qt 是一個跨平臺的C++ 應用程序開發框架 ,由挪威公司 Trolltech(現為 The Qt Company)
    發表于 08-19 15:04

    【EASY EAI Orin Nano開發板試用體驗】03-安裝QT Creator和QT6

    。 內核編譯 內核編譯這塊其實可以參考官方的內核開發流程說明,但是官方有所更新,所以有些地方需要動態修改一下。 首先,安裝編譯需要的軟件。 sudo apt update sudo apt upgrade
    發表于 07-07 14:37

    EtherCAT運動控制應用開發教程之Java

    運動控制的Java開發及DLL調用
    的頭像 發表于 06-13 14:29 ?970次閱讀
    EtherCAT運動控制<b class='flag-5'>卡</b>應用<b class='flag-5'>開發</b>教程之Java

    基于RK3576開發板的QT GUI例程

    EASYEAI Orin-Nano開發板搭載了帶有xfce桌面環境的Debian系統,支持Qt應用程序開發和運行。開發板采用RK3576
    的頭像 發表于 05-14 10:26 ?1604次閱讀
    基于RK3576<b class='flag-5'>開發</b>板的<b class='flag-5'>QT</b> GUI例程

    EtherCAT運動控制器實時數據的Qt示波器

    基于QT開發調用正運動函數接口實現控制器數據實時監測的示波器效果
    的頭像 發表于 04-17 17:12 ?979次閱讀
    EtherCAT運動控制器實時數據的<b class='flag-5'>Qt</b>示波器

    【技術案例】Qt 環境部署 - Ubuntu 篇

    什么是QtQt是一個跨平臺C++圖形用戶界面應用程序開發框架,可構建高性能的桌面、移動及Web應用程序,也可用于
    的頭像 發表于 04-16 17:17 ?2116次閱讀
    【技術案例】<b class='flag-5'>Qt</b> 環境部署 - Ubuntu 篇