1.简单讲对NFC读卡的认识:
读卡器ACR122,是由香港acs开发的一款NFC取卡器,分为接触式和非接触式两种
CPU卡:读取的CPU卡文件结构是由MF根目录其中包括秘钥文件,持卡人基本数据文件,目录数据文件以及秘钥文件DF01下的个个子文件构成
2.一般对硬件的访问是由4个过程组成open,init,read(write),close,但是JAVA 包 javax.smartcardio做了封装,我们只需要进行指令的输入和输出即可。
3.代码:
public ResponseAPDU exec(CardChannel ca, CommandAPDU command) {
ResponseAPDU responseAPDU = null;
try {
TerminalFactory factory = TerminalFactory.getDefault();// 得到一个默认的读卡器工场
CardTerminal cardTerminal = factory.terminals().getTerminal("ACS ACR122 0");// 从工厂获得插在电脑上的读卡器列表,get读卡器列表
cardTerminal.waitForCardPresent(0L);// 等待放置卡片
Card card = cardTerminal.connect("*");// 连接卡片
cardChannel = card.getBasicChannel();// 打开通道
responseAPDU = cardChannel.transmit(command);
} catch (CardException e) {
e.printStackTrace();
}
return responseAPDU;
}
解释一下:
其中CardChannel为卡的执行实例,CommandAPDU是有关的指令。
详见:https://docs.oracle.com/javase/6/docs/jre/api/security/smartcardio/spec/javax/smartcardio/CommandAPDU.html
CPU卡的命令报文基本分头和体,其中head中包括CLA(长度1个byte),INS(长度1个byte),P1(参数1,长度1byte),P2(参数2,长度1个byte)
命令体 命令体中各项是可选的。
Lc 命令数据域中 DATA 的长度,该长度不可超过 255 字节。
Data 命令和响应中的数据域 Le 响应数据域中期望数据的长度。
Le=00,表示需要最大字节数, 该长度不可超过 255 字节。
XX ⇒ 1 个字节 16 进制数
XXXX ⇒ 2 个字节 16 进制数
XX...XX ⇒ 未知个字节 16 进制数
好了,知道了这些就可以构造命令进行读卡了
首先,来一个简单操作
byte[] paramData = new byte[]{0x3F, 0x00};//DATA
CommandAPDU selecMF = new CommandAPDU(0x00, 0xA4, 0x00, 0x00, paramData, 0x2);//0X02(Lc)
上面这个实例是读卡的指针指向MF根路径,相当于我们Windows选择了MF文件夹一样
查看返回结果
if (!Integer.toHexString(selectMFResp.getSW()).equals("9000")) {
logger.error("Select 1001 response:{}", selectMFResp.toString());
cardChannel.close();
return null;
}
返回结果9000,是执行成功,我们的命令执行成功了,
ResponseAPDU.getData()获得返回数据,返回的数据是字节数组,需要转换成16进制的String进行读取。
。
好了今天就写这么多,下次再详细研究