`
sanyecao2314
  • 浏览: 135194 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java读取IC卡设备

 
阅读更多

有几个项目都用到IC卡设备,IC卡供应商提供的例程里没有java的例子,调试过程发现各种问题,总算是测试通过了,mark一下.

       基本思路:通过JNative.jar包调用dll方式,读取IC卡的序列号.

       代码:

       

package com.test;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.HANDLE;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

public class TestConn {

	static Pointer pointer;

	/**
	 *打开连接
	 * 
	 * @param port
	 *            串口号,取值为0~3
	 * @param baud
	 *            通讯波特率9600~115200
	 * @return 通讯设备标识符
	 * @throws NativeException
	 * @throws IllegalAccessException
	 */
	private static final int TestConnect(int port, long baud)
			throws NativeException, IllegalAccessException {
		JNative n = null;
		try {
			n = new JNative("iccrf.dll", "rf_init"); // 加载函数对象
			n.setRetVal(Type.INT); // 设置函数返回值类型
			int i = 0; // 设置参数顺序
			n.setParameter(i++, Type.INT, "" + port); // 设值
			n.setParameter(i++, Type.INT, "" + baud); // 设置
			System.out.println("调用的DLL文件名为:" + n.getDLLName());
			System.out.println("调用的方法名为:" + n.getFunctionName());

			n.invoke(); // 调用函数

			// System.out.println(n.getRetVal());

		} finally {
			if (n != null)
				n.dispose(); // 关闭
		}
		return Integer.parseInt(n.getRetVal()); // 函数返回值
	}

	/**
	 * 创建指针,用于接收调用函数的返回值
	 * 
	 * @return
	 * @throws NativeException
	 */
	public Pointer creatPointer() throws NativeException {

		pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(10000));// 分配的内存大小
		return pointer;

	}

	/**
	 * 蜂鸣控制
	 * 
	 * @param icdev
	 *            通讯设备标识符
	 * @param msec
	 *            蜂鸣时间,单位10毫秒
	 * @return
	 * @throws NativeException
	 * @throws IllegalAccessException
	 */
	private String testBeep(int icdev, int msec) throws NativeException,
			IllegalAccessException {
		JNative n = null;
		try {
			n = new JNative("iccrf.dll", "rf_beep"); // 加载函数对象
			n.setRetVal(Type.INT); // 设置函数返回值类型
			int i = 0; // 设置参数顺序
			n.setParameter(i++, icdev);
			n.setParameter(i++, msec); // 设值
			System.out.println("调用的DLL文件名为:" + n.getDLLName());
			System.out.println("调用的方法名为:" + n.getFunctionName());

			n.invoke(); // 调用函数
		} finally {
			if (n != null)
				n.dispose(); // 关闭
		}
		return n.getRetVal(); // 函数返回值
	}

	/**
	 * 退出,恢复串口
	 * 
	 * @param icdev
	 * @return
	 * @throws Exception
	 */
	private String exit(int icdev) throws Exception {
		JNative n = null;
		try {
			n = new JNative("iccrf.dll", "rf_exit"); // 加载函数对象
			n.setRetVal(Type.INT); // 设置函数返回值类型
			int i = 0; // 设置参数顺序
			n.setParameter(i++, icdev);
			// n.setParameter(i++, msec); // 设值
			System.out.println("调用的DLL文件名为:" + n.getDLLName());
			System.out.println("调用的方法名为:" + n.getFunctionName());

			n.invoke(); // 调用函数
		} finally {
			if (n != null)
				n.dispose(); // 关闭
		}
		return n.getRetVal(); // 函数返回值
	}

	/**
	 * @param handle
	 * @param Mode
	 *            寻卡模式(0为对一张卡操作,1为对多张卡caozu)
	 * @return
	 * @throws NativeException
	 * @throws IllegalAccessException
	 */
	private long card(int handle, int Mode) throws NativeException,
			IllegalAccessException {
		JNative n = null;
		System.gc();
		String aa ;
		try {
			// 1.创建JNative对象
			n = new JNative("iccrf.dll", "rf_card");
			// 2.设置函数返回值类型
			n.setRetVal(Type.INT);
			// 3.设置参数类型
			// 声明指定内存空间
			Pointer NKey = new Pointer(MemoryBlockFactory
					.createMemoryBlock(100));
			n.setParameter(0, handle);
			n.setParameter(1, Mode);
			n.setParameter(2, NKey);
			// 4.执行函数
			n.invoke();
			aa = n.getRetVal();
			System.out.println(aa);
		} finally {
			if (n != null) {
				extracted(n);
			}
		}
		return Long.parseLong(aa);
	}

	private void extracted(JNative n) throws NativeException,
			IllegalAccessException {
		n.dispose();
	}

	public String readICCard() throws Exception {
		TestConn tc = new TestConn();
		Pointer po = tc.creatPointer();
		int icdev = TestConn.TestConnect(3, 9600);
		System.out.println("handle===" + icdev);
		long a = 0l;
		for (int i = 0; i < 60; i++) {
			a = tc.card(icdev, 1);
			System.out.println("a==" + a);
			if (a != 1l)
				break;
			Thread.sleep(200);
		}

		String beep = tc.testBeep(icdev, 500);
		System.out.println("beep==" + beep);
		if ("0".equals(beep)) {
			System.out.println("蜂鸣成功!");
		} else {
			System.out.println("蜂鸣失败!");
		}
		String exit = tc.exit(icdev);
		System.out.println("exit=" + exit);
		return String.valueOf(a);

	}

	public static void main(String[] args) throws Exception {
		TestConn tc = new TestConn();
		Pointer po = tc.creatPointer();
		int icdev = TestConn.TestConnect(3, 9600);
		System.out.println("handle===" + icdev);
		long a = 0l;
		for (int i = 0; i < 60; i++) {
			a = tc.card(icdev, 1);
			System.out.println("a==" + a);
			if (a != 1l)
				break;
			Thread.sleep(200);
		}

		String beep = tc.testBeep(icdev, 500);
		System.out.println("beep==" + beep);
		if ("0".equals(beep)) {
			System.out.println("蜂鸣成功!");
		} else {
			System.out.println("蜂鸣失败!");
		}
		String exit = tc.exit(icdev);
		System.out.println("exit=" + exit);

	}
}

         

        可能会遇到的问题:

        1.dll文件调用问题,有些dll文件提供的方法需要一些入口参数,除了指针类型,还会有一些其他类型的,我测试过程发现,java代码里传一个int型的1进去,dll文件的方法接收到的却是49了,这个如果没有dll文件源码做调试,估计累死也调不出来.

         2.读卡器.我使用的读卡器是通过USB口和电脑连接的,后台原理是模拟com口,测试过程一直使用的是com4口,客户使用中发现也会使用别的com口,如果不通的时候,也需要在设备管理器里去看看,到底使用的是哪个com口,不对的话,改一下.

分享到:
评论

相关推荐

    java连接IC卡 接口

    iC卡读写器是连接IC卡与计算机的硬件设备,它提供了物理接触点与卡片通信,同时通过USB或其他接口与主机进行数据交换。读写器程序则是控制读写器硬件并与卡片进行通信的软件,通常基于PC/SC框架实现。 4. **接口...

    java读取IC卡所需的库文件

    日常中java读取ID卡需要的库文件,将该文件放置在C:\Windows\System32下,通过java程序就可以连接IC卡读取设备读取IC卡。 可操作的卡型号包括: 1.ISO14443A: NTAG203、NTAG210、NTAG212、NTAG213、NTAG215、NTAG216...

    USB-IC读写器Java_Jna示例源码.rar

    标题 "USB-IC读写器Java_Jna示例源码.rar" 提供的是一个使用Java通过JNA(Java Native Access)技术调用DLL动态库来读写IC卡的示例项目。这个项目主要关注的是在Java环境中实现对IC卡,如MIFARE One卡的读写操作,这...

    利用Java代码读取大华门禁控制器反馈的IC卡号

    3. **读取IC卡号**: - IC卡号通常作为控制器响应的一部分,通过解析接收到的数据包来提取。这涉及到数据解析逻辑,包括报文格式、校验机制等。 - 可能需要识别特定的报文标识符,例如特定字节表示IC卡号的开始,...

    Java JNI调用IC卡读卡器

    通过以上步骤,你就可以在Java应用程序中利用JNI调用IC卡读卡器的DLL,实现读取和写入IC卡的功能。注意,调用DLL可能会涉及线程安全、错误处理以及资源管理等问题,所以在实际应用中需要仔细考虑这些因素。此外,...

    IC卡 的读取 源程序

    5. 接收响应:读取IC卡返回的数据,检查应答状态。 6. 错误处理:根据返回的状态码判断操作是否成功,进行必要的重试或错误报告。 五、安全机制 1. 密钥管理:IC卡通常有预置的加密密钥,用于保护数据安全,如DES、...

    JAVA编写IC卡读写器例子

    这个“JAVA编写IC卡读写器例子”是一个很好的学习资源,可以帮助开发者了解如何在JAVA环境中实现对IC卡的数据读取和写入操作。 首先,我们来看看“15 ic卡10位与8转”这个标签。这可能指的是IC卡数据的编码格式转换...

    Android手持机PDA开发、PSAM验证、IC卡读取(CPU、M1等)、RFID读取

    3. **IC卡读取(CPU卡、M1卡)**:IC卡分为多种类型,CPU卡(集成电路卡)具有更强的计算能力和安全特性,常用于银行、身份证等高安全性应用。M1卡(也称为EMV或Felica卡)主要用于小额支付和门禁系统。Android设备...

    IC卡的读取源程序,包括源代码·Protel原理图和PCB图.rar

    2. **读取程序实现**:读取IC卡的源代码通常涉及到与卡的通信协议,如ISO/IEC 7816系列标准,这些协议定义了命令结构、数据传输和错误处理。程序可能使用C、C++或Java等编程语言编写,通过串行接口(如SPI或I2C)...

    IC卡号的获取及实现

    4. **数据读取**:一旦卡片被正确识别,就可以通过命令读取IC卡上的信息,包括卡号。对于非加密的卡片,卡号可能直接暴露在公开区域;对于安全的卡片,可能需要进行加密操作。 5. **数据处理**:读取到的卡号数据...

    IC卡读写器JAVA例子

    IC读卡器支持MIFARE标准, 工作频率13.56MHZ,以106kbit/s速率高速访问射频卡,数据加密和双向验证, 防冲突,可同时读取多张射频卡,通信错误自动侦测。支持支持S50,S70,UtraLight,Mifare Pro,ICODE2,At88RF020芯片...

    IC卡上位机和程序

    在实践操作中,通过IC卡上位机程序,用户可以进行读取卡片信息、写入数据、验证卡片等操作。例如,读取卡片的序列号(SERIAL NUMBER)、发行商信息( Issuer Identification Number, IIN),或者执行交易操作如充值...

    ic卡读写程序源码

    IC卡读写程序源码是用于与智能IC卡交互的软件开发资源,它包含了实现IC卡数据读取、写入、管理等功能的代码。在IT领域,这种程序通常基于特定的通信协议,如ISO 7816或PICC(Proximity Coupling Device)标准,用于...

    IC卡读取程序与pcb设计图.zip

    在本资料包中,“IC卡读取程序”可能包含了一系列的代码文件,如C++、Java或Python等编程语言编写的程序,用于控制读卡器设备与IC卡进行通信。 PCB(Printed Circuit Board)即印制电路板,是电子设备中的核心组成...

    明华读卡器Java例程

    在IT行业中,尤其是在嵌入式系统和智能设备的开发领域,读卡器是一种常见的硬件设备,用于读取和写入各种类型的卡片,如SIM卡、SD卡等。明华读卡器作为其中的一个品牌,提供了丰富的接口和功能,使得开发者能够通过...

    IC卡操作、原理

    USB接口的IC读写器是连接计算机与IC卡的设备,支持多种编程语言(如C、Java、Python等)的API接口。它们遵循USB设备类定义,通常采用虚拟COM端口或直接驱动模式进行通信。通过OEM软件,用户可以实现对IC卡的读写操作...

    java版串口读写卡测卡工具(CPU卡)

    java做的串口读写卡测卡工具,可以用来读CPU卡和金融IC卡,自动和手动发APDU指令,对卡片上的文件进行分析测试。 没有读卡器?不用担心,串口指令是透传的,用单片机做一个串口的读卡模块就可以替代。

    安卓NFC相关-NFC开发学习可以参考此代码demo中实现了简单易懂的NFC读与写能实现对IC卡的写入数据读取等操作.rar

    在这个名为“安卓NFC相关-NFC开发学习可以参考此代码demo中实现了简单易懂的NFC读与写能实现对IC卡的写入数据读取等操作.rar”的压缩包中,包含了Android平台上NFC功能开发的示例代码,旨在帮助开发者理解和应用NFC...

    ic卡中javaRD800问题

    在标签中提到的“javaRD800”是一个特定的Java库,用于与德卡D3读卡器通信,以便读取和操作M1卡(一种常见的IC卡类型)的数据。解决此类问题的过程通常包括下载必要的库文件(如`javaRD800.dll`和`dcrf32.dll`),并...

    非接触IC卡读写程序

    5. API接口:非接触IC卡读写程序通常提供API接口,供开发者集成到自己的应用程序中,以实现卡片的读取、写入和管理功能。 6. 编程语言支持:这类程序可能支持多种编程语言,如C++、Java、Python或.NET,以便不同...

Global site tag (gtag.js) - Google Analytics