非接觸式IC卡讀寫(xiě)器在QT平臺(tái)的二次開(kāi)發(fā)范例
- 2019-05-30 18:01:00
- 諾塔斯智能科技 原創(chuàng)
- 4925
首先我們需要認(rèn)識(shí)一下,什么是QT。
是一個(gè)1991年由Qt Company開(kāi)發(fā)的跨平臺(tái)C++圖形用戶(hù)界面應(yīng)用程序開(kāi)發(fā)框架。它既可以開(kāi)發(fā)GUI程序,也可用于開(kāi)發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣埽褂锰厥獾拇a生成擴(kuò)展(稱(chēng)為元對(duì)象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴(kuò)展,并且允許真正地組件編程。
目前有部分客戶(hù)在使用QT平臺(tái)上接入我們的智能卡讀寫(xiě)器產(chǎn)品,因此,我們專(zhuān)門(mén)為QT用戶(hù)提供了一套開(kāi)發(fā)包,部分范例如下,如需詳細(xì)開(kāi)發(fā)范例和技術(shù)支持,請(qǐng)聯(lián)系我們!
第一,我們需要導(dǎo)入 我們定義的頭文件,#include "LotusCardDriver.h",這個(gè)里面做了一些相關(guān)定義,具體請(qǐng)參考開(kāi)發(fā)范例源文件。
第二、在main()函數(shù)中對(duì)設(shè)備進(jìn)行初始化;
int main(int argc, char *argv[]) { BOOL bResult = FALSE; LotusHandle hLotusCard = LotusCardOpenDevice("",0,0,0,0,NULL); if( hLotusCard != -1) { //TestIcCard(hLotusCard); ChangeM1Password(hLotusCard); LotusCardCloseDevice(hLotusCard); } else { printf("error %d\r\n", hLotusCard); } cout << "Hello World!" << endl; return hLotusCard; // return 0; }
設(shè)備初始化通過(guò)LotusCardOpenDevice("",0,0,0,0,NULL)方法實(shí)現(xiàn)。參數(shù)strDeviceName:為字符長(zhǎng)度為0使用USB通道,否則使用串口通道
參數(shù)nVID\nPID參數(shù)如果為0,動(dòng)態(tài)庫(kù)使用內(nèi)部定義值,原則上建議使用0,除非范例有明確賦值。
特別聲明:使用外部讀寫(xiě)接口優(yōu)先,參見(jiàn)回調(diào)函數(shù)
/**
* 打開(kāi)設(shè)備
*
* @param strDeviceName
* 串口設(shè)備名稱(chēng)
* @param nVID
* USB設(shè)備VID
* @param nPID
* USB設(shè)備PID
* @param nUsbDeviceIndex
* USB設(shè)備索引
* @param unRecvTimeOut
* 接收超時(shí)
* @param bUseExendReadWrite
* 是否使用外部讀寫(xiě)通道 如果沒(méi)有設(shè)備寫(xiě)權(quán)限時(shí),可以使用外部USB或串口進(jìn)行通訊,
* 需要改造callBackProcess中相關(guān)代碼完成讀寫(xiě)工作 目前范例提供USB操作
* @return 設(shè)備句柄
*/
public native int OpenDevice(String strDeviceName, int nVID, int nPID, int nUsbDeviceIndex, int unRecvTimeOut, boolean bUseExendReadWrite);第三、非接觸式IC卡的讀寫(xiě)操作,需要對(duì)密碼的驗(yàn)證,密碼正確即可實(shí)現(xiàn)對(duì)IC卡的讀寫(xiě)。
void TestIcCard(LotusHandle hLotusCard) { LotusCardParamStruct sttLotusCardParam; BOOL bResult = FALSE; bResult = LotusCardBeep(hLotusCard, 10); unsigned int nCardNo = 0; if(FALSE == bResult) return; int nRequestType = RT_NOT_HALT; //獲取卡號(hào) 同執(zhí)行下面三個(gè)函數(shù) memset(&sttLotusCardParam, 0x00, sizeof(sttLotusCardParam)); bResult = LotusCardGetCardNo(hLotusCard,nRequestType, &sttLotusCardParam); if(FALSE == bResult) return; memcpy(&nCardNo, sttLotusCardParam.arrCardNo, 4); printf("卡號(hào)nCardNo 0x%x\r\n", nCardNo); //裝載密碼A memset(&sttLotusCardParam.arrKeys, 0x00, sizeof(sttLotusCardParam.arrKeys)); sttLotusCardParam.arrKeys[0]=0xff; sttLotusCardParam.arrKeys[1]=0xff; sttLotusCardParam.arrKeys[2]=0xff; sttLotusCardParam.arrKeys[3]=0xff; sttLotusCardParam.arrKeys[4]=0xff; sttLotusCardParam.arrKeys[5]=0xff; sttLotusCardParam.nKeysSize = 6; bResult =LotusCardLoadKey(hLotusCard, AM_A, 0, &sttLotusCardParam); if(FALSE == bResult) return; //驗(yàn)證密碼 bResult =LotusCardAuthentication(hLotusCard, AM_A, 0, &sttLotusCardParam); if(FALSE == bResult) return; //讀 bResult=LotusCardRead(hLotusCard, 2, &sttLotusCardParam); if(FALSE == bResult) return; //寫(xiě) memset(&sttLotusCardParam.arrBuffer, 0x00, sizeof(sttLotusCardParam.arrBuffer)); sttLotusCardParam.arrBuffer[0] = 0x00; sttLotusCardParam.arrBuffer[1] = 0x01; sttLotusCardParam.arrBuffer[2] = 0x02; sttLotusCardParam.arrBuffer[3] = 0x03; sttLotusCardParam.arrBuffer[4] = 0x04; sttLotusCardParam.arrBuffer[5] = 0x05; sttLotusCardParam.arrBuffer[6] = 0x06; sttLotusCardParam.arrBuffer[7] = 0x07; sttLotusCardParam.arrBuffer[8] = 0x08; sttLotusCardParam.arrBuffer[9] = 0x09; sttLotusCardParam.arrBuffer[10] = 0x0a; sttLotusCardParam.arrBuffer[11] = 0x0b; sttLotusCardParam.arrBuffer[12] = 0x0c; sttLotusCardParam.arrBuffer[13] = 0x0d; sttLotusCardParam.arrBuffer[14] = 0x0e; sttLotusCardParam.arrBuffer[15] = 0x0f; sttLotusCardParam.nBufferSize=16; bResult=LotusCardWrite(hLotusCard, 2, &sttLotusCardParam); if(FALSE == bResult) return; bResult = LotusCardInitValue(hLotusCard, 2, 10); if(FALSE == bResult) return; printf("初始化值成功!\r\n"); //減值 bResult=LotusCardDecrement(hLotusCard, 2, 1); if(FALSE == bResult) return; printf("減值成功!\r\b"); /* //中止 bResult=LotusCardHalt(hLotusCard); if(FALSE == bResult) return;*/
以上內(nèi)容是非接觸式IC卡讀寫(xiě)器在QT平臺(tái)的讀寫(xiě)范例,用戶(hù)在開(kāi)發(fā)過(guò)程中如有技術(shù)問(wèn)題,請(qǐng)聯(lián)系我們。
聯(lián)系人: | 張經(jīng)理 |
---|---|
電話: | 400-023-6659 |
傳真: | 023-68798110 |
Email: | 843718693@qq.com |
QQ: | 843718693 |
微信: | Lotus-Smart |
微博: | lotusreader |
旺旺: | 諾塔斯智能科技有限公司 |
地址: | 重慶市江北區(qū)宏帆路36號(hào)宏帆天地1棟6樓 |