1。站在他的肩膀上,快速的看完,动手自己实战了下。对过程写下总结。总历时3.5小时。

2。手上有一个ACR122U,读卡器。不贵有条件的买一个,毕竟是神器,很好用。

3。那文中提示的JavaCard文档,和,ACR官方的文档。很重要,是核心内容。

就像数学中的公式概念,定义。没有它,就没有假设和规范。所以有必要重申下,链接。

https://docs.oracle.com/javase/7/docs/jre/api/security/smartcardio/spec/javax/smartcardio/package-summary.html

https://www.acs.com.hk/download-manual/933/API-ACR122U-CN-2.04.pdf

4。首先按rtz的原文,动手。我附上源码,且做了比较的注解。

源码中,的思路要说下的。即大纲,首先是TerminalFactory找设备读卡器,放到一个List里,一般接一个。

CardTerminal在读卡器列表中找第一个。并将读卡器,处于工作连接状态,即等你放卡状态。一放卡,就读卡号,打印出来。

接着做,加载认证密钥,即将密钥临时存放在读卡器上,至于为什么,你想读一个扇区,它有总共4块,每一块都要认证,不可能每次都加载密钥,存放在读卡器上,就方便多了,甚至别的扇区和块,如果密码一样,也可以直接用。接下来,认证,就是从将拿存放在读卡器上的密钥对某个块进行认证,通过就,可以读写那个块的数据了。

5。有机会,可以用java的图形开发,实现。

package com.ddzh.acr;import java.util.List;import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;/*** 描 述: <描述>.acr.java* * @author guolp* @since 1.0, 2018-10-24 09:20:16*/
public class acr {/*** <一句话描述该方法的功能>* * @param args* @since 1.0, 2018-10-24 09:20:19*/public static void main(String[] args) {// TODO Auto-generated method stubTerminalFactory factory = TerminalFactory.getDefault();// 得到一个默认的读卡器工厂(迷。。)List<CardTerminal> terminals;// 创建一个List用来放读卡器(谁没事会在电脑上插三四个读卡器。。)try {terminals = factory.terminals().list();// 从工厂获得插在电脑上的读卡器列表,get读卡器列表terminals.stream().forEach(s -> System.out.println(s));// 打印获取到的读卡器名称CardTerminal a = terminals.get(0);// 使用第0个读卡器[暂且不考虑同时插N个读卡器的情况了]a.waitForCardPresent(0L);// 等待放置卡片Card card = a.connect("T=1");// 连接卡片,协议T=1 块读写(T=0貌似不支持,一用就报错)CardChannel channel = card.getBasicChannel();// 打开通道CommandAPDU getUID = new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 0x04);// 中文API第12页ResponseAPDU r = channel.transmit(getUID);// 发送getUID指令System.out.println("UID: " + r.toString());// 返回:UID: ResponseAPDU: 6 bytes, SW=9000System.out.println("Data:" + bytesToHexString(r.getData()));// 即返回卡号,操作成功// 加载认证密钥,放在读卡器的EEPROMbyte[] pwd = { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff };// 先用一个数组把密钥存起来CommandAPDU loadPWD = new CommandAPDU(0xFF, 0x82, 0x00, 0x00, pwd, 0, 6);// 构造加载认证密钥APDU指令 ,中文API第13页ResponseAPDU r1 = channel.transmit(loadPWD);// 发送loadPWD指令System.out.println("加载认证密钥: " + r1.toString());// 认证密钥,验证通过后,读取同一扇区的其他块不需要再次验证,中文API原文byte[] check = { (byte) 0x01, (byte) 0x00, (byte) 0x0B, (byte) 0x60, (byte) 0x00 };// 0x01认证版本,0x00空闲,0x08认证区块号,0x60密钥类型A/0x61密钥类型B,0x00密钥存储的地址(密钥号)CommandAPDU authPWD = new CommandAPDU(0xFF, 0x86, 0x00, 0x00, check, 0, 5);// 加上指令头部,构造出完整的认证APDU指令,中文API第14页ResponseAPDU r2 = channel.transmit(authPWD);// 发送 认证指令System.out.println("认证第8区块:" + r2.toString());// 读区块2CommandAPDU getData8 = new CommandAPDU(0xFF, 0xB0, 0x00, 0x08, 0x10);// 构造 读区块APDU指令,中文API第17页ResponseAPDU r8 = channel.transmit(getData8);// 发送 读区块指令System.out.println("第8个区块,Data:" + bytesToHexString(r8.getData()));CommandAPDU getData9 = new CommandAPDU(0xFF, 0xB0, 0x00, 0x09, 0x10);// 构造 读区块APDU指令ResponseAPDU r9 = channel.transmit(getData9);// 发送 读区块指令System.out.println("第9个区块,Data:" + bytesToHexString(r9.getData()));CommandAPDU getData10 = new CommandAPDU(0xFF, 0xB0, 0x00, 0x0A, 0x10);// 构造 读区块APDU指令ResponseAPDU r10 = channel.transmit(getData10);// 发送 读区块指令System.out.println("第10个区块,Data:" + bytesToHexString(r10.getData()));CommandAPDU getData11 = new CommandAPDU(0xFF, 0xB0, 0x00, 0x0B, 0x10);// 构造 读区块APDU指令ResponseAPDU r11 = channel.transmit(getData11);// 发送 读区块指令System.out.println("第11个区块,Data:" + bytesToHexString(r11.getData()));// 写区块byte[] up = { (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06,(byte) 0x07, (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B, (byte) 0x0C, (byte) 0x0D,(byte) 0x0E, (byte) 0x0F };// 0x 构造要写入的数据,有16位CommandAPDU upData = new CommandAPDU(0xFF, 0xD6, 0x00, 0x08, up, 0, 16);//构造 写区块APDU指令,中文API第18页ResponseAPDU r4 = channel.transmit(upData);// 发送写块指令System.out.println("写区块: " + r4.toString());System.out.println("写区块: " + bytesToHexString(r4.getData()) + ":#:" + bytesToHexString(r4.getBytes()));// 打印返回值} catch (Exception e) {e.printStackTrace();}}/*** <一句话描述该方法的功能>* * @param data* @return* @author guolp* @since 1.0, 2018-10-24 09:28:48*/private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e','f' };private static String bytesToHexString(byte[] bytes) {// TODO Auto-generated method stubStringBuilder sb = new StringBuilder();int a = 0;for (byte b : bytes) { // 使用除与取余进行转换if (b < 0) {a = 256 + b;} else {a = b;}// sb.append("0x");sb.append(HEX_CHAR[a / 16]);sb.append(HEX_CHAR[a % 16]);// sb.append(" ");}return sb.toString().toUpperCase();}}

使用Java驱动ACR122U对IC卡进行读写,总结相关推荐

