我正在使用该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的 card-emul 样本中找到了解决SDK for PC/SC
方案。这是我的代码:
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 函数获得的代码的方法(从示例代码中复制,不知道理论是什么>_<)我认为以下方法也需要读卡器中存在卡片,但只是为了您的信息,我在这里发布它是为了说明我们还有另一种终端控制命令的方法:
从这里引用:
传输控制命令:
公共抽象字节 [] 传输控制命令(int controlCode,字节 [] 命令)抛出 CardException
向终端设备发送控制命令。例如,这可用于控制终端功能,如内置 PIN 键盘或生物识别技术。
参数:
controlCode - 命令的控制代码
command - 命令数据
抛出:
SecurityException - 如果存在 SecurityManager 并且调用者没有所需的权限
NullPointerException - 如果命令为空
CardException - 如果卡操作失败
IllegalStateException - 如果此卡对象已通过 disconnect() 方法处理