有几个项目都用到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读取ID卡需要的库文件,将该文件放置在C:\Windows\System32下,通过java程序就可以连接IC卡读取设备读取IC卡。 可操作的卡型号包括: 1.ISO14443A: NTAG203、NTAG210、NTAG212、NTAG213、NTAG215、NTAG216...
Java通过Jna调DLL动态库函数读写IC卡,函数说明:https://blog.csdn.net/zhangjin7422/article/details/82714533
大华本身并没有提供Java代码读取IC卡卡号的示例代码,sdk里面也没有详细说明,本例是本人自行摸索出来,可以有效读取IC卡卡号
IC读卡器支持MIFARE标准, 工作频率13.56MHZ,以106kbit/s速率高速访问射频卡,数据加密和双向验证, 防冲突,可同时读取多张射频卡,通信错误自动侦测。支持支持S50,S70,UtraLight,Mifare Pro,ICODE2,At88RF020芯片...
java做的串口读写卡测卡工具,可以用来读CPU卡和金融IC卡,自动和手动发APDU指令,对卡片上的文件进行分析测试。 没有读卡器?不用担心,串口指令是透传的,用单片机做一个串口的读卡模块就可以替代。
NFC开发学习可以参考此代码,demo中实现了简单易懂的NFC读与写,能实现对IC卡的写入、数据读取等操作.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
本资源是关于明华读卡器的Java例程,真实可用。自己做过测试。
广东东信智能科技有限公司DONSEE系列多功能身份证社保卡读卡器Linux系统接口SDK开发包,支持 EST-100、EST-100GS、EST-J13X、EST-100G、EST-100U等机型,功能包括身份证信息读取、社保卡信息读取、IC卡、CPU卡读取,...
基于JAVA超市自助购物系统的设计与实现 资料包里包含完整源码+软件环境(也就是安装包都有)+视频(代码调试、运行、讲解视频) 基于RFID的自动识别技术,通过无线射频方式实时获得磁卡对超市物品的电子标签进行读取,...
C#非接触IC卡M1卡读写调试源代码,自己编写的明华URF-R330读写器 M1卡的读写,官方提供的demo很混乱,并且没有C#版本的,第一次测试调试都很难搞明白,我四处收集资料改写代码写出这个C#版的Demo,我这个是根据他们...
当设备端查询产品的电子标签时,设备端读取编号之后,会通过约定的数据格式通过网络传递给软件端。 当软件端开卡注册时,也会用约定好的数据格式传递给设备端,如果设备端收到数据,开发板上的LED会点亮;这时把IC拿...
CCNFCPwner 使用 EMV NFC Paycard Enrollment 库读取非接触式信用卡的简单 Android 应用程序。 一个没有使用这个库的版本正在开发中,还有它如何工作和安全问题的解释性文档。保存到文件按“_Save to File_”按钮,...
诺塔斯智能科技为非接触式IC卡读写器二次开发SDK提供了丰富的版本、针对不同的使用环境,我们提供了C#、C++、JAVA、dephi、Android、JS、Liunx、VC等多个版本,可以根据自己需要有针对性下载。
开卡: 新宠物注册之后,需要为这个宠物办理一张电子标签卡,这个卡里存放着这个宠物主人的电话号码,后面要查询这个宠物的信息,就读取整个电子标签里的电话号码,到数据库里查询。 (3). 开卡和查询的数据传输: ...
ICa阅读器 北陆铁路巴士上ICa的非官方领导人。 您可以通过在配备有NFC的终端上拿着ICa来查询使用历史和余额。 您也可以随时通过放置小部件来检查...此外,nfc-felica库用于读取FeliCa。 执照 麻省理工学院 变更记录
1、读取ID卡卡号;...2、读写M1IC卡扇区数据、修改卡片密钥、写入UID 3、读写15693协议icode2卡片 4、读写NXP Ntag卡片 5、读写低频T5557卡片 6、读写低频em4305卡片 7、读写低频em4469卡片 8、读写NDEF智能海报
当设备端查询宠物的电子标签时,设备端读取电话号码之后,会通过约定的数据格式通过网络传递给软件端。 当软件端开卡注册时,也会用约定好的数据格式传递给设备端,如果设备端收到数据,开发板上的LED会点亮;这时把...
<<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...