我正在使用javax.smartcardio
包开发智能卡相关应用程序。我想发送Pseudo ADPU命令来设置读卡器的LED / LCD状态。
我发现向阅读器/卡发送APDU命令的唯一方法是CardChannel::transmit
,但必须在存在的卡上运行。
当读卡器中没有卡时,是否可以发送伪APDU命令? APDU命令怎么样? (使用Java)
答案 0 :(得分:3)
在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
协议获取&#39;卡&#39; Card::transmitControlCommand
方法获取来自CONTROL_CODE函数的代码(从示例代码中复制,不确定理论是什么&gt; _&lt;)答案 1 :(得分:1)
我认为以下方法也需要读卡器中的卡片,但仅仅是为了您的信息我在这里发布它说我们还有另一种终端控制命令的方法:
引自here:
<强> transmitControlCommand:强>
public abstract byte [] transmitControlCommand(int controlCode,byte [] command)抛出CardException
将控制命令发送到终端设备。这个 例如,可以用来控制像a这样的终端功能 内置密码键盘或生物识别技术。
<强>参数:强>
controlCode - 命令的控制代码
命令 - 命令数据
<强>抛出:强>
SecurityException - 如果存在SecurityManager且调用者没有所需的权限
NullPointerException - 如果命令为null
CardException - 如果卡操作失败
IllegalStateException - 如果此card对象已通过disconnect()方法处理