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 =

我最近买了一个智能卡阅读器(Gemplus USB智能卡阅读器),它附带了一些卡。我已经阅读了一些关于如何使用它们的教程,但我有几个问题。我试图用智能卡通信(发送APDU),但没有成功。我在虚拟智能卡中安装了一个applet(使用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个单位添加或减去声明的变量(余额)。我想在进行操作后将余额存入卡中。有人知道我如何将该值写入卡中吗?如果可能的话,我以前怎么读呢

谢谢你的帮助。
谢谢。

答案很简单:只需将字段添加到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卡中,即使在将其从卡中移除后,也会重新安装它