用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据

1.背景

前几天用Python在Linux下成功的获取了二代证数据,最近正在学Go语言,这两天想着用Go语言也实现一下试看看。

2.开搞C++

这次就比较简单了,直接把CppDemo里面的SynReader.h拿来就可以,还有就是把CppDemo里面的lib文件也复制过来就可以,

具体流程和Python那篇文章的一样

被我精简后的SynReader.h

 1 #ifndef SYN_READER_H
 2 #define SYN_READER_H
 3
 4 #ifdef __cplusplus
 5 extern "C" {
 6 #endif
 7
 8
 9
10 #pragma pack(1)
11
12 typedef struct IDCardDataUTF8 {
13     char CardType[10];         //I为外国人居住证,J 为港澳台居住证,空格(0x20)为普通身份证
14     char Name[40];             //姓名
15     char EngName[130];       //英文名(外国人居住证)
16     char Sex[10];           //性别
17     char Nation[100];          //民族或国籍(外国人居住证)
18     char Birthday[18];         //出生日期
19     char Address[80];       //住址
20     char IDCardNo[40];      //身份证号或外国人居住证号(外国人居住证)
21     char GrantDept[40];     //发证机关
22     char UserLifeBegin[30]; //有效开始日期
23     char UserLifeEnd[30];   //有效截止日期
24     char PassID[30];        //通行证号码(港澳台)
25     char IssuesTimes[10];    //签发次数(港澳台)
26     char CertVol[10];         //证件版本号(外国人居住证)
27     char wlt[1024];           //照片数据
28     int isSavePhotoOK;        //照片是否解码保存  0=no  1=yes
29     char fp[1024];            //指纹数据
30     int isFpRead;            //是否读取了证内指纹     0=no 1=yes
31 } St_IDCardDataUTF8, *PSt_IDCardDataUTF8;
32 #pragma pack()
33
34 //读身份证文字和照片信息
35 int getIDcard(St_IDCardDataUTF8 *pIDCardDataUTF8);
36
37 int OpenUsbComm();
38 int OpenSerialComm(const char*);
39 int CloseComm();
40
41
42 //解码照片函数,wltBuffer原始照片1024字节wlt数据,bmpPath 保存照片位置
43 int saveWlt2Bmp( char* wltBuffer,const char* bmpPath);
44 int saveWlt2BmpUseFork( char* wltBuffer,const char* bmpPath);
45
46 //获取动态库版本
47 const char* getLibVersion();
48 int getLibVersionInt();
49
50
51
52 #ifdef __cplusplus
53 }
54 #endif
55
56 #endif

3.开搞Go

直接上代码了,大概的分析和Python的差不多,在Go语言中,主要是用到import "C"这个东东来调用C语言里面的函数

main.go

 1 package main
 2
 3 /*
 4 #cgo  LDFLAGS:  -L ./lib  -lSynReader64
 5 #include "../include/SynReader64.h"
 6 */
 7 import "C"
 8 import (
 9     "fmt"
10     "unsafe"
11 )
12
13 /*
14 CArrayToGoString 将C语言中的字符数组转为Go语言的string
15 */
16 func CArrayToGoString(cArray unsafe.Pointer, size int) (goStr string) {
17     p := uintptr(cArray)
18     var goArray []byte
19     for i := 0; i < size; i++ {
20         j := *(*byte)(unsafe.Pointer(p))
21         goArray = append(goArray, j)
22         p += unsafe.Sizeof(j)
23     }
24
25     return string(goArray)
26 }
27
28 func main() {
29
30     var stIDCardDataUTF8 C.struct_IDCardDataUTF8
31
32     openState := C.OpenUsbComm()
33
34     if openState == 0 {
35         getState := C.getIDcard(&stIDCardDataUTF8)
36
37         if getState == 0 {
38             strName := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Name), 40)
39             strSex := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Sex), 10)
40             strNation := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Nation), 100)
41             strBirthday := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Birthday), 18)
42             strAddress := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Address), 80)
43             strIDCardNo := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.IDCardNo), 40)
44             strGrantDept := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.GrantDept), 40)
45             strUserLifeBegin := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.UserLifeBegin), 30)
46             strUserLifeEnd := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.UserLifeEnd), 30)
47
48             fmt.Println(strName)
49             fmt.Println(strSex)
50             fmt.Println(strNation)
51             fmt.Println(strBirthday)
52             fmt.Println(strAddress)
53             fmt.Println(strIDCardNo)
54             fmt.Println(strGrantDept)
55             fmt.Println(strUserLifeBegin)
56             fmt.Println(strUserLifeEnd)
57
58             photoData := unsafe.Pointer(&stIDCardDataUTF8.wlt)
59             C.saveWlt2BmpUseFork((*C.char)(photoData), C.CString("Photo.bmp"))
60         }
61
62     }
63     C.CloseComm()
64
65 }

