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


    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


    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include "donsee.h"
    4. //静态调用EST-100身份证读卡器
    5. MainWindow::MainWindow(QWidget *parent) :
    6. QMainWindow(parent),
    7. ui(new Ui::MainWindow)
    8. {
    9. ui->setupUi(this);
    10. m_isOpen = false ;
    11. }
    12. MainWindow::~MainWindow()
    13. {
    14. delete ui;
    15. }
    16. void MainWindow::on_btnOpen_clicked()
    17. {
    18. long t_nHandle = -99;
    19. int i = 0;
    20. char pszError[128];
    21. unsigned char Response[1024] = {0};
    22. long t_nRe;
    23. // ui->textEdit->append("Hello World !") ;
    24. t_nHandle = Donsee_Open("USB");
    25. if (t_nHandle != 0)
    26. {
    27. ui->textEdit->append("连接EST-100身份证读卡器失败") ;
    28. printf("连接EST-100身份证读卡器失败,t_nRe = %ld\n", t_nHandle);
    29. m_isOpen = false ;
    30. // return -1;
    31. }
    32. else {
    33. Donsee_Beep();
    34. ui->textEdit->append("连接EST-100身份证读卡器成功") ;
    35. m_isOpen = true ;
    36. }
    37. }
    38. void MainWindow::on_btnClose_clicked()
    39. {
    40. long t_nRe = Donsee_Close();
    41. if (t_nRe != 0)
    42. {
    43. ui->textEdit->append("关闭EST-100身份证读卡器失败") ;
    44. }
    45. else {
    46. ui->textEdit->append("关闭EST-100身份证读卡器成功") ;
    47. }
    48. m_isOpen = false ;
    49. }
    50. void MainWindow::on_btnVersion_clicked()
    51. {
    52. if(m_isOpen == false)
    53. {
    54. ui->textEdit->append("EST-100身份证读卡器端口未打开") ;
    55. return ;
    56. }
    57. unsigned char Response[1024] = {0};
    58. long t_nRe;
    59. char t_szMsg[256] = "" ;
    60. t_nRe = Donsee_Version(Response);
    61. if (t_nRe != 0)
    62. {
    63. ui->textEdit->append("EST-100身份证读卡器读取设备版本号失败") ;
    64. }
    65. else {
    66. Donsee_Beep();
    67. sprintf(t_szMsg,"设备版本号:%s", Response) ;
    68. ui->textEdit->append(t_szMsg) ;
    69. }
    70. // printf("设备版本号:%s\n", Response);
    71. }
    72. void MainWindow::on_btnClear_clicked()
    73. {
    74. ui->textEdit->clear() ;
    75. }
    76. void MainWindow::on_btnICard_clicked()
    77. {
    78. if(m_isOpen == false)
    79. {
    80. ui->textEdit->append("读卡器端口未打开") ;
    81. return ;
    82. } if(m_isOpen == false)
    83. char t_arrDataRe[32] = {0};
    84. char t_arrDataUID[8] = {0};
    85. char t_szMsg[256] = "" ;
    86. long t_nSet = Donsee_SetTypeA();
    87. if (t_nSet != 0)
    88. {
    89. printf("TypeA 设置失败\n") ;
    90. ui->textEdit->append("IC卡 设置失败") ;
    91. return ;
    92. }
    93. long t_nReq = Donsee_ICRequest();
    94. if (t_nReq != 0)
    95. {
    96. printf("TypeA 请求失败\n") ;
    97. ui->textEdit->append("IC卡 请求失败") ;
    98. return ;
    99. }
    100. long t_nAtl = Donsee_ICAnticoll(t_arrDataUID);
    101. if (t_nAtl != 0)
    102. {
    103. printf("TypeA 防碰撞失败\n") ;
    104. ui->textEdit->append("IC卡 防碰撞失败") ;
    105. return ;
    106. }
    107. //printf("IC卡 卡号:%s\n", t_arrDataUID);
    108. //sprintf(t_szMsg,"IC卡 卡号:%s", t_arrDataUID) ;
    109. QString t_strCard;
    110. t_strCard = t_arrDataUID;
    111. ui->textEdit->append("IC卡 卡号:"+t_strCard) ;
    112. Donsee_Beep();
    113. long t_nSel = Donsee_ICSelect(0x41);
    114. if (t_nSel != 0)
    115. {
    116. printf("TypeA 选卡失败\n") ;
    117. ui->textEdit->append("IC卡 选卡失败") ;
    118. return ;
    119. }
    120. char t_pszAtr[256] = "" ;
    121. long t_nRe = Donsee_PowerOnTypeA(t_pszAtr);
    122. if (t_nRe != 0)
    123. {
    124. printf("TypeA 上电失败") ;
    125. ui->textEdit->append("IC卡 上电失败") ;
    126. return ;
    127. }
    128. }
    129. void MainWindow::on_btnBankCard_clicked()
    130. {
    131. if(m_isOpen == false)
    132. {
    133. ui->textEdit->append("读卡器端口未打开") ;
    134. return ;
    135. }
    136. char t_szBankNo[256] = "";
    137. char *p, *q;
    138. unsigned char tmp;
    139. char t_szMsg[256] = "" ;
    140. long t_nRe = Donsee_GetBankCardNo(t_szBankNo);
    141. if (t_nRe != 0)
    142. {
    143. printf("读取银行卡号失败\n");
    144. ui->textEdit->append("读取银行卡号失败") ;
    145. }
    146. else
    147. {
    148. Donsee_Beep();
    149. tmp = (unsigned char)(strchr(t_szBankNo, 'D') - t_szBankNo);
    150. q = (tmp > 0) ? strndup(t_szBankNo, tmp) : strdup(t_szBankNo);
    151. printf("读取银行卡号成功:%s\n", q);
    152. sprintf(t_szMsg,"读取银行卡号成功:%s", q) ;
    153. ui->textEdit->append(t_szMsg) ;
    154. }
    155. }
    156. void MainWindow::on_btnSSCard_clicked()
    157. {
    158. if(m_isOpen == false)
    159. {
    160. ui->textEdit->append("读卡器端口未打开") ;
    161. return ;
    162. }
    163. char t_szMsg[256] = "" ;
    164. SSCard_IDINFO cardInfo;
    165. memset(&cardInfo, 0, sizeof(cardInfo));
    166. char pszError[256] = "" ;
    167. long t_nRead = Donsee_ReadSSCard(0x11, &cardInfo, pszError);
    168. if (t_nRead != 0)
    169. {
    170. printf("读社保卡失败,MSG:%s\n", pszError);
    171. sprintf(t_szMsg,"读社保卡失败,MSG:%s", pszError) ;
    172. ui->textEdit->append(t_szMsg) ;
    173. return ;
    174. }
    175. else
    176. {
    177. Donsee_Beep();
    178. printf("读社保卡成功\n");
    179. ui->textEdit->append("读社保卡成功") ;
    180. printf("姓名:%s\n", cardInfo.name);
    181. sprintf(t_szMsg,"姓名:%s", cardInfo.name) ;
    182. ui->textEdit->append(t_szMsg) ;
    183. printf("性别:%s\n", cardInfo.sex);
    184. sprintf(t_szMsg,"性别:%s", cardInfo.sex) ;
    185. ui->textEdit->append(t_szMsg) ;
    186. printf("民族:%s\n", cardInfo.nation);
    187. sprintf(t_szMsg,"民族:%s", cardInfo.nation) ;
    188. ui->textEdit->append(t_szMsg) ;
    189. printf("出生日期:%s\n", cardInfo.birthday);
    190. sprintf(t_szMsg,"出生日期:%s", cardInfo.birthday) ;
    191. ui->textEdit->append(t_szMsg) ;
    192. printf("发证日期:%s\n", cardInfo.signdate);
    193. sprintf(t_szMsg,"发证日期:%s", cardInfo.signdate) ;
    194. ui->textEdit->append(t_szMsg) ;
    195. printf("有效日期:%s\n", cardInfo.validterm);
    196. sprintf(t_szMsg,"有效日期:%s", cardInfo.validterm) ;
    197. ui->textEdit->append(t_szMsg) ;
    198. printf("卡号:%s\n", cardInfo.cardnumber);
    199. sprintf(t_szMsg,"卡号:%s", cardInfo.cardnumber) ;
    200. ui->textEdit->append(t_szMsg) ;
    201. printf("社会保障号码(身份证号):%s\n", cardInfo.idnumber);
    202. sprintf(t_szMsg,"社会保障号码(身份证号):%s", cardInfo.idnumber) ;
    203. ui->textEdit->append(t_szMsg) ;
    204. printf("城市代码:%s\n", cardInfo.city);
    205. sprintf(t_szMsg,"城市代码:%s", cardInfo.city) ;
    206. ui->textEdit->append(t_szMsg) ;
    207. printf("社保卡版本:%s\n", cardInfo.cardveVrsion);
    208. sprintf(t_szMsg,"社保卡版本:%s", cardInfo.cardveVrsion ) ;
    209. ui->textEdit->append(t_szMsg) ;
    210. }
    211. }
    212. void MainWindow::on_btnIdUid_clicked()
    213. {
    214. if(m_isOpen == false)
    215. {
    216. ui->textEdit->append("读卡器端口未打开") ;
    217. return ;
    218. }
    219. char Response[1024] = "";
    220. char t_szMsg[256] = "" ;
    221. long t_nRe = Donsee_ReadIDCardUid(Response); //身份证Uid,有需要的可以这里获取
    222. if(t_nRe != 0)
    223. {
    224. ui->textEdit->append("获取身份证UID失败") ;
    225. }
    226. else
    227. {
    228. Donsee_Beep();
    229. sprintf(t_szMsg,"获取身份证UID成功:%s", Response) ;
    230. ui->textEdit->append(t_szMsg) ;
    231. }
    232. }
    233. void MainWindow::on_btnReadId_clicked()
    234. {
    235. if(m_isOpen == false)
    236. {
    237. ui->textEdit->append("读卡器端口未打开") ;
    238. return ;
    239. }
    240. IDINFO idInfo;
    241. char t_arrMsg[256];
    242. char t_szMsg[256] = "" ;
    243. // nType [in]:设置身份证读卡类型:0,文本信息;1,文本+照片;2,文本+照片+指纹
    244. // nMode [in]:设置读卡模式:0,读卡1次、拿开后放上重读;1,连续读卡,此功能未实现,填1就行
    245. int nType = 1;
    246. int nMode = 1; //此功能未实现,填1就行
    247. memset(&idInfo, 0, sizeof(IDINFO));
    248. // char t_szPath[256] = "/tmp/IDPhoto.bmp";
    249. char t_szPath[256] = "./IDPhoto.bmp";
    250. // char t_szPath[256] = "";
    251. // char t_szPath[256] = NULL;
    252. long t_nRe = Donsee_ReadIDCard(nType, nMode, t_szPath, &idInfo, t_arrMsg);
    253. if (t_nRe != 0)
    254. {
    255. printf("读身份证失败\n");
    256. ui->textEdit->append("读身份证失败") ;
    257. return ;
    258. }
    259. else
    260. {
    261. Donsee_Beep();
    262. printf("读身份证成功\n");
    263. ui->textEdit->append("读身份证成功") ;
    264. printf(("中文姓名:%s\n"), idInfo.name);
    265. sprintf(t_szMsg,("中文姓名:%s"), idInfo.name) ;
    266. ui->textEdit->append(t_szMsg) ;
    267. printf(("英文姓名:%s\n"), idInfo.ENfullname);
    268. sprintf(t_szMsg,("英文姓名:%s"), idInfo.ENfullname) ;
    269. ui->textEdit->append(t_szMsg) ;
    270. printf(("性 别:%s\n"), idInfo.sex);
    271. sprintf(t_szMsg,("性 别:%s"), idInfo.sex) ;
    272. ui->textEdit->append(t_szMsg) ;
    273. printf(("民 族:%s\n"), idInfo.people);
    274. sprintf(t_szMsg,("民 族:%s"), idInfo.people) ;
    275. ui->textEdit->append(t_szMsg) ;
    276. printf(("出身日期:%s\n"), idInfo.birthday);
    277. sprintf(t_szMsg,("出身日期:%s"), idInfo.birthday) ;
    278. ui->textEdit->append(t_szMsg) ;
    279. printf(("住 址:%s\n"), idInfo.address);
    280. sprintf(t_szMsg,("住 址:%s"), idInfo.address) ;
    281. ui->textEdit->append(t_szMsg) ;
    282. printf(("身份证号:%s\n"), idInfo.number);
    283. sprintf(t_szMsg,("身份证号:%s"), idInfo.number) ;
    284. ui->textEdit->append(t_szMsg) ;
    285. printf(("签发机关:%s\n"), idInfo.organs);
    286. sprintf(t_szMsg,("签发机关:%s"), idInfo.organs) ;
    287. ui->textEdit->append(t_szMsg) ;
    288. printf(("有效期开始:%s\n"), idInfo.signdate);
    289. sprintf(t_szMsg,("有效期开始:%s"), idInfo.signdate) ;
    290. ui->textEdit->append(t_szMsg) ;
    291. printf(("有效期结束:%s\n"), idInfo.validterm);
    292. sprintf(t_szMsg,("有效期结束:%s"), idInfo.validterm) ;
    293. ui->textEdit->append(t_szMsg) ;
    294. printf(("证件类别:%s\n"), idInfo.certType);
    295. sprintf(t_szMsg,("证件类别:%s"), idInfo.certType) ;
    296. ui->textEdit->append(t_szMsg) ;
    297. printf(("证件版本:%s\n"), idInfo.certVersion);
    298. sprintf(t_szMsg,("证件版本:%s"), idInfo.certVersion) ;
    299. ui->textEdit->append(t_szMsg) ;
    300. printf(("通行证号:%s\n"), idInfo.passNu);
    301. sprintf(t_szMsg,("通行证号:%s"), idInfo.passNu) ;
    302. ui->textEdit->append(t_szMsg) ;
    303. printf(("签发数次:%s\n"), idInfo.signCount);
    304. sprintf(t_szMsg,("签发数次:%s"), idInfo.signCount) ;
    305. ui->textEdit->append(t_szMsg) ;
    306. }
    307. }

  • 相关阅读:
    Proteus的编译运行(以AT89C51为例)
    Upgrade to Grafana v11.0-preview
    批量BMP图片转为PNG透明图片,去掉BMP黑色背景,压缩导出png图片V1.1
    【Python教学】pyqt6入门到入土系列,超详细教学讲解
    flutter 使用texture实现Linux渲染视频
    日期问题总结
    认识 mysql 命令
    【面试题】原型与原型链 进一步理解~
    python如何使用gspread读取google在线excel数据?
    Python 框架学习 Django篇 (九) 产品发布、服务部署
  • 原文地址:https://blog.csdn.net/cntianya/article/details/134006014