Linux系统用Qt开发身份证读卡器示例,后面是C++demo源码:
编译平台:
麒麟V10(SP1),amd构架,Intel i7-10700 CPU
Qt版本:
Qt Creator 4.11.0,Based on Qt 5.12.12(GCC 9.3.0,64bit)
donseeTest:项目源码
build-donseeTest-unknown-Release:Release
build-donseeTest-unknown-Debug:Debug
双击Release或者Debug文件夹里面的donseeTest,即可运行测试。
读卡器USB接口,支持广东东信身份证读卡器EST-100、EST-J13X、EST-100M(HID)等免驱机型。
其他平台,请替换以下2个库文件,然后重新编译。
libdonsee.so
libwlt2021.so
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "donsee.h"
//静态调用EST-100身份证读卡器
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("连接EST-100身份证读卡器失败") ;
printf("连接EST-100身份证读卡器失败,t_nRe = %ld\n", t_nHandle);
m_isOpen = false ;
// return -1;
}
else {
Donsee_Beep();
ui->textEdit->append("连接EST-100身份证读卡器成功") ;
m_isOpen = true ;
}
}
void MainWindow::on_btnClose_clicked()
{
long t_nRe = Donsee_Close();
if (t_nRe != 0)
{
ui->textEdit->append("关闭EST-100身份证读卡器失败") ;
}
else {
ui->textEdit->append("关闭EST-100身份证读卡器成功") ;
}
m_isOpen = false ;
}
void MainWindow::on_btnVersion_clicked()
{
if(m_isOpen == false)
{
ui->textEdit->append("EST-100身份证读卡器端口未打开") ;
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身份证读卡器读取设备版本号失败") ;
}
else {
Donsee_Beep();
sprintf(t_szMsg,"设备版本号:%s", Response) ;
ui->textEdit->append(t_szMsg) ;
}
// printf("设备版本号:%s\n", Response);
}
void MainWindow::on_btnClear_clicked()
{
ui->textEdit->clear() ;
}
void MainWindow::on_btnICard_clicked()
{
if(m_isOpen == false)
{
ui->textEdit->append("读卡器端口未打开") ;
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 设置失败\n") ;
ui->textEdit->append("IC卡 设置失败") ;
return ;
}
long t_nReq = Donsee_ICRequest();
if (t_nReq != 0)
{
printf("TypeA 请求失败\n") ;
ui->textEdit->append("IC卡 请求失败") ;
return ;
}
long t_nAtl = Donsee_ICAnticoll(t_arrDataUID);
if (t_nAtl != 0)
{
printf("TypeA 防碰撞失败\n") ;
ui->textEdit->append("IC卡 防碰撞失败") ;
return ;
}
//printf("IC卡 卡号:%s\n", t_arrDataUID);
//sprintf(t_szMsg,"IC卡 卡号:%s", t_arrDataUID) ;
QString t_strCard;
t_strCard = t_arrDataUID;
ui->textEdit->append("IC卡 卡号:"+t_strCard) ;
Donsee_Beep();
long t_nSel = Donsee_ICSelect(0x41);
if (t_nSel != 0)
{
printf("TypeA 选卡失败\n") ;
ui->textEdit->append("IC卡 选卡失败") ;
return ;
}
char t_pszAtr[256] = "" ;
long t_nRe = Donsee_PowerOnTypeA(t_pszAtr);
if (t_nRe != 0)
{
printf("TypeA 上电失败") ;
ui->textEdit->append("IC卡 上电失败") ;
return ;
}
}
void MainWindow::on_btnBankCard_clicked()
{
if(m_isOpen == false)
{
ui->textEdit->append("读卡器端口未打开") ;
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("读取银行卡号失败\n");
ui->textEdit->append("读取银行卡号失败") ;
}
else
{
Donsee_Beep();
tmp = (unsigned char)(strchr(t_szBankNo, 'D') - t_szBankNo);
q = (tmp > 0) ? strndup(t_szBankNo, tmp) : strdup(t_szBankNo);
printf("读取银行卡号成功:%s\n", q);
sprintf(t_szMsg,"读取银行卡号成功:%s", q) ;
ui->textEdit->append(t_szMsg) ;
}
}
void MainWindow::on_btnSSCard_clicked()
{
if(m_isOpen == false)
{
ui->textEdit->append("读卡器端口未打开") ;
return ;
}
char t_szMsg[256] = "" ;
SSCard_IDINFO cardInfo;
memset(&cardInfo, 0, sizeof(cardInfo));
char pszError[256] = "" ;
long t_nRead = Donsee_ReadSSCard(0x11, &cardInfo, pszError);
if (t_nRead != 0)
{
printf("读社保卡失败,MSG:%s\n", pszError);
sprintf(t_szMsg,"读社保卡失败,MSG:%s", pszError) ;
ui->textEdit->append(t_szMsg) ;
return ;
}
else
{
Donsee_Beep();
printf("读社保卡成功\n");
ui->textEdit->append("读社保卡成功") ;
printf("姓名:%s\n", cardInfo.name);
sprintf(t_szMsg,"姓名:%s", cardInfo.name) ;
ui->textEdit->append(t_szMsg) ;
printf("性别:%s\n", cardInfo.sex);
sprintf(t_szMsg,"性别:%s", cardInfo.sex) ;
ui->textEdit->append(t_szMsg) ;
printf("民族:%s\n", cardInfo.nation);
sprintf(t_szMsg,"民族:%s", cardInfo.nation) ;
ui->textEdit->append(t_szMsg) ;
printf("出生日期:%s\n", cardInfo.birthday);
sprintf(t_szMsg,"出生日期:%s", cardInfo.birthday) ;
ui->textEdit->append(t_szMsg) ;
printf("发证日期:%s\n", cardInfo.signdate);
sprintf(t_szMsg,"发证日期:%s", cardInfo.signdate) ;
ui->textEdit->append(t_szMsg) ;
printf("有效日期:%s\n", cardInfo.validterm);
sprintf(t_szMsg,"有效日期:%s", cardInfo.validterm) ;
ui->textEdit->append(t_szMsg) ;
printf("卡号:%s\n", cardInfo.cardnumber);
sprintf(t_szMsg,"卡号:%s", cardInfo.cardnumber) ;
ui->textEdit->append(t_szMsg) ;
printf("社会保障号码(身份证号):%s\n", cardInfo.idnumber);
sprintf(t_szMsg,"社会保障号码(身份证号):%s", cardInfo.idnumber) ;
ui->textEdit->append(t_szMsg) ;
printf("城市代码:%s\n", cardInfo.city);
sprintf(t_szMsg,"城市代码:%s", cardInfo.city) ;
ui->textEdit->append(t_szMsg) ;
printf("社保卡版本:%s\n", cardInfo.cardveVrsion);
sprintf(t_szMsg,"社保卡版本:%s", cardInfo.cardveVrsion ) ;
ui->textEdit->append(t_szMsg) ;
}
}
void MainWindow::on_btnIdUid_clicked()
{
if(m_isOpen == false)
{
ui->textEdit->append("读卡器端口未打开") ;
return ;
}
char Response[1024] = "";
char t_szMsg[256] = "" ;
long t_nRe = Donsee_ReadIDCardUid(Response); //身份证Uid,有需要的可以这里获取
if(t_nRe != 0)
{
ui->textEdit->append("获取身份证UID失败") ;
}
else
{
Donsee_Beep();
sprintf(t_szMsg,"获取身份证UID成功:%s", Response) ;
ui->textEdit->append(t_szMsg) ;
}
}
void MainWindow::on_btnReadId_clicked()
{
if(m_isOpen == false)
{
ui->textEdit->append("读卡器端口未打开") ;
return ;
}
IDINFO idInfo;
char t_arrMsg[256];
char t_szMsg[256] = "" ;
// nType [in]:设置身份证读卡类型:0,文本信息;1,文本+照片;2,文本+照片+指纹
// nMode [in]:设置读卡模式:0,读卡1次、拿开后放上重读;1,连续读卡,此功能未实现,填1就行
int nType = 1;
int nMode = 1; //此功能未实现,填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("读身份证失败\n");
ui->textEdit->append("读身份证失败") ;
return ;
}
else
{
Donsee_Beep();
printf("读身份证成功\n");
ui->textEdit->append("读身份证成功") ;
printf(("中文姓名:%s\n"), idInfo.name);
sprintf(t_szMsg,("中文姓名:%s"), idInfo.name) ;
ui->textEdit->append(t_szMsg) ;
printf(("英文姓名:%s\n"), idInfo.ENfullname);
sprintf(t_szMsg,("英文姓名:%s"), idInfo.ENfullname) ;
ui->textEdit->append(t_szMsg) ;
printf(("性 别:%s\n"), idInfo.sex);
sprintf(t_szMsg,("性 别:%s"), idInfo.sex) ;
ui->textEdit->append(t_szMsg) ;
printf(("民 族:%s\n"), idInfo.people);
sprintf(t_szMsg,("民 族:%s"), idInfo.people) ;
ui->textEdit->append(t_szMsg) ;
printf(("出身日期:%s\n"), idInfo.birthday);
sprintf(t_szMsg,("出身日期:%s"), idInfo.birthday) ;
ui->textEdit->append(t_szMsg) ;
printf(("住 址:%s\n"), idInfo.address);
sprintf(t_szMsg,("住 址:%s"), idInfo.address) ;
ui->textEdit->append(t_szMsg) ;
printf(("身份证号:%s\n"), idInfo.number);
sprintf(t_szMsg,("身份证号:%s"), idInfo.number) ;
ui->textEdit->append(t_szMsg) ;
printf(("签发机关:%s\n"), idInfo.organs);
sprintf(t_szMsg,("签发机关:%s"), idInfo.organs) ;
ui->textEdit->append(t_szMsg) ;
printf(("有效期开始:%s\n"), idInfo.signdate);
sprintf(t_szMsg,("有效期开始:%s"), idInfo.signdate) ;
ui->textEdit->append(t_szMsg) ;
printf(("有效期结束:%s\n"), idInfo.validterm);
sprintf(t_szMsg,("有效期结束:%s"), idInfo.validterm) ;
ui->textEdit->append(t_szMsg) ;
printf(("证件类别:%s\n"), idInfo.certType);
sprintf(t_szMsg,("证件类别:%s"), idInfo.certType) ;
ui->textEdit->append(t_szMsg) ;
printf(("证件版本:%s\n"), idInfo.certVersion);
sprintf(t_szMsg,("证件版本:%s"), idInfo.certVersion) ;
ui->textEdit->append(t_szMsg) ;
printf(("通行证号:%s\n"), idInfo.passNu);
sprintf(t_szMsg,("通行证号:%s"), idInfo.passNu) ;
ui->textEdit->append(t_szMsg) ;
printf(("签发数次:%s\n"), idInfo.signCount);
sprintf(t_szMsg,("签发数次:%s"), idInfo.signCount) ;
ui->textEdit->append(t_szMsg) ;
}
}