其中注意,第4行,作用是引入so库,-l参数后面加so文件名(不含.so)

第5行是引入C++定义的头文件

具体路径目录如下:

├── include
│   └── SynReader64.h
├── libx64
│   ├── libSynReader64.so
│   ├── libusb-1.0.so
│   └── libwlt.so
└── src
├── main
└── main.go

4.结束

原文地址:https://www.cnblogs.com/lxcsmallcity/p/12309715.html

时间: 2024-08-30 08:23:07

用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据的相关文章

[转载]linux下编译php中configure参数具体含义

编译N次了   原来这么回事 原文地址:linux下编译php中configure参数具体含义作者:捷心特 php编译参数的含义 ./configure –prefix=/usr/local/php                      php 安装目录 –with-apxs2=/usr/local/apache/bin/apxs –with-config-file-path=/usr/local/php/etc      指定php.ini位置 –with-mysql=/usr/local

c语言基于Linux下用libpcap实现抓包程序

c语言基于libpcap实现一个抓包程序过程 基于pcap的嗅探器程序的总体架构,其流程如下:(1)首先要决定用哪一个接口进行嗅探开始.在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等.我们也可以用一个字符串来定义这个设备,或者采用pcap提供的接口名来工作.(... 基于pcap的嗅探器程序的总体架构,其流程如下: (1)首先要决定用哪一个接口进行嗅探开始.在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等.我们也可以用一个字符串来定义这个设备,或者采用p

整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

分类: MakeFile/Make/GCC/LD2010-11-20 23:15 535人阅读 评论(0) 收藏 举报 转者的话: 本文详细介绍了gcc 编译时 搜索头文件的路径以及方式, 编译时寻找lib库的方式, 以及运行时加载库的寻找方式!!!非常之经典啊!以后有新的知识都汇总到这里来了! 在交叉编译的时候我们需要用到其他的库,在config时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法. 看下文的红色部分. 有大量的环境变量可供设置以影响 G

Linux 2.6内核中新的锁机制--RCU

转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用.但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,

linux下升级tomcat中的应用服务器

1.用shell工具进入到linux下的tomcat的文件夹下 cd /usr/你的tomcat的路径 2.进入bin目录下 cd bin/ 3.调用关闭脚本 ./shutdown.sh 4.查看Tomcat是否以关闭 ps -ef|grep java 如果是下列情况,说明已经关闭 root 13010 1 0 Apr19 ? 00:30:30 [java] <defunct> 如果显示以下相似信息,说明Tomcat还没有关闭 root <span style="color:#

PHP在Linux下Apache环境中执行exec,system,passthru等服务器命令函数

若在服务器中使用php test.php运行exec,system,passthru等命令相关的脚本能成功运行,在web页面却没反应,则 查看下apache的error_log日志,一般是这几个函数 system() has been disabled for security reasons in /var/www/html/test.php on line 34 报错了. 看下php.ini中的disable_functions 有没有禁用了这些函数,删除禁用后保存. 重启下php和Apac

Linux下安装过程中编译PHP时报错:configure: error: libjpeg.(a|so) not found

在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决的方法: 检查之后发现已经安装libjpeg.可是/usr/lib文件夹下没有libjpeg.so这个文件,在/usr/lib64下是有的,使用–with-jpeg-dir=/usr/lib64 依旧无效, 最后用ln -s /usr/lib64/libjpeg.so /usr/lib/libjpeg.so问题解决 libpng报错解决方法一样

从0到1导出Linux下的MySQL中含有中文数据的文件(not complete)

注明版本号: 这是刚安装完MySQL的时候的样子: 首先解决secure_file_priv的问题: 由于文件是只读的,所以只能在root模式下来改.使用vi命令编辑mysqld.cnf: 在文件结尾加上这一行,保存并退出. 现在再看看: 未完待续. 参考链接: 1.mysql命令之二:查看mysql版本的四种方法 - duanxz - 博客园 https://www.cnblogs.com/duanxz/p/5244634.html 就是看个版本号,可以进入MySQL后输入status;或se

Linux下Oracle数据库创建新实例

本人太懒,觉得重要记录一下. 拿到一份源码,高度依赖数据库,实在不想用oracl实例,故新建一个实例. 几个比较重要的系统参数:ORACLE_HOME,ORACLE_BASE. 1.新增实例信息 cd $ORACLE_HOME/dbs init.ora # 实例配置文件 可以自己复制一个,命名规则:initSID.ora 这个文件initSID.ora主要修改红框的部分(没啥追求,能创建成功就行,具体另说) 文件修改完成后,在ORACLE_BASE/admin目录下,创建一个与SID一致的目录,