两种方法身份证读卡器对接,实现扫描身份证读取身份证信息功能。

一,JNative方法

JNAjar包依赖:

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>3.1.0</version
</dependency>

注意事项:

  1. 尝试了引入JNative的jar包来实现(由于jar自从2013年就停止更新了,所以该jar包只适用于jdk版本为32位的1.6以下版本。(包括1.6))把.dll文件放置在项目的跟目录下。有可能会报找不到.dll文件可以再尝试把项目放入系统盘如:C:\Windows\System32。相关代码如下
public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("-------------CVR_InitComm=");
		 String strTmp = "";
		 int len = 0;
		
		try {
			JNative n = null;
			n = new JNative("Termb.dll", "CVR_InitComm");
			n.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
			n.setParameter(0, 1001);
			n.invoke(); // 调用方法

			JNative n2 = null;
			n2 = new JNative("Termb.dll", "CVR_Authenticate");
			n2.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
			n2.invoke(); // 调用方法
			
			// return Integer.parseInt(n.getRetVal());
			System.out.println("-------------CVR_InitComm="
					+ Integer.parseInt(n.getRetVal()));

			System.out.println("-------------CVR_InitComm="
					+ Integer.parseInt(n2.getRetVal()));

			if (Integer.parseInt(n2.getRetVal()) == 1) {
				JNative n3 = null;
				n3 = new JNative("Termb.dll", "CVR_Read_Content");
				n3.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型
				n3.setParameter(0, "");
				n3.invoke(); // 调用方法
				System.out.println("-------------CVR_InitComm="
						+ Integer.parseInt(n3.getRetVal()));
				
//					JNative n4 = null;           
//		         
//		             n4 = new JNative("Termb.dll", "GetPeopleName"); 
//		             n4.setRetVal(org.xvolks.jnative.Type.INT); // 指定返回参数的类型 
//		             Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4*10));
//		             Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4*30));             
//		             n4.setParameter(0,b);
//		             n4.setParameter(1,a);              
//		             n4.invoke(); 
//		             byte[] by = new byte[120];             
//		             by = b.getMemory();
//		            
//	                strTmp = new String(by,"gb2312");
	           
//	                Logger.getLogger(CVR100DemoView.class.getName()).log(Level.SEVERE, null);
		           
//
//		            byte[] bt = new byte[40];  
//		            bt = a.getMemory();
//		             len = a.getAsInt(0);
//		             a.dispose();
//		             b.dispose();
//		             System.out.println("-------------name="
//								+ Integer.parseInt(n4.getRetVal()));
//		             System.out.println("-------------name="+strTmp);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		
	}

 

二,用JNA方法调用.dll文件动态库

public interface Dll extends Library {

		Dll instance = (Dll) Native.loadLibrary("Termb", Dll.class);
		Dll SDT = (Dll) Native.loadLibrary("sdtapi", Dll.class);

		public int CVR_InitComm(int Port);// 初始化连接

		public int CVR_Authenticate();// 卡认证

		public int CVR_Read_Content(int active);// 读取卡信息

		public int GetPeopleName(byte[] name, byte[] lneg);// 获得身份证姓名

		public int GetPeopleSex(byte[] name, byte[] lneg);// 获得身份证性别

		public int GetPeopleNation(byte[] name, byte[] lneg); // 得到民族信息

		public int GetPeopleBirthday(byte[] name, byte[] lneg);// 得到出生日期

		public int GetPeopleAddress(byte[] name, byte[] lneg);// 得到地址信息

		public int GetPeopleIDCode(byte[] name, byte[] lneg);// 得到卡号信息

		public int GetDepartment(byte[] name, byte[] lneg);// 得到发证机关信息

		public int GetStartDate(byte[] name, byte[] lneg);// 得到有效开始日期

		public int GetEndDate(byte[] name, byte[] lneg); // 得到有效截止日期

	}
 
 public String[] idcardReader() {
		try {
			// System.out.println("-------------------进入方法");
			String[] idcard = new String[8];
			int initComm = Dll.instance.CVR_InitComm(1001);// 初始化连接
			if (initComm == 1) {
				int authenticate = Dll.instance.CVR_Authenticate();// 读卡器和卡片之间的合法身份确认
				if (authenticate == 1) {
					// System.out.println("------------------authenticate=" +
					// authenticate);
					int Read_Content = Dll.instance.CVR_Read_Content(4);// 读取身份证信息
					// System.out.println("------------------Read_Content=" +
					// Read_Content);

					if (Read_Content == 1) {

						byte[] midbytes = new byte[1024];
						byte[] leng = new byte[1024];
						int res = Dll.instance.GetPeopleName(midbytes, leng);
						int le = returnActualLength(midbytes);
						System.out.println("姓名--" + result(midbytes, le));
						idcard[0] = result(midbytes, le);

						res = Dll.instance.GetPeopleSex(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("性别--" + result(midbytes, le));
						idcard[1] = result(midbytes, le);

						res = Dll.instance.GetPeopleNation(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("民族--" + result(midbytes, le));
						idcard[2] = result(midbytes, le);

						res = Dll.instance.GetPeopleBirthday(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("生日--" + result(midbytes, le));
						idcard[3] = result(midbytes, le);

						res = Dll.instance.GetPeopleAddress(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("地址--" + result(midbytes, le));
						idcard[4] = result(midbytes, le);

						res = Dll.instance.GetPeopleIDCode(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("身份证--" + result(midbytes, le));
						idcard[5] = result(midbytes, le);

						res = Dll.instance.GetDepartment(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("签发机关--" + result(midbytes, le));
						idcard[6] = result(midbytes, le);

						res = Dll.instance.GetStartDate(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("开始日期--" + result(midbytes, le));
						idcard[7] = result(midbytes, le);

						res = Dll.instance.GetEndDate(midbytes, leng);
						le = returnActualLength(midbytes);
						System.out.println("结束日期--" + result(midbytes, le));
						idcard[7] = idcard[7] + "-" + result(midbytes, le);
						return idcard;
					} else {
						String[] err = { "读取身份证信息失败!" };
						return err;
					}
				} else {
					String[] err = { "寻卡失败,请把身份证重新放置!" };
					return err;
				}
			} else {
				String[] err = { "连接身份证读卡器失败!" };
				return err;
			}
		} catch (Exception e) {
			String[] err = { "读取身份证异常!" };
			return err;
		}
	}

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值