HXGC设备识别身份证JAVA代码

最近公司要求用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的时候是一个大坑需要的直接评论我来解答

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愤怒的约翰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值