飞天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读卡代码相关推荐

  1. Java开发需要学习哪些知识?初学者怎么学好Java开发?

    根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%,对软件开发人才的需求达到了20%,还同时以每年20%的速度在增长.由此,我国不仅在软件开发人才 ...

  2. 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获

    2019独角兽企业重金招聘Python工程师标准>>> 用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值! 用C#.NET调用 ...

  3. java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

    零基础学Java开发技术有哪些优势和好处?Java开发技术有下列优势:Java编程语言简单.面向对象集中于对象及其接口.分布式处理TCP/IP协议.鲁棒性.安全性.体系结构中立性.可移植性.解释执行. ...

  4. 2020年Java开发前景还好吗?现在学java好找工作吗?

    2020年Java开发前景还好吗?现在学java好找工作吗?下面就跟着小编一起来看看吧! Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植 ...

  5. Java开发需要学习哪些知识?小白怎么学好Java开发?

    根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%,对软件开发人才的需求达到了20%,还同时以每年20%的速度在增长.由此,我国不仅在软件开发人才 ...

  6. java开发有不加班的吗_8年Java开发的500强企业大佬告诉你,程序员不加班就没有前途吗?...

    一.有没有不加班的程序员? 有,我一个朋友就是,下面是他的经历: 我目前工作与一家500强外企(欧美),职称为高级软件开发专家.我在这家公司(500强外企)已经服务了8年,所有加班次数合起来不超过一个 ...

  7. javaweb 图书管理系统完整代码_看一名Java开发人员以红队思维五分钟审计一套代码(续)...

    前言 上篇文章的发布引起了很多读者的浏览,有很多读者也催更希望读到续集,作者也收获到读者的鼓励,说明这条路线对大家有帮助,是有意义的.所以,今天作者将继续阐述在审计Java代码时的思路. 概述 上篇文 ...

  8. java开发如何年薪30万_这位Java工程师,5年突破年薪30万,是如何做到的?

    5年突破年薪30万,这位java工程师就在你的身边,可能是你的朋友,也可能就是你.Java工程师的薪资待遇与所处的领域和自身的岗位有较大的关系,对于Java工程师来说,要想在较短的时间内提升自己的薪资 ...

  9. java开发有不加班的吗_8年Java开发大佬告诉你,程序员不加班就没有前途吗?

    一.有没有不加班的程序员? 有,我一个朋友就是,下面是他的经历: 我目前工作与一家500强外企(欧美),职称为高级软件开发专家.我在这家公司(500强外企)已经服务了8年,所有加班次数合起来不超过一个 ...

最新文章

  1. 使用nc传输文件和目录【转】
  2. c创建python虚拟机_cpython大致数据结构实现笔记
  3. python支付系统_GitHub - zhuf/alipay_python: 支付宝 alipay python接口,支持担保交易,即时到帐和自动发货接口...
  4. linux命令学习——tar
  5. C++通过WIN32 API获取逻辑磁盘详细信息
  6. unity linerenderer在Game窗口中任意画线
  7. 【ESD专题】案例:同样是RS485芯片,ESD的性能却天差地别?
  8. 城市应急管理系统技术方案
  9. 嵌入式三大职业发展方向
  10. 深入理解快速排序和 STL 的 sort 算法
  11. qt触摸屏隐藏鼠标指针
  12. 初识二维码 第十八讲 编码转换
  13. 第二章 03 藤蔓生长
  14. HDU5619 Jam's store(最小费用最大流 MCMF)
  15. 已经开源的阿里云播放器的播放内核
  16. 硕士毕业论文的致谢怎么写
  17. 贝壳ip连接服务器没响应,贝壳物联通讯协议TCP连接测试教程
  18. 使用Python连接阿里云盘
  19. 记一次《C语言踩内存》问题定位有感
  20. 施耐德服务器屏幕不显示,施耐德 触摸屏 HMI_ presentation -人机界面.ppt

热门文章

  1. keras版yolov3绘制acc和loss曲线
  2. Win10系统忘记开机密码的解决办法
  3. 2019年北京摇号窗口办理地址、电话
  4. 嵌入式Linux应用开发详解
  5. 根文件系统制作 -- Kernel panic - not syncing
  6. 人脸识别主板人脸识别整机如何发送闸机开关指令继电器关闸开闸
  7. 基于物联网的环境监控系统设计与实现
  8. 微信小程序(组件开发)
  9. 本周最新文献速递20211010
  10. mediaplayer android mp3 url,Android MediaPlayer 播放音频