ID card reader Qt language realizes Linux system development and integration

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);


    }
}