注:使用时确定jdk为32位  使用绝对路径读取接口时 需要确定接口文件存放位置

1、引入jna.jar

<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.1.0</version>
</dependency>
package com.example.id_card_read.job;import com.example.id_card_read.util.ReadCardUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** @ClassName Jobs* @Description 定时任务* @Author henry* @Date 2019-03-21 9:23* @Version 1.0*/
@Component
public class Jobs {public final static long ONE_MINUTE =  5 * 1000;@Scheduled(fixedDelay=ONE_MINUTE)public void fixedDelayJob() {System.out.println(ReadCardUtils.getInfos(1));}}
package com.example.id_card_read.util;import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;public class ReadCardUtils {public interface DLL extends StdCallLibrary {
//      String path = ReadCardUtils.class.getResource("/").getPath().substring(1).replace("/", "\\") + "Sdtapi";String path2 = "D:\\Program Files (x86)\\Java\\jdk1.8.0_181\\bin\\Sdtapi";DLL INSTANCE = (DLL)Native.loadLibrary(path2, DLL.class);//卡认证接口int InitComm(int iPort);int CloseComm();int Authenticate();//读卡信息接口int ReadBaseMsg(char[] pMsg, int len);int ReadBaseMsgPhoto(char[] pMsg, int len, char[] directory);int ReadBaseInfos(char[] Name, char[] Gender, char[] Folk,char[] BirthDay, char[] Code, char[] Address, char[] Agency, char[] ExpireStart, char[] ExpireEnd);int ReadBaseInfosPhoto(byte[] Name, byte[] Gender, byte[] Folk,byte[] BirthDay, byte[] Code, byte[] Address,byte[] Agency, byte[] ExpireStart,byte[] ExpireEnd, byte[] directory);//此处使用了这个接口读取信息!注意只能用byte[],不能是char[];否则会乱码!转都转不了!int ReadBaseMsgW(char[] pMsg, int len);int ReadBaseMsgWPhoto(char[] pMsg, int[] len, char[] directory);//读追加地址信息int ReadNewAppMsg(char[] pMsg, int num);int ReadNewAppInfos(char[] addr1,char[] addr2, char[] addr3,char[] addr4, int num);int ReadNewAppMsgW(char[] pMsg, int[] num);//读卡体管理号int ReadIINSNDN(char[] pMsg);//读模块序列号int GetSAMIDToStr(char[] pcSAMID);int Routon_IC_FindCard(); // 查询ic卡类型int Routon_IC_HL_ReadCardSN(byte[] SN); // 读取IC卡 卡号int HID_BeepLED(boolean BeepON,boolean LEDON, int duration); // 开启蜂鸣声}public static Map<String,String> getInfos(int type){return getInfos(null,type);}/*** @Author henry* @Description 读取身份证* @Date 2019-03-22 9:52* @Param saveDir 图片存储路径* @Param type 类型 1:身份证 2:ic卡* @return java.util.Map<java.lang.String,java.lang.String>*/public static Map<String, String> getInfos(String saveDir,int type){Map<String, String> paramMap = new HashMap<>();int ret;int iPort=1001;     //USB PORTret= DLL.INSTANCE.InitComm(iPort);if(ret!=1){paramMap.put("msg","没有找到读卡器!");}else{System.out.println("读卡器连接成功!");if (type == 1){paramMap = getCardInfos(ret,paramMap,saveDir);}else{paramMap = getIcCardNo(paramMap);}}ret= DLL.INSTANCE.CloseComm();if(ret!=1){System.out.println("读卡器关闭连接错误!");}else{System.out.println("读卡器关闭连接成功!");}return paramMap;}/*** @Author henry* @Description 获取IC卡 卡号* @Date 2019-03-22 9:52* @Param* @return*/private static Map<String,String> getIcCardNo(Map<String,String> paramMap){try {byte[] sn = new byte[1024];int res = DLL.INSTANCE.Routon_IC_HL_ReadCardSN(sn);if (res > 0){DLL.INSTANCE.HID_BeepLED(true,true,200); // 开启蜂鸣paramMap.put("sn", new String(sn, "GBK").trim());}else{paramMap.put("msg","读卡失败!请将卡重新放读卡器上!");}}catch (UnsupportedEncodingException ex){ex.printStackTrace();}return paramMap;}/*** @Author henry* @Description 读取身份证信息* @Date 2019-03-22 10:06* @Param* @return*/private static Map<String,String> getCardInfos(int ret,Map<String,String> paramMap,String saveDir){ret= DLL.INSTANCE.Authenticate();if(ret!=1){paramMap.put("msg","读卡失败!请将身份证重新放读卡器上!");}else{byte[] Name = new byte[31];byte[] Gender = new byte[3];byte[] Folk = new byte[10];byte[] BirthDay = new byte[9];byte[] Code = new byte[19];byte[] Address = new byte[71];byte[] Agency = new byte[31];byte[] ExpireStart = new byte[9];byte[] ExpireEnd = new byte[9];byte[] directory; //设置照片存放目录if (saveDir == null || "".equals(saveDir)){directory = new byte[200];}else{directory = saveDir.getBytes();}ret= DLL.INSTANCE.ReadBaseInfosPhoto(Name, Gender, Folk, BirthDay, Code, Address, Agency, ExpireStart, ExpireEnd, directory);if(ret>0){System.out.println("信息读取成功!");try {System.out.println("-----------------------------------------------");paramMap.put("Name", new String(Name, "GBK").trim());paramMap.put("Gender", new String(Gender, "GBK").trim());paramMap.put("Folk", new String(Folk, "GBK").trim());paramMap.put("BirthDay", new String(BirthDay, "GBK").trim());paramMap.put("Code", new String(Code, "GBK").trim());paramMap.put("Address", new String(Address, "GBK").trim());paramMap.put("Agency", new String(Agency, "GBK").trim());paramMap.put("ExpireStart", new String(ExpireStart, "GBK").trim());paramMap.put("ExpireEnd", new String(ExpireEnd, "GBK").trim());paramMap.put("directory", new String(directory, "GBK").trim());System.out.println("-----------------------------------------------");} catch (UnsupportedEncodingException e) {paramMap.put("msg","卡信息异常!");e.printStackTrace();}}}return paramMap;}public static void main(String[] args) {System.out.println(getInfos(1).toString());}
}

spring boot 启用定时任务调取精伦IDR210阅读软件获取身份证信息 jna dll相关推荐

  1. Spring Boot 启用 http2 协议

    Spring Boot 启用 http2 协议 HTTP2是万维网(WWW)发布的HTTP网络协议主流版本,也是当前HTTP协议的最新版本(1997年发布的HTTP 1.1).它来源于SPDY协议,最 ...

  2. Spring Boot实现定时任务的动态增删启停

    欢迎关注方志朋的博客,回复"666"获面试宝典 作者 | jessehua 来源 | https://www.jianshu.com/p/0f68936393fd 在spring ...

  3. Spring Boot 实现定时任务的动态增删启停

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:jianshu.com/p/0f68936393fd 添加执 ...

  4. Spring Boot 注解定时任务

    注解 @Scheduled(cron = "0/5 * * * * ?") 相当于原来的xml版本的如下配置 <task:scheduled ref="schedu ...

  5. Spring Boot 实现定时任务

    Spring Boot 要实现定时任务只要加 3 个注解就可以完成完成 只要分别在启动类,类,方法 加上 @EnableScheduling @Component @Scheduled 这三个注解缺一 ...

  6. Spring Boot之定时任务

    定时任务是我们在项目中经常遇到的场景,也是进场需要使用的场景.比如说订单,没10分钟需要取消没有未支付的订单等等. Timer Timer是 JDK 自带的定时执行的工具类,无需任何的处理就可以直接使 ...

  7. spring boot 开启定时任务的三种方式

    序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...

  8. Spring Boot中使用Actuator的/info端点输出Git版本信息

    对于Spring Boot的Actuator模块相信大家已经不陌生了,尤其对于其中的/health./metrics等强大端点已经不陌生(如您还不了解Actuator模块,建议先阅读<Sprin ...

  9. 精伦身份证阅读器php_精伦IDR210-1(免驱)身份证阅读器

    产品概述 精伦IDR210-1身份证读卡器是一款多功能 .免装驱动程序的射频卡读写器,可根据需求配置不同部件实现不同射频卡的读取和写入功能. 精伦IDR210-1配置了专用身份证安全控制模块(SAM) ...

最新文章

  1. 计算机画图工具怎么缩小图片,Win10如何放大或缩小图片?利用win10画图工具放大、缩小图片教程...
  2. 10、同步机制遵循的原则_我要遵循的10条原则
  3. Vertebrae 发布了新的SDK!
  4. 【架构】阿里中台内容整理(部分)
  5. Java 10:“ var”关键字
  6. data为long 怎么设置vue_vue基础之data
  7. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式
  8. react map循环生成的button_常见 React 面试题
  9. 90+深度学习开源数据集整理|包括目标检测、工业缺陷、图像分割等多个方向...
  10. [转]cocos2d-x场景切换时内存过高导致crash解决方法
  11. java关键字定义字符变量_Java 关键字和标识符
  12. 畅捷通李鲲:云让自然语言处理在企业更快落地
  13. python 列表、元组、字典、集合
  14. 2048小游戏后端的实现
  15. 洛谷 Floating point exception: 8 Floating-point exception. 报错
  16. Excise_Oop1
  17. 微信授权登录mock(在没有真实微信账号的情况下测试大量微信账户授权登录的情况)...
  18. 物联网小课堂之模组SIM卡相关秘籍
  19. 怎么搭建直播平台,直播环境搭建该怎样做?
  20. java计算机毕业设计高校游泳馆信息管理源码+mysql数据库+系统+lw文档+部署

热门文章

  1. 计算机一级考试操作题基础操作,计算机一级考试基础操作题.doc
  2. 抖音淘宝电商直播运营SOP计划表格脚本
  3. 亚马逊的运营思路是什么?有没有教程?
  4. 什么样的爱情是好的爱情?
  5. 自定义View 实现左右拖动脉象图
  6. Error Code 1318 Incorrect number of arguments for PROCEDUR
  7. 做好网站图片页面seo优化的五大细节
  8. 惠普将为问题笔记本延长保修甚至退机
  9. http://shijian.javaeye.com/blog/208190
  10. 惠普计算机为什么有时无法引导,教你惠普无法开机重装win10