JAVA有关NFC读卡器读取数据

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

JAVA有关NFC读卡器读取数据_第1张图片

 

解释一下这几个参数嗾使什么:

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进行读取。

图显示部分返回码的含义:JAVA有关NFC读卡器读取数据_第2张图片

好了今天就写这么多,下次再详细研究

你可能感兴趣的:(JAVA有关NFC读卡器读取数据)