Netbeans 从智能卡发送/接收数据
我最近买了一个智能卡阅读器(Gemplus USB智能卡阅读器),它附带了一些卡。我已经阅读了一些关于如何使用它们的教程,但我有几个问题。我试图用智能卡通信(发送APDU),但没有成功。我在虚拟智能卡中安装了一个applet(使用Netbeans) 我的处理方法如下:Netbeans 从智能卡发送/接收数据,netbeans,smartcard,javacard,Netbeans,Smartcard,Javacard,我最近买了一个智能卡阅读器(Gemplus USB智能卡阅读器),它附带了一些卡。我已经阅读了一些关于如何使用它们的教程,但我有几个问题。我试图用智能卡通信(发送APDU),但没有成功。我在虚拟智能卡中安装了一个applet(使用Netbeans) 我的处理方法如下: byte[] buffer = apdu.getBuffer(); byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF); byte INS =
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个单位添加或减去声明的变量(余额)。我想在进行操作后将余额存入卡中。有人知道我如何将该值写入卡中吗?如果可能的话,我以前怎么读呢
谢谢你的帮助。
谢谢。答案很简单:只需将字段添加到JavaCard小程序类中。一旦“启动”,Javacard小程序就会“运行”,直到卸载为止
当然,“运行”是一个错误的术语-它们保持其内部状态,如果接收到下一个APDU,则之前的状态仍然存在,即使在接收到第一个APDU后卡已从智能卡读取器中移除。答案很简单:只需将字段添加到JavaCard小程序类中。一旦“启动”,Javacard小程序就会“运行”,直到卸载为止
当然,“运行”是一个错误的术语-它们保持其内部状态,如果接收到下一个APDU,则之前的状态仍然存在,即使在接收到第一个APDU后将卡从智能卡读卡器中移除。持久内存中的任何状态(持久内存指EEPROM或闪存)字段将一直保留,直到小程序实例被删除。非瞬态数组元素中的状态也是如此。当然,要做到这一点,您需要保留对数组的持久引用。一旦进行了上下文切换,例如,当选择了另一个小程序(并且当前的小程序被取消选择)或发生软重置或硬重置时,瞬态(瞬态意味着RAM)
CLEAR\u ON\u DESELECT
数组的内容将被清除。当然,CLEAR\u ON\u RESET
阵列只会在重置时擦除(包括断电)
基本上所有对象实例都存在于持久内存中,这意味着使用new
创建的任何对象实例。对于由平台创建的任何对象,如果API没有明确指定结果是瞬态的,则情况也是如此。每次调用过程
方法时,APDU缓冲区本身将始终被清除
如果您想存储余额之类的东西,您需要了解Java卡事务机制,特别是如果您的操作不是原子的
请注意,当包含模拟器的进程结束时,许多Java卡模拟器不会保持任何状态。这并不能很好地表示真正的Java卡实现的行为。在删除小程序实例之前,持久(持久内存意味着EEPROM或闪存)字段中的任何状态都将保持不变。非瞬态数组元素中的状态也是如此。当然,要做到这一点,您需要保留对数组的持久引用。一旦进行了上下文切换,例如,当选择了另一个小程序(并且当前的小程序被取消选择)或发生软重置或硬重置时,瞬态(瞬态意味着RAM)
CLEAR\u ON\u DESELECT
数组的内容将被清除。当然,CLEAR\u ON\u RESET
阵列只会在重置时擦除(包括断电)
基本上所有对象实例都存在于持久内存中,这意味着使用new
创建的任何对象实例。对于由平台创建的任何对象,如果API没有明确指定结果是瞬态的,则情况也是如此。每次调用过程
方法时,APDU缓冲区本身将始终被清除
如果您想存储余额之类的东西,您需要了解Java卡事务机制,特别是如果您的操作不是原子的
请注意,当包含模拟器的进程结束时,许多Java卡模拟器不会保持任何状态。这并不能很好地表示真正的Java卡实现的行为。实际上您正在保存这些值:) 声明为瞬态或局部变量的值不存储在EEPROM中,否则,所有值都存储在EEPROM中,且不易失性。您可以在拔出后插入卡时访问它们
但是从您发布的代码中,我无法说出您使用的变量类型。如果您想要一个精确的答案,只需发布完整的代码,我们将准确地回答您。实际上您正在保存这些值:) 声明为瞬态或局部变量的值不存储在EEPROM中,否则,所有值都存储在EEPROM中,且不易失性。您可以在拔出后插入卡时访问它们
但是从您发布的代码中,我无法说出您使用的变量类型。如果您需要准确的答案,只需发布完整的代码,我们将准确回答您。但是当我取出卡时,字段值丢失。在断开读卡器的连接后,我需要该卡保留字段值。是否有永久保存此值的方法?我想我误解了卡的功能。您的意思是,如果我将小程序安装到Smart/Java卡中,即使从读卡器中删除它,它也会保留信息,直到卸载小程序?是的,默认情况下,所有字段值和对象实例都存储在卡的闪存中。感谢您的帮助和您的时间。但是,当我删除卡时,字段值丢失。在断开读卡器的连接后,我需要该卡保留字段值。是否有永久保存此值的方法?我想我误解了卡的功能。您的意思是,如果我将小程序安装到Smart/Java卡中,即使在将其从卡中移除后,也会重新安装它