您实际使用的命令不是您所期望的.
使用此阅读器获取UID /序列号/枚举标识符的正确命令APDU是:
+------+------+------+------+------+
| CLA | INS | P1 | P2 | Le |
+------+------+------+------+------+
| 0xFF | 0xCA | 0x00 | 0x00 | 0x00 |
+------+------+------+------+------+
但是,您使用的构造函数定义为:
public CommandAPDU(int cla, int ins, int p1, int p2, int ne);
所以
new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 0x00)
您正在创建具有以下参数的C-APDU:CLA = 0xFF,INS = 0xCA,P1 = 0x00,P2 = 0x00.到目前为止,这与上面的APDU相同.但最后一个参数是Ne = 0x00. Ne = 0表示预期响应字节数为零(而Le = 0表示预期响应字节数为(最多)256).
这样可以有效地创建以下Case-1 APDU:
+------+------+------+------+
| CLA | INS | P1 | P2 |
+------+------+------+------+
| 0xFF | 0xCA | 0x00 | 0x00 |
+------+------+------+------+
因此,最多您将获得2字节状态字作为响应(指示成功使用0x90 0x00或指示错误,状态代码如0x6X 0xXX).
所以你可以使用字节数组来形成你的APDU:
new CommandAPDU(new byte[] { (byte)0xFF, (byte)0xCA, (byte)0x00, (byte)0x00, (byte)0x00 } )
或者您可以为Ne指定适当的值:
new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 256)