有几个项目都用到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卡_java读取IC卡设备相关推荐

  1. java加载xml配置文件_java读取配置文件的几种方法

    原标题:java读取配置文件的几种方法 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小总结一下,主要叙述的是spring ...

  2. java中读取mp3文件_java读取mp3文件

    JMF实际上是Java的一个类包.JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能.这些功能包括:媒体捕获.压缩.流转.回放,以及对各种主要媒体形式和编码的支 持,如M-J ...

  3. java读取本地文件下载_java 读取本地的json文件

    首先,要先去下载相关的jar包,否则你是无法做到的. 在百度或者谷歌里面输入java json  jar包下载就行了(共7个包). xom-1.1.jar ezmorph-1.0.6.jar json ...

  4. java读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  5. Java读取propertise配置文件_JAVA读取PROPERTIES配置文件

    项目经常用到json,xml,properties,文本文件等,作为配置文件.用来存储连接字符串或其他配置参数等. 本文记录properties. properties文件,存储格式 键=值.例如新建 ...

  6. java xml文件内容替换_java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.java importjava.io.FileInputStream;importjava.io.FileWriter;impo ...

  7. java读取excel数据_Java读取Excel内容(转)

    借助于apathe的poi.jar,由于上传文件不支持.jar所以请下载后将文件改为.jar,在应用程序中添加poi.jar包,并将需要读取的excel文件放入根目录即可 本例使用java来读取exc ...

  8. java解析xml生成表格_JAVA读取XML文件并解析 以及 JAVA生成文本文件输出

    废话不多说,直接上代码及说明吧! package Dao; import java.io.File; import java.util.ArrayList; import java.util.List ...

  9. java 导入导出txt文件_Java读取和写入txt文件

    1 问题描述 对于java的读取和写入txt一直心存疑惑,随着知识的积累,又重新进行学习,对java的文件读写理解更加深刻,在这里将自己的小小经验总结分享给大家.下面是大家了解java流的一个基本框架 ...

最新文章

  1. 核酸序列特征信息分析
  2. Zookeeper 服务注册与发现02——服务消费者
  3. oracle 日志注册,Oracle日常维护中管理用户以及重做日志文件的方法
  4. 典型PC系统各操作指令执行时间
  5. Java 查找链表中的元素
  6. python小城市创业好项目_小城市创业好项目有哪些?
  7. 华为Mate 30 Pro曝光:双曲面刘海屏 支持3D人脸识别
  8. 惊呆了!被公司辞退拿了22万补偿金,原东家称每月涨薪7000,只要退还22万
  9. android fragment面试,Android fragment之间传递数据的方式?
  10. 力扣-80 删除有序数组中的重复项 II
  11. android 热更新jar,Android热更新之so库的热更新
  12. 第一节:setTimeout和setInterval定时器
  13. 快播资源地址转百度影音地址v1.2
  14. TeamTalk Base静态库说明
  15. 【联邦学习】隐私计算理论和效率
  16. glide 设置宽高_glide如何设置图片大小
  17. “中华酷联米”第一阵营形成 小米梦如何继续
  18. 薄膜单点压力传感器的制作
  19. 简单介绍JVM的GC过程
  20. 国内物联网平台初探(八):中移物联网开放平台OneNet

热门文章

  1. 小程序可以跟哪些行业做结合呢?
  2. WIN10系统盘安装提示MBR分区问题解决步骤
  3. 144hz和60hz测试软件,专业FPS玩家讲解:60Hz与144Hz刷新率的问题
  4. 快手-开眼快创 Flutter 实践
  5. 一个能启动电脑的U盘
  6. php过滤微信表情符号的正则表达式方法
  7. web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作
  8. Mac用户学Python-Day1:安装与环境配置
  9. 总结HTMLT5高级的新特性
  10. 用计算机网络专业说一句情话,用你的专业,说一句情话!