用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
1.背景
前几天用Python在Linux下成功的获取了二代证数据,最近正在学Go语言,这两天想着用Go语言也实现一下试看看。
2.开搞C++
这次就比较简单了,直接把CppDemo里面的SynReader.h拿来就可以,还有就是把CppDemo里面的lib文件也复制过来就可以,
具体流程和Python那篇文章的一样
被我精简后的SynReader.h
#ifndef SYN_READER_H
#define SYN_READER_H #ifdef __cplusplus
extern "C" {
#endif #pragma pack(1) typedef struct IDCardDataUTF8 {
char CardType[]; //I为外国人居住证,J 为港澳台居住证,空格(0x20)为普通身份证
char Name[]; //姓名
char EngName[]; //英文名(外国人居住证)
char Sex[]; //性别
char Nation[]; //民族或国籍(外国人居住证)
char Birthday[]; //出生日期
char Address[]; //住址
char IDCardNo[]; //身份证号或外国人居住证号(外国人居住证)
char GrantDept[]; //发证机关
char UserLifeBegin[]; //有效开始日期
char UserLifeEnd[]; //有效截止日期
char PassID[]; //通行证号码(港澳台)
char IssuesTimes[]; //签发次数(港澳台)
char CertVol[]; //证件版本号(外国人居住证)
char wlt[]; //照片数据
int isSavePhotoOK; //照片是否解码保存 0=no 1=yes
char fp[]; //指纹数据
int isFpRead; //是否读取了证内指纹 0=no 1=yes
} St_IDCardDataUTF8, *PSt_IDCardDataUTF8;
#pragma pack() //读身份证文字和照片信息
int getIDcard(St_IDCardDataUTF8 *pIDCardDataUTF8); int OpenUsbComm();
int OpenSerialComm(const char*);
int CloseComm(); //解码照片函数,wltBuffer原始照片1024字节wlt数据,bmpPath 保存照片位置
int saveWlt2Bmp( char* wltBuffer,const char* bmpPath);
int saveWlt2BmpUseFork( char* wltBuffer,const char* bmpPath); //获取动态库版本
const char* getLibVersion();
int getLibVersionInt(); #ifdef __cplusplus
}
#endif #endif
3.开搞Go
直接上代码了,大概的分析和Python的差不多,在Go语言中,主要是用到import "C"这个东东来调用C语言里面的函数
main.go
package main /*
#cgo LDFLAGS: -L ./lib -lSynReader64
#include "../include/SynReader64.h"
*/
import "C"
import (
"fmt"
"unsafe"
) /*
CArrayToGoString 将C语言中的字符数组转为Go语言的string
*/
func CArrayToGoString(cArray unsafe.Pointer, size int) (goStr string) {
p := uintptr(cArray)
var goArray []byte
for i := 0; i < size; i++ {
j := *(*byte)(unsafe.Pointer(p))
goArray = append(goArray, j)
p += unsafe.Sizeof(j)
} return string(goArray)
} func main() { var stIDCardDataUTF8 C.struct_IDCardDataUTF8 openState := C.OpenUsbComm() if openState == 0 {
getState := C.getIDcard(&stIDCardDataUTF8) if getState == 0 {
strName := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Name), 40)
strSex := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Sex), 10)
strNation := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Nation), 100)
strBirthday := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Birthday), 18)
strAddress := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.Address), 80)
strIDCardNo := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.IDCardNo), 40)
strGrantDept := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.GrantDept), 40)
strUserLifeBegin := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.UserLifeBegin), 30)
strUserLifeEnd := CArrayToGoString(unsafe.Pointer(&stIDCardDataUTF8.UserLifeEnd), 30) fmt.Println(strName)
fmt.Println(strSex)
fmt.Println(strNation)
fmt.Println(strBirthday)
fmt.Println(strAddress)
fmt.Println(strIDCardNo)
fmt.Println(strGrantDept)
fmt.Println(strUserLifeBegin)
fmt.Println(strUserLifeEnd) photoData := unsafe.Pointer(&stIDCardDataUTF8.wlt)
C.saveWlt2BmpUseFork((*C.char)(photoData), C.CString("Photo.bmp"))
} }
C.CloseComm() }
其中注意,第4行,作用是引入so库,-l参数后面加so文件名(不含.so)
第5行是引入C++定义的头文件
具体路径目录如下:
├── include
│ └── SynReader64.h
├── libx64
│ ├── libSynReader64.so
│ ├── libusb-1.0.so
│ └── libwlt.so
└── src
├── main
└── main.go
4.结束
用Go语言在Linux下调用新中新DKQ-A16D读卡器,读二代证数据的更多相关文章
- 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据
1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...
- 20155212 C语言实现linux下pwd命令的两种方法
20155212 C语言实现linux下pwd命令的两种方法 学习pwd命令 通过man pwd命令查看 pwd [OPTION],一般不加参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 ...
- [转载]linux下编译php中configure参数具体含义
编译N次了 原来这么回事 原文地址:linux下编译php中configure参数具体含义作者:捷心特 php编译参数的含义 ./configure –prefix=/usr/local/php ...
- Linux下使用 github+hexo 搭建个人博客06-next主题接入数据统计
之前说了 next 主题的优化和接入评论系统.让我们完成了自己所需的页面风格和排版,也可让访问用户在每篇博文评论,完成博主和访问用户的交互. 本章我们继续讲解其他重要功能. 既然是一个网站,那么我们就 ...
- linux下查找文件中空行的行号
linux下查找文件中空行的行号 linux下查找文件中空行的行号 以aa.txt举例: 方法1:sed -n '/[a-zA-Z0-9@#$%^&*]/!=' aa.txt 方法2:grep ...
- c# 新中新二代身份证阅读,包含头像,支持华视
需要用到dll和文件: 其中3个dll文件是需要调用的dll,license.dat文件为解压图片的授权文件 以下是需要用到的dll里面的方法: /************************端口 ...
- 关于新中新二代身份证读卡器DKQ-A16D的一些问题
今天拿到了新中新DKQ-A16D,随机光盘里有以下文件: 我遇到的问题是,如果直接打开\二代征SDK开发包\DLL\测试程序\C#_2008\WindowsFormsApplication1\目录下的 ...
- linux 下调用wps 注意
记录笔记以防忘记 wps 是界面程序,linux 必须在界面终端中调用 wps 命令才能打开软件 xshell 连接时启动tomcat ,wps命令 会使用Xshell 的隧道转发,只有在界面下的终端 ...
- Linux 2.6内核中新的锁机制--RCU
转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁 ...
随机推荐
- asp.net core 实现支持多语言
asp.net core 实现支持多语言 Intro 最近有一个外国友人通过邮件联系我,想用我的活动室预约,但是还没支持多语言,基本上都是写死的中文,所以最近想支持一下更多语言,于是有了多语言方面的一 ...
- Redis-缓存穿透、缓存雪崩、缓存击穿、缓存一致性、并发竞争
缓存流程 在讲这五个问题之前,首先我们回顾下正常的缓存的使用流程 程序在处理请求时,会先从缓存中进行查询,如果缓存中没有对应的key,则会从数据库中查询,如果查询到结果,并将查询结果添加到缓存中去,反 ...
- “土法炮制”之 OOM框架
一.什么是OOM框架? OOM 的全拼是 Object-Object-Map,意思是对象与对象之间的映射,OOM框架要解决的问题就是对象与对象之间数据的自动映射. 举一个具体的例子:用过MVC模式开发 ...
- 如何实施DevOps
对于长期在孤立的架构下工作的组织来说,转移到协作式DevOps系统似乎是难以成功的.为了进一步提高效率,必须改变观念,并进行团队文化改变.例如:许多人认为只有自动化工具才能解决DevOps,其实这是不 ...
- 从Main读取appsetting
using System; using System.Configuration; using Newtonsoft.Json.Linq; using System.Net.Http; using S ...
- 基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理
在真正开始接口测试之前,我们需要对参数的处理进行梳理.这里所说的“参数”,既包含之前在xml中的配置(我们称之为全局参数),也包含在每一条用例中书写的param.全局参数为固定不变的,而根据接口相应获 ...
- Django 信号量
参考:https://www.cnblogs.com/wupeiqi/articles/5246483.html 一.信号:就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者 ...
- Qt Installer Framework翻译(6-0)
Qt安装程序框架示例 这些示例说明了如何使用组件脚本来自定义安装程序. Change Installer UI Example 使用组件脚本修改安装程序UI. Component Error Exam ...
- 外网主机远程ssh局域网Linux
最近,公司有台配置极高的主机盒子(i7,32G,512G),组长让我装上kali,平时渗透测试时可以用,其余时间归我了,这么高配置的机器,怎么舍得让它吃灰呢 .所以我就去研究了一下,如何远程访问局域网 ...
- [洛谷P4178] Tree (点分治模板)
题目略了吧,就是一棵树上有多少个点对之间的距离 \(\leq k\) \(n \leq 40000\) 算法 首先有一个 \(O(n^2)\) 的做法,枚举每一个点为起点,\(dfs\) 一遍可知其它 ...