在使用SmartCardIO接口发送APDU指令时,有时指令正确执行,但是却返回6E00这个错误指令。
经过调查发现,使用读卡器直接发送该条指令不会有问题,但是通过SmartCardIO的CardChannel.transmit()指令发送则会返回6E00错误,实际上该指令却正确执行了。
下图为使用读卡器发送指令时获取的数据流,可以看到指令发送出去后(第一个OUT)会获得正确返回结果6118(第二个IN)(注:61**表示返回数据长度为**,方便获取返回结果),然后读卡器发送指令00C0000018去取返回结果(第二个OUT),最后获得返回结果(第三个IN),从末尾的9000可以判断该指令被正确执行。
让人头疼的来了,如果使用SmartCardIO中相关接口去发送该指令,你会发现上面指令竟然返回6E00。
如下图所示数据流,指令正确发送了,获得的返回数据流长度也是对的(6118),然后发送80C0000018获得指令执行后的数据,获得的数据末尾为6E00(第3个IN)。
为什么同一条语句,使用不同的方式执行会出现问题呢?
通过上面对比,可以肯定指令是没有问题的,而且无论第一第二种方式,都可以通过测试验证指令确实正确执行了(你可以发送其它指令读取标志位判断)。既然指令正确执行,为啥smartcardio获得的返回结果竟然是6E00?可以看到,在获取APDU实际返回结果时,指令稍有不同。读卡器发送的是00C0000018,而smartcardio发送的是80C0000018,这就是问题所在了。
解决方法:
通过在smartcardio中手动发送00C0000018获得正确的返回结果