spring boot 啓用定時任務調取精倫IDR210閱讀軟件獲取身份證信息 jna dll

注:使用時確定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 PORT
		ret= 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());
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章