我最近买了一些随附一些卡的智能卡读卡器(Gemplus USB智能卡读卡器)。我一直在阅读有关如何使用它们的几个教程,但我有几个问题。我正在尝试与智能卡通信(发送APDU),但没有成功。我将一个小程序安装到虚拟智能卡中(使用Netbeans)。
我的处理方法是这样的:
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
if (CLA != HW_CLA){
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch (INS) {
case HW_INS_ADD:
add(apdu);
break;
case HW_INS_SUBTRACT:
subtract(apdu);
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
add
和subtract
方法将5个单位添加或减去声明的变量(余额)。我想在进行操作后将余额值保存到卡中。有谁知道我怎么能把这个价值写进卡片?如果可能的话,我怎么能在以前阅读呢?
感谢任何帮助。 谢谢。
答案 0 :(得分:2)
答案很简单:只需在JavaCard applet类中添加字段即可。一旦“启动”Javacard applet“运行”,直到它们被卸载。
当然“运行”是错误的术语 - 它们保持其内部状态,如果接收到下一个APDU,则APDU之前的状态仍然存在,即使在接收到第一个卡后从智能卡读卡器中取出卡APDU。
答案 1 :(得分:2)
持久性(持久存储器意味着EEPROM或闪存)字段中的任何状态都将保留,直到删除Applet 实例。非瞬态数组元素中的状态也是如此。当然,您需要保留对数组的持久引用,以便实现此目的。一旦进行上下文切换,瞬态(瞬态意味着RAM)CLEAR_ON_DESELECT
阵列的内容将被清除,例如,当选择另一个Applet(并取消当前的一个Applet)或发生软或硬复位时。当然CLEAR_ON_RESET
阵列只会在复位时擦除(包括断电)。
基本上所有对象实例都存在于持久性内存中,这意味着使用new
创建的任何对象实例。对于平台创建的任何对象,情况也是如此,其中API未明确指定结果是瞬态的。每次调用process
方法时,都会清除APDU缓冲区本身 。
如果你想存储余额之类的东西,你需要了解Java Card事务机制,特别是如果你的操作不是原子的。
请注意,当包含模拟器的进程结束时,许多Java Card 模拟器 不会保留任何状态。这不是真正的Java Card实现行为的良好表现。
答案 2 :(得分:0)
其实你正在保存这些值:) 声明为瞬态或局部变量的值不存储在EEPROM中,否则所有值都存储在EEPROM中并且是非易失性的。删除后插入卡时,可以访问它们。
但是从你发布的代码中我不能说你正在使用什么类型的变量。如果您想要一个精确的答案,只需发布完整的代码,我们将准确回答您。