我正在使用javax.smartcardio
包开发智能卡相关应用程序。我想发送伪ADPU命令来设置阅读器的LED/LCD状态。
我发现发送APDU命令到阅读器/卡的唯一方法是CardChannel::transmit
,但它必须在卡上运行。
是否有可能发送伪apdu命令,而卡不存在于阅读器中?那么APDU命令呢?(使用Java)
在http://www.springcard.com中找到SDK for PC/SC
中card-emul样本的解。下面是我的代码:
import java.util.List;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
public class TestPcsc {
public static void main( String[] args ) throws CardException {
TerminalFactory tf = TerminalFactory.getDefault();
List< CardTerminal > terminals = tf.terminals().list();
CardTerminal cardTerminal = (CardTerminal) terminals.get( 0 );
byte[] command = { (byte) 0xE0, (byte) 0x00, (byte) 0x00, (byte) 0x29, (byte) 0x01, (byte) 0x00 };
cardTerminal.connect( "DIRECT" ).transmitControlCommand( CONTROL_CODE(), command );
}
public static int CONTROL_CODE() {
String osName = System.getProperty( "os.name" ).toLowerCase();
if ( osName.indexOf( "windows" ) > -1 ) {
/* Value used by both MS' CCID driver and SpringCard's CCID driver */
return (0x31 << 16 | 3500 << 2);
}
else {
/* Value used by PCSC-Lite */
return 0x42000000 + 1;
}
}
}
我认为要点是:
- 使用
DIRECT
协议获取"卡" - 使用
Card::transmitControlCommand
方法与从CONTROL_CODE函数获得的代码(从示例代码复制,不确定理论是什么>_<)
我认为下面的方法也需要一个卡片在阅读器中,但只是为了你的信息,我把它贴在这里说我们有另一种终端控制命令的方法:
从这里引用:
transmitControlCommand:
public abstract byte[] transmitControlCommand(int controlCode,byte[] command)抛出CardException
向终端设备发送控制命令。这可以用来,例如,控制终端功能,如内置PIN pad或生物识别。
参数:
controlCode—命令
的控制代码——命令命令数据
抛出:
SecurityException—如果SecurityManager存在并且调用者没有所需的权限
NullPointerException -如果命令为空
CardException -如果卡片操作失败
IllegalStateException -如果这个卡片对象已经通过disconnect()方法被处理