  1. 电动吞吐式ISO14443ISO15693多功能IC卡磁条读写器M100接口说明

    1.RS232串口通讯的线路连接图 A.将TTCE产品所携带的串口通讯线DB9线公头插在电脑串口座上. B.再将TTCE产品所携带串口通讯线的另一端3PIN插头(红线是TXD,蓝线是RXD,黑线是GN ...

  2. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  3. 树莓派使用RFID-RC522A读卡器对IC卡进行读写(通过 python)

    1. 配置树莓派 首先需要运行raspi-config,开启树莓派的spi接口,因为RFID-RC522A读卡器与树莓派之间是通过spi协议进行通信的  https://www.raspberrypi ...

  4. Vb6荣士Udp Rtu通讯IC卡网络读写源码

    网络读写器介绍: https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.25.454be728NKUIW8&id=2 ...

  5. RFID第一期——各种IC卡ID卡详解

    起因 放假闲来无事,在B站冲浪,看到有人在讨论IC卡,我在这方面刚好还是有这么一点了解,就拿MF1卡给别人举了个例子,然后MF1卡就被开除出IC卡籍了. 有点气,但是仔细想想,网上关于这些卡的介绍知识 ...

  6. IC卡和ID卡以及两者的比较

    目录 IC卡 ID卡 IC卡与ID卡的比较 IC卡 IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card).智慧卡(Intelligent card ...

  7. 公交IC卡读写器设计指南

    采用PHILIPS公司的Mifaue卡作IC卡,设计以射频技术为核心,以单片机为控制器的IC卡读写器在公交自动收费系统中的应用.制作的IC卡读写器可以实现制卡.售卡.自动收费等功能,具有安全.实用.方 ...

  8. IC-14W网络IC卡读写器_银河麒麟桌面操作系统V10适配测试报告

    银河麒麟操作系统产品NeoCertify 认证测试报告 系统版本:银河麒麟桌面操作系统V10 厂商名称:广州荣士电子有限公司 认证产品:IC-14W网络IC卡读写器 测试日期:2022-11-04 麒 ...

  9. ic卡信息保存在服务器,智能IC卡网络数据安全保密系统

    <智能IC卡网络数据安全保密系统>由会员分享,可在线阅读,更多相关<智能IC卡网络数据安全保密系统(3页珍藏版)>请在人人文库网上搜索. 1.一. 系统组成智能IC卡是一种内部 ...

最新文章

  1. 页码太靠上怎么办_有些宝宝到了二岁不会说话怎么办
  2. 迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答
  3. 您的第一个Lagom服务– Java Microservices入门
  4. 管道在c语言中的作用,在C中实现管道
  5. 《软件工程实践》第三次作业-原型设计(结对第一次)
  6. matlab 开采沉陷 何,MATLAB在开采沉陷预计可视化中的应用
  7. 电信人的数据应用:销售指引系统
  8. avalon使用笔记
  9. 读者教育浏览器兼容解决方法
  10. Matlab绘制直方图,横坐标间设置等间距的空格
  11. 通过热透镜聚焦的高斯光束
  12. mysql alter table if exists_MySQL中的alter table命令的基本使用方法及提速优化
  13. 东南大学计算机网络安全中心,胡轶宁 - 东南大学 - 网络空间安全学院
  14. 哪里有免费的ASP空间?
  15. win10分区工具下载
  16. global全局对象
  17. 伸展树 自底向上 自顶向下
  18. JavaScript一些优雅小技巧不得不知
  19. 精制糖行业采用树脂工艺进行脱色技术分析
  20. matlab与数学实验心得体会,数学matlab实验心得体会

热门文章

  1. 浏览器标准模式与怪异模式-CSS1Compat and BackCompat
  2. 留学生快速斩获IT名企实习offer的5大攻略
  3. Matlab的BP汉字识别GU(写字板功能)
  4. Kaggle小技巧:TTA(test time augmentation)测试时增强
  5. 北大青鸟ACCP5.0与ACCP4.0模块划分及各模块知识差异
  6. AI(人工智能:一种现代的方法)学习之:CSP(Constraint Satisfaction Problems) 约束满足问题:回溯法——前向检查(过滤法)、弧相容检查、 变量排序
  7. mysql 格式化时间 年月日时分秒与年月日字符串作比较
  8. 离职原因可以说,但要注意三个原则
  9. 保姆级搭建教程:Pinterest广告账户开户指南
  10. 如何以管理员的身份运行命令提示符cmd