An example of using Qt to develop an ID card reader on a Linux system, followed by the C++ demo source code:
Compilation platform:
Kirin V10 (SP1), amd architecture, Intel i7-10700 CPU
Qt version:
Qt Creator 4.11.0, Based on Qt 5.12.12 (GCC 9.3.0, 64bit)
donseeTest: project source code
build-donseeTest-unknown-Release:Release
build-donseeTest-unknown-Debug: Debug
Double-click donseeTest in the Release or Debug folder to run the test.
The card reader USB interface supports driver-free models such as Guangdong Eastcom ID card reader EST-100, EST-J13X, EST-100M (HID).
For other platforms, please replace the following 2 library files and recompile.
libdonsee.so
libwlt2021.so
#include "mainwindow.h" #include "ui_mainwindow.h" #include "donsee.h" //Static call EST-100 ID card reader MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); m_isOpen = false; } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_btnOpen_clicked() { long t_nHandle = -99; int i = 0; char pszError[128]; unsigned char Response[1024] = {0}; long t_nRe; // ui->textEdit->append("Hello World!"); t_nHandle = Donsee_Open("USB"); if (t_nHandle != 0) { ui->textEdit->append("Failed to connect to EST-100 ID card reader"); printf("Failed to connect to EST-100 ID card reader, t_nRe = %ld\\ ", t_nHandle); m_isOpen = false; // return -1; } else { Donsee_Beep(); ui->textEdit->append("Connected to EST-100 ID card reader successfully"); m_isOpen = true; } } void MainWindow::on_btnClose_clicked() { long t_nRe = Donsee_Close(); if (t_nRe != 0) { ui->textEdit->append("Failed to close EST-100 ID card reader"); } else { ui->textEdit->append("Close EST-100 ID card reader successfully"); } m_isOpen = false; } void MainWindow::on_btnVersion_clicked() { if(m_isOpen == false) { ui->textEdit->append("EST-100 ID card reader port is not open"); return ; } unsigned char Response[1024] = {0}; long t_nRe; char t_szMsg[256] = ""; t_nRe = Donsee_Version(Response); if (t_nRe != 0) { ui->textEdit->append("EST-100 ID card reader failed to read the device version number"); } else { Donsee_Beep(); sprintf(t_szMsg,"Device version number: %s", Response); ui->textEdit->append(t_szMsg); } // printf("Device version number: %s\\ ", Response); } void MainWindow::on_btnClear_clicked() { ui->textEdit->clear(); } void MainWindow::on_btnICard_clicked() { if(m_isOpen == false) { ui->textEdit->append("The card reader port is not open"); return ; } if(m_isOpen == false) char t_arrDataRe[32] = {0}; char t_arrDataUID[8] = {0}; char t_szMsg[256] = ""; long t_nSet = Donsee_SetTypeA(); if (t_nSet != 0) { printf("TypeA setting failed\\ "); ui->textEdit->append("IC card setting failed"); return ; } long t_nReq = Donsee_ICRequest(); if (t_nReq != 0) { printf("TypeA request failed\\ "); ui->textEdit->append("IC card request failed"); return ; } long t_nAtl = Donsee_ICAnticoll(t_arrDataUID); if (t_nAtl != 0) { printf("TypeA anti-collision failed\\ "); ui->textEdit->append("IC card anti-collision failed"); return ; } //printf("IC card number:%s\\ ", t_arrDataUID); //sprintf(t_szMsg,"IC card number: %s", t_arrDataUID); QString t_strCard; t_strCard = t_arrDataUID; ui->textEdit->append("IC card card number:" + t_strCard); Donsee_Beep(); long t_nSel = Donsee_ICSelect(0x41); if (t_nSel != 0) { printf("TypeA card selection failed\\ "); ui->textEdit->append("IC card selection failed"); return ; } char t_pszAtr[256] = ""; long t_nRe = Donsee_PowerOnTypeA(t_pszAtr); if (t_nRe != 0) { printf("TypeA failed to power on"); ui->textEdit->append("IC card failed to power on"); return ; } } void MainWindow::on_btnBankCard_clicked() { if(m_isOpen == false) { ui->textEdit->append("The card reader port is not open"); return ; } char t_szBankNo[256] = ""; char *p, *q; unsigned char tmp; char t_szMsg[256] = ""; long t_nRe = Donsee_GetBankCardNo(t_szBankNo); if (t_nRe != 0) { printf("Failed to read bank card number\\ "); ui->textEdit->append("Failed to read bank card number"); } else { Donsee_Beep(); tmp = (unsigned char)(strchr(t_szBankNo, 'D') - t_szBankNo); q = (tmp > 0) ? strndup(t_szBankNo, tmp) : strdup(t_szBankNo); printf("Read bank card number successfully: %s\\ ", q); sprintf(t_szMsg,"Read bank card number successfully: %s", q); ui->textEdit->append(t_szMsg); } } void MainWindow::on_btnSSCard_clicked() { if(m_isOpen == false) { ui->textEdit->append("The card reader port is not open"); return ; } char t_szMsg[256] = ""; SSCard_IDINFO cardInfo; memset( & amp;cardInfo, 0, sizeof(cardInfo)); char pszError[256] = ""; long t_nRead = Donsee_ReadSSCard(0x11, & amp;cardInfo, pszError); if (t_nRead != 0) { printf("Failed to read social security card, MSG:%s\\ ", pszError); sprintf(t_szMsg,"Failed to read social security card, MSG:%s", pszError); ui->textEdit->append(t_szMsg); return ; } else { Donsee_Beep(); printf("Read social security card successfully\\ "); ui->textEdit->append("Read social security card successfully"); printf("Name:%s\\ ", cardInfo.name); sprintf(t_szMsg,"Name:%s", cardInfo.name); ui->textEdit->append(t_szMsg); printf("Gender:%s\\ ", cardInfo.sex); sprintf(t_szMsg,"Gender:%s", cardInfo.sex); ui->textEdit->append(t_szMsg); printf("Nation:%s\\ ", cardInfo.nation); sprintf(t_szMsg,"Nation:%s", cardInfo.nation); ui->textEdit->append(t_szMsg); printf("Birthdate:%s\\ ", cardInfo.birthday); sprintf(t_szMsg,"Birthdate:%s", cardInfo.birthday); ui->textEdit->append(t_szMsg); printf("Issue date:%s\\ ", cardInfo.signdate); sprintf(t_szMsg,"Issuance date: %s", cardInfo.signdate); ui->textEdit->append(t_szMsg); printf("Valid date: %s\\ ", cardInfo.validterm); sprintf(t_szMsg,"Valid date: %s", cardInfo.validterm); ui->textEdit->append(t_szMsg); printf("Card number:%s\\ ", cardInfo.cardnumber); sprintf(t_szMsg,"Card number: %s", cardInfo.cardnumber); ui->textEdit->append(t_szMsg); printf("Social Security Number (ID Number):%s\\ ", cardInfo.idnumber); sprintf(t_szMsg,"Social security number (ID number):%s", cardInfo.idnumber); ui->textEdit->append(t_szMsg); printf("City code:%s\\ ", cardInfo.city); sprintf(t_szMsg,"City code:%s", cardInfo.city); ui->textEdit->append(t_szMsg); printf("Social security card version:%s\\ ", cardInfo.cardveVrsion); sprintf(t_szMsg,"Social Security Card Version: %s", cardInfo.cardveVrsion ); ui->textEdit->append(t_szMsg); } } void MainWindow::on_btnIdUid_clicked() { if(m_isOpen == false) { ui->textEdit->append("The card reader port is not open"); return ; } char Response[1024] = ""; char t_szMsg[256] = ""; long t_nRe = Donsee_ReadIDCardUid(Response); //ID card Uid, you can get it here if you need it if(t_nRe != 0) { ui->textEdit->append("Failed to obtain ID card UID"); } else { Donsee_Beep(); sprintf(t_szMsg,"Get ID card UID successfully: %s", Response); ui->textEdit->append(t_szMsg); } } void MainWindow::on_btnReadId_clicked() { if(m_isOpen == false) { ui->textEdit->append("The card reader port is not open"); return ; } IDINFO idInfo; char t_arrMsg[256]; char t_szMsg[256] = ""; // nType [in]: Set the ID card reading type: 0, text information; 1, text + photo; 2, text + photo + fingerprint // nMode [in]: Set the card reading mode: 0, read the card once, take it away and put it back to read again; 1, read the card continuously, this function is not implemented, just fill in 1 int nType = 1; int nMode = 1; //This function is not implemented, just fill in 1 memset( & idInfo, 0, sizeof(IDINFO)); // char t_szPath[256] = "/tmp/IDPhoto.bmp"; char t_szPath[256] = "./IDPhoto.bmp"; // char t_szPath[256] = ""; // char t_szPath[256] = NULL; long t_nRe = Donsee_ReadIDCard(nType, nMode, t_szPath, & idInfo, t_arrMsg); if (t_nRe != 0) { printf("Failed to read ID card\\ "); ui->textEdit->append("Failed to read ID card"); return ; } else { Donsee_Beep(); printf("Reading ID card successfully\\ "); ui->textEdit->append("Reading ID card successfully"); printf(("Chinese name: %s\\ "), idInfo.name); sprintf(t_szMsg,("Chinese name: %s"), idInfo.name); ui->textEdit->append(t_szMsg); printf(("English name: %s\\ "), idInfo.ENfullname); sprintf(t_szMsg,("English name: %s"), idInfo.ENfullname); ui->textEdit->append(t_szMsg); printf(("Gender: %s\\ "), idInfo.sex); sprintf(t_szMsg,("Gender: %s"), idInfo.sex); ui->textEdit->append(t_szMsg); printf(("Nationality: %s\\ "), idInfo.people); sprintf(t_szMsg,("Nationality: %s"), idInfo.people); ui->textEdit->append(t_szMsg); printf(("Date of birth: %s\\ "), idInfo.birthday); sprintf(t_szMsg,("Date of birth: %s"), idInfo.birthday); ui->textEdit->append(t_szMsg); printf(("Address: %s\\ "), idInfo.address); sprintf(t_szMsg,("Address: %s"), idInfo.address); ui->textEdit->append(t_szMsg); printf(("ID card number: %s\\ "), idInfo.number); sprintf(t_szMsg,("ID number: %s"), idInfo.number); ui->textEdit->append(t_szMsg); printf(("Issuing authority: %s\\ "), idInfo.organs); sprintf(t_szMsg,("Issuing authority: %s"), idInfo.organs); ui->textEdit->append(t_szMsg); printf(("Validity period starts: %s\\ "), idInfo.signdate); sprintf(t_szMsg,("Validity period starts: %s"), idInfo.signdate); ui->textEdit->append(t_szMsg); printf(("Validity period ends: %s\\ "), idInfo.validterm); sprintf(t_szMsg,("Validity end: %s"), idInfo.validterm); ui->textEdit->append(t_szMsg); printf(("Certificate type: %s\\ "), idInfo.certType); sprintf(t_szMsg,("Certificate type: %s"), idInfo.certType); ui->textEdit->append(t_szMsg); printf(("Certificate version: %s\\ "), idInfo.certVersion); sprintf(t_szMsg,("Certificate version: %s"), idInfo.certVersion); ui->textEdit->append(t_szMsg); printf(("Pass number: %s\\ "), idInfo.passNu); sprintf(t_szMsg,("Pass number: %s"), idInfo.passNu); ui->textEdit->append(t_szMsg); printf(("Number of times signed: %s\\ "), idInfo.signCount); sprintf(t_szMsg,("Number of times signed: %s"), idInfo.signCount); ui->textEdit->append(t_szMsg); } }