最近公司要求用HXGC设备识别身份证踩了点坑和大家分享一下
首先是通过HXGC识别身份证获取数据拿到数据之后进行登录存储,但是厂商说没有JAVA接口这里就在网上冲浪写了一点分享一下直接上代码
package com.futuremind.fm.utils;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import java.io.File;
import java.net.URL;
/***
* 身份证识别器类库(采用JNA开发)
* @author zdw
*
*/
public interface ICDLL extends Library
{
// File f =new File("/data/files/dll/libsdtapi_nodrv.so.0.0.1");
// File f =new File("D:\\sdtapi_x64.dll");
ICDLL instance = Native.load("C:\\Windows\\sdtapi_x64.dll", ICDLL.class);
// ICDLL instance = Native.load("/sdtapi_x64.dll", ICDLL.class);
/***
* 打开端口
* @param port 1001~1016(十进制)为 USB 口。 例如:1001: USB1,1002,USB2
* @return
*/
public int SDT_OpenPort(int port);
/***
* 寻找居民身份证
* @param port 端口
* @param byManaID 存储导卡数据
* @param iIfOpen 自动打开设备标志。如果设置为1,则在接口内部自动实现打开设备和关闭设备,无需调用者再添加
* @return 0x9f 找卡成功。0x80 找卡失败。
*/
public int SDT_StartFindIDCard(int port,byte[] byManaID,int iIfOpen);
/****
* 选卡
* @param port 端口
* @param byManaID 存储选卡数据
* @param iIfOpen 自动打开设备标志。如果设置为1,则在接口内部自动实现打开设备和关闭设备,无需调用者再添加
* @return
*/
public int SDT_SelectIDCard(int port,byte[] byManaID,int iIfOpen);
/***
* 读取身份证基本信息(文字信息采用GB 13000的UCS-2进行存储对应java的 StandardCharsets.UTF_16LE编码)
* @param iPort 端口
* @param pucCHMsg 存储基本文字信息
* @param puiCHMsgLen 读取文字长度 0为全部 最大256.
* @param pucPHMsg 存储照片信息
* @param puiPHMsgLen 读取照片长度 0为全部 最大256.
* @param iIfOpen 自动打开设备标志。如果设置为1,则在接口内部自动实现打开设备和关闭设备,无需调用者再添加
* @return
*/
public int SDT_ReadBaseMsg(int iPort, byte[] pucCHMsg, IntByReference puiCHMsgLen, byte[] pucPHMsg, IntByReference puiPHMsgLen, int iIfOpen);
}
package com.futuremind.fm.utils;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import com.sun.jna.ptr.IntByReference;
/**
* 读身份证信息
* (流程:寻卡--选卡--读卡)
* @author zdw
*
*/
public class ICSDK
{
//存储基本文字信息
private byte[] byCHMsg = new byte[256 + 1];
//存储照片信息
private byte[] byPHMsg = new byte[1024 + 1];
public ICSDK()
{
// File f1 =new File("D:\\sdtapi_x64.dll");
// System.out.println("文件存在否"+ f1.exists()+"文件地址=="+f1.getAbsolutePath());
byte[] byManaID = new byte[8];
//寻卡
Integer result = ICDLL.instance.SDT_StartFindIDCard(1001, byManaID, 1);
System.out.println("寻卡"+Integer.toHexString(result));
byManaID = new byte[8];
//选卡
result = ICDLL.instance.SDT_SelectIDCard(1001, byManaID, 1);
System.out.println("选卡"+Integer.toHexString(result));
//读卡
result = ICDLL.instance.SDT_ReadBaseMsg(1001, byCHMsg, new IntByReference(0), byPHMsg, new IntByReference(0), 1);
System.out.println("读卡"+Integer.toHexString(result));
}
public static ICSDK getInstance()
{
return new ICSDK();
}
/**
* 获取姓名
* @return
*/
public String getName()
{
return new String(Arrays.copyOf(byCHMsg, 30), StandardCharsets.UTF_16LE);
}
/***
* 获取性别
* @return
*/
public String getGener()
{
return new String(Arrays.copyOfRange(byCHMsg, 30, 32), StandardCharsets.UTF_16LE);
}
/***
* 获取民族
* @return
*/
public String getNation()
{
return new String( Arrays.copyOfRange(byCHMsg, 32, 36), StandardCharsets.UTF_16LE);
}
/***
* 获取生日
* @return
*/
public String getBirth()
{
return new String(Arrays.copyOfRange(byCHMsg, 36, 52), StandardCharsets.UTF_16LE);
}
/***
* 获取住址
* @return
*/
public String getAddress()
{
return new String(Arrays.copyOfRange(byCHMsg, 52, 122), StandardCharsets.UTF_16LE);
}
/***
* 获取身份证号码
* @return
*/
public String getIc()
{
return new String(Arrays.copyOfRange(byCHMsg, 122, 158), StandardCharsets.UTF_16LE);
}
/***
* 发证单位
* @return
*/
public String getStation()
{
return new String(Arrays.copyOfRange(byCHMsg, 158, 188), StandardCharsets.UTF_16LE);
}
/***
* 有效开始日期
* @return
*/
public String getBegindate()
{
return new String(Arrays.copyOfRange(byCHMsg, 188, 204), StandardCharsets.UTF_16LE);
}
/***
* 有效结束日期
* @return
*/
public String getEnddate()
{
return new String(Arrays.copyOfRange(byCHMsg, 204, 220), StandardCharsets.UTF_16LE);
}
/***
* 最新地址
* @return
*/
public String getLateAddress()
{
return new String(Arrays.copyOfRange(byCHMsg, 220, 290), StandardCharsets.UTF_16LE);
}
public String getBaseAll()
{
return new String(byCHMsg, StandardCharsets.UTF_16LE);
}
}
直接在接口中调用这个方法注意改ICDLL文件中sdtapi.dll文件地址
ICSDK icsdk = ICSDK.getInstance();
直接完事封装两个包
重点是ICDLL中需要一个dll文件,DLL文件分为32位和64位,看自己电脑配置来进行选择
链接:https://pan.baidu.com/s/1Xvvpmzemp4dEeWiR2rRecg
提取码:1001
兄弟们可以直接从百度网盘来拿
其次这个部署docker的时候是一个大坑需要的直接评论我来解答