我正在使用javax.smartcardio
包开发智能卡相关的应用程序。我想发送伪ADPU命令来设置读卡器的LED / LCD状态。
我发现发送APDU命令到读卡器/卡片的唯一方法是CardChannel :: transmit
,但它必须在插入卡片后运行。
当读卡器中没有卡时,是否可以发送伪APDU命令?APDU命令呢?(使用Java)
我正在使用javax.smartcardio
包开发智能卡相关的应用程序。我想发送伪ADPU命令来设置读卡器的LED / LCD状态。
我发现发送APDU命令到读卡器/卡片的唯一方法是CardChannel :: transmit
,但它必须在插入卡片后运行。
当读卡器中没有卡时,是否可以发送伪APDU命令?APDU命令呢?(使用Java)
我从http://www.springcard.com的PC/SC SDK
示例中找到了解决方案。以下是我的代码:
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) throws CardException
向终端设备发送控制命令。这可用于控制终端功能,如内置PIN键盘或生物识别。
参数:
controlCode-命令的控制码
command-命令数据
抛出:
SecurityException-如果存在SecurityManager并且调用者没有所需的权限
NullPointerException-如果命令为空
CardException-如果卡操作失败
IllegalStateException-如果此卡对象已通过disconnect()方法处理