身份证读卡器Qt语言实现Linux系统开发集成

news2024/12/28 20:13:21

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


    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1138280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTF-Crypto 第二天-DES加密算法原理学习

文章目录 DES算法简介DES算法流程迭代加密费斯妥函数(F函数)密钥调度 混淆与扩散 DES算法简介 数据加密标准(Data Encryption Standard,缩写DES)是一种对称加密算法,也是一种分组加密算法。 对称加密指的…

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange(扇形)Direct Exchange(直连)opic Exchange(主题)Headers Exchange(头部) 2.Fanout Exchange 2.1 简介 Fanout 扇形的,散开的&#xff1…

linux配置jdk环境变量的三种方法

在Linux系统中,配置JDK环境变量是非常重要的,它可以让你在终端中直接使用Java命令,同时也能够确保你的Java应用程序能够正常运行。下面将介绍三种常用的方法来配置JDK环境变量。 方法一:使用/etc/profile文件 1. 打开终端&#…

TWAS模型数据*.wgt.RDat查看及导入R

TWAS模型数据*.wgt.RDat查看及导入R 1 数据导入R load(“./SLC7A8.wgt.RDat”) as.data.frame(snps) -> snp snp %>% head()V1 V2 V3 V4 V5 V6 1 12 rs10747759 0 55683634 C T 2 12 rs2293409 0 55684180 A C 3 12 rs1048103 0 55684405 C …

.DS_Store泄露

.DS_Store泄露 1.简介2.发掘和利用方式 1.简介 .DS_Store文件是苹果操作系统(如Mac OS)中的隐藏文件,它保存了文件夹的自定义属性、图标布局和其他元数据信息。通常,这些文件用于记录文件夹中的视图选项和布局设置。 就文件本身…

中国铁路线路数据,分为高速铁路和普通铁路,有shp格式和xlsx格式,免费下载

数据地址: 中国铁路线路数据https://www.xcitybox.com/datamarketview/#/Productpage?id274 基本信息. 数据名称: 中国铁路线路数据 数据格式: ShpXlsx 数据时间: 2018年 数据几何类型: 线 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据…

uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横) app.vue文件里写 //app.vue里写 <script>export default {onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onLaunch: function() {let appVersion uni.getSystemInfo({success: function(e) {ap…

阿里云RocketMQ版查看消息队列的客户端

通过group查看连接mq的主机 消息队列 RocketMQ 版/实例列表/Group 管理/Group 详情/运行信息

chatgpt论文润色 降重

用chatgpt最好要给他范例。chatgpt降重原理&#xff1a; https://www.bilibili.com/video/BV1Eh411M7Ug/?spm_id_from333.337.search-card.all.click&vd_sourceebc47f36e62b223817b8e0edff181613 一. 中文论文翻译成英文 1.1 直接翻译 你是一位广义零样本学习的专家&a…

谷歌Bard更新!会有哪些体验升级?

今年2月&#xff0c;谷歌的对话机器人Bard在发布会上翻车&#xff0c;遭到了科技圈的群嘲。如今半年过去了&#xff0c;Bard卷土重来&#xff0c;在9月发布了它的重磅更新“扩展插件”&#xff0c;集成了Gmail、Google Docs、Youtube 、Google Drive、Google Maps、Google Flig…

【算法练习Day29】柠檬水找零根据身高重建队列用最少数量的箭引爆气球

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 柠檬水找零根据身高重建队列…

2.8每日一题(定积分比较大小)

在对称区间上的定积分比较大小&#xff0c;首先考虑积偶性&#xff1a;对称区间上被积函数如果是奇函数&#xff0c;则定积分值为0&#xff0c;如果被积函数为偶函数&#xff0c;则定积分值为2倍一般区间的定积分。

通付盾APP尽职调查报告深度解析

引言&#xff1a; ​移动应用程序已经成为了现代生活的重要组成部分&#xff0c;我们几乎每天都在使用各种不同类型的应用来满足我们的需求&#xff0c;无论是社交、购物、娱乐还是工作。然而&#xff0c;随着移动应用的广泛使用&#xff0c;APP及供应链安全问题也引起了越来越…

第十六章总结:反射和注解

.1.1&#xff1a;访问构造方法 反射&#xff1a; 1.class类 2.获取构造方法 3.获取成员属性 4.获取成员方法 注解 1.内置注解 2.反射注解 3 创建Class对象的三种方式 1.使用getClass&#xff08;&#xff09;方法 object str new object&#xff08;&#xff09;…

CVE-2021-41773/42013 apache路径穿越漏洞

影响范围 CVE-2021-41773 Apache HTTP server 2.4.49 CVE-2021-42013 Apache HTTP server 2.4.49/2.4.50 漏洞原理 Apache HTTP Server 2.4.49版本使用的ap_normalize_path函数在对路径参数进行规范化时会先进行url解码&#xff0c;然后判断是否存在…/的路径穿越符&#xf…

Python语言:字典的使用

字典是一种存储无序的可以修改内容的的容器。 字典的具体含义&#xff1a; 现实生活中的字典是通过检索到一个字从而找到它所对应的的含义&#xff0c;字和字的含义是互相对应的&#xff0c;python世界里的字典和这个字典的用法类似&#xff0c;字典是由kye和相对应的value构成…

Stable Diffusion 图生图+ControlNet list index out of range

在webui1.5中用图生图ControlNet批量处理图片的时候报错&#xff1a; controlnet indexError: list index out of range 解决方法&#xff1a; 在controlNet的设置页中勾选不输出检测图即可。 参考&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/issu…

jdk1.8批量完成部署

第一步&#xff1a;源主机配置 在源主机上面上传jdk的文件包 获取jdk1.8https://download.csdn.net/download/weixin_44680802/88467044 添加java环境变量配置 export JAVA_HOME/usr/local/java/jdk1.8.0_65 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOM…

今年暑假不AC(贪心思路)

这道题是一道贪心算法的经典问题&#xff08;活动选择问题&#xff09; 先说用到的贪心结论&#xff1a;最先结束的活动一定是最优解的一部分 证明过程如下&#xff1a; 假设a是所有活动中最先结束的活动&#xff0c;b是最优解中最先结束的活动 如果ab 则结论成立 如果a!b 则b…