nfc读卡java开发,分享一段飞天R502读卡器的JAVA读卡代码
飞天R502
收到客户一个NFC读写卡器,是飞天R502,具体介绍请看官网资料
代码
package com.test;
import javax.smartcardio.*;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class FeiTianNfcDrive {
final static byte[] getuidcomm = {(byte) 0xFF, (byte) 0xCA, 0x00, 0x00, 0x04};
// 初始化密码
final static byte[] initpass = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
// 密码
final static byte[] mypassword = "123456".getBytes();
private CardChannel channel;
private Card card;
public FeiTianNfcDrive() {
this.card = connectCard();
System.out.println("【初始化设备】:设备ART " + BytesHexStrTranslate.bytesToHexFun3(card.getATR().getBytes()));
this.channel = this.card.getBasicChannel();
}
public static void main(String[] args) {
FeiTianNfcDrive blog = null;
try {
blog = new FeiTianNfcDrive();
byte[] pass = {(byte) 0xff, (byte) 0x82, 0x00, 0x01, 0x06};
byte[] password = byteMerger(pass, initpass);
blog.getUId();
blog.addPassword(password);
blog.auth((byte) 0x0c, "A");
blog.readCard((byte) 0x0c);
//blog.writeCard((byte) 0x0c, changePassword("123456", "123456"));
blog.readCard((byte) 0x0b);
} catch (Exception e) {
if (e.getMessage().contains("SCARD_W_REMOVED_CARD")) {
System.out.println("请勿中途移开卡片");
}
System.out.println("异常: " + e.toString());
} finally {
try {
blog.close();
} catch (CardException e) {
System.out.println("关闭卡片失败");
e.printStackTrace();
}
}
}
private void close() throws CardException {
// 关闭卡片连接
card.disconnect(true);
}
/**
* 连接卡片
*
* @return
*/
public static Card connectCard() {
try {
TerminalFactory factory = TerminalFactory.getDefault();
// 获取终端设备
List terminals = factory.terminals().list();
System.out.println("终端: " + terminals);
// 读取第一张卡片
CardTerminal terminal = terminals.get(0);
// 连接卡片
Card card = terminal.connect("*");
System.out.println("卡片: " + card);
return card;
} catch (Exception e) {
if (e.getMessage().contains("list() failed")) {
System.out.println("请连接读卡器");
throw new RuntimeException("请连接读卡器");
}
if (e.getMessage().contains("No card present")) {
System.out.println("请放置IC卡");
throw new RuntimeException("请放置IC卡");
}
// 220 65 164 192
System.out.println("异常: " + e.toString());
throw new RuntimeException(e.getMessage());
}
}
public void addPassword(byte[] password) throws CardException {
System.err.println("加载密码:" + transmit(password));
}
/**
* 授权验证
*
* @throws CardException
*/
public void auth(byte block, String type) throws CardException {
byte passType = (byte) ("A".equals(type) ? 0x60 : 0x61);
byte[] comm = {(byte) 0xff, (byte) 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, block, passType, 0x01};
System.err.println("授权: " + transmit(comm));
}
/**
* 读卡片信息
*
* @param block
* @throws CardException
*/
public void readCard(byte block) throws CardException {
byte[] comm = {(byte) 0xff, (byte) 0xb0, 0x00, block, 0x10};
System.err.println("读取" + block + "块数据: " + transmit(comm));
}
/**
* 写卡片信息
*
* @param block
* @param data
* @throws CardException
*/
public void writeCard(byte block, byte[] data) throws CardException {
byte[] comm = {(byte) 0xff, (byte) 0xd6, 0x00, block, 0x10};
if (data.length != 16) {
throw new RuntimeException("写入数据超出范围");
}
byte[] newComm = byteMerger(comm, data);
System.err.println("【写入数据】:即将写入的数据为: " + BytesHexStrTranslate.bytesToHexFun3(newComm));
transmit(newComm);
}
/**
* 获取修改密码的数据串
*
* @param passwordA
* @param passwordB
* @return
* @throws CardException
* @throws UnsupportedEncodingException
*/
static byte[] changePassword(String passwordA, String passwordB) throws UnsupportedEncodingException {
// 密码控制位置
final byte[] base = {(byte) 0xFF, 07, 80, 69};
byte[] passA = passwordA.getBytes("UTF-8");
byte[] passB = passwordB.getBytes("UTF-8");
if (passA.length > 6) {
throw new RuntimeException("【修改密码】:密码A的长度过长");
}
if (passB.length > 6) {
throw new RuntimeException("【修改密码】:密码A的长度过长");
}
// 1. 先将A和控制位连接起来
byte[] temp = byteMerger(passA, base);
// 最终的密码
byte[] newPass = byteMerger(temp, passB);
System.err.println("【修改密码】:发送指令: " + BytesHexStrTranslate.bytesToHexFun3(newPass));
return newPass;
}
/**
* 获取卡片ID
*
* @throws CardException
*/
public void getUId() throws CardException {
transmit(getuidcomm);
}
/**
* 发送指令
*
* @param data
* @return
* @throws CardException
*/
public byte[] transmit(byte[] data) throws CardException {
// 发送命令
System.out.println("发送指令: " + BytesHexStrTranslate.bytesToHexFun3(data));
ResponseAPDU answer = channel.transmit(new CommandAPDU(data));
System.out.println("设备响应: " + BytesHexStrTranslate.bytesToHexFun3(answer.getData()));
checkResp(answer.toString());
return answer.getData();
}
/**
* 校验响应结果
*
* @param resp
* @return
*/
public boolean checkResp(String resp) {
System.out.println(resp);
if (resp.contains("SW=9000")) {
System.out.println("响应成功");
return true;
} else {
System.out.println("响应失败");
}
return false;
}
/**
* 合并两个byte数组
*
* @param byte_1
* @param byte_2
* @return
*/
public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
byte[] byte_3 = new byte[byte_1.length + byte_2.length];
System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
return byte_3;
}
}
nfc读卡java开发,分享一段飞天R502读卡器的JAVA读卡代码相关推荐
- Java开发需要学习哪些知识?初学者怎么学好Java开发?
根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%,对软件开发人才的需求达到了20%,还同时以每年20%的速度在增长.由此,我国不仅在软件开发人才 ...
- 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获
2019独角兽企业重金招聘Python工程师标准>>> 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值! 用C#.NET调用 ...
- java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?
零基础学Java开发技术有哪些优势和好处?Java开发技术有下列优势:Java编程语言简单.面向对象集中于对象及其接口.分布式处理TCP/IP协议.鲁棒性.安全性.体系结构中立性.可移植性.解释执行. ...
- 2020年Java开发前景还好吗?现在学java好找工作吗?
2020年Java开发前景还好吗?现在学java好找工作吗?下面就跟着小编一起来看看吧! Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植 ...
- Java开发需要学习哪些知识?小白怎么学好Java开发?
根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%,对软件开发人才的需求达到了20%,还同时以每年20%的速度在增长.由此,我国不仅在软件开发人才 ...
- java开发有不加班的吗_8年Java开发的500强企业大佬告诉你,程序员不加班就没有前途吗?...
一.有没有不加班的程序员? 有,我一个朋友就是,下面是他的经历: 我目前工作与一家500强外企(欧美),职称为高级软件开发专家.我在这家公司(500强外企)已经服务了8年,所有加班次数合起来不超过一个 ...
- javaweb 图书管理系统完整代码_看一名Java开发人员以红队思维五分钟审计一套代码(续)...
前言 上篇文章的发布引起了很多读者的浏览,有很多读者也催更希望读到续集,作者也收获到读者的鼓励,说明这条路线对大家有帮助,是有意义的.所以,今天作者将继续阐述在审计Java代码时的思路. 概述 上篇文 ...
- java开发如何年薪30万_这位Java工程师,5年突破年薪30万,是如何做到的?
5年突破年薪30万,这位java工程师就在你的身边,可能是你的朋友,也可能就是你.Java工程师的薪资待遇与所处的领域和自身的岗位有较大的关系,对于Java工程师来说,要想在较短的时间内提升自己的薪资 ...
- java开发有不加班的吗_8年Java开发大佬告诉你,程序员不加班就没有前途吗?
一.有没有不加班的程序员? 有,我一个朋友就是,下面是他的经历: 我目前工作与一家500强外企(欧美),职称为高级软件开发专家.我在这家公司(500强外企)已经服务了8年,所有加班次数合起来不超过一个 ...
最新文章
- 使用nc传输文件和目录【转】
- c创建python虚拟机_cpython大致数据结构实现笔记
- python支付系统_GitHub - zhuf/alipay_python: 支付宝 alipay python接口,支持担保交易,即时到帐和自动发货接口...
- linux命令学习——tar
- C++通过WIN32 API获取逻辑磁盘详细信息
- unity linerenderer在Game窗口中任意画线
- 【ESD专题】案例:同样是RS485芯片,ESD的性能却天差地别?
- 城市应急管理系统技术方案
- 嵌入式三大职业发展方向
- 深入理解快速排序和 STL 的 sort 算法
- qt触摸屏隐藏鼠标指针
- 初识二维码 第十八讲 编码转换
- 第二章 03 藤蔓生长
- HDU5619 Jam's store(最小费用最大流 MCMF)
- 已经开源的阿里云播放器的播放内核
- 硕士毕业论文的致谢怎么写
- 贝壳ip连接服务器没响应,贝壳物联通讯协议TCP连接测试教程
- 使用Python连接阿里云盘
- 记一次《C语言踩内存》问题定位有感
- 施耐德服务器屏幕不显示,施耐德 触摸屏 HMI_ presentation -人机界面.ppt