2013-01-22 114 views
2

我最近买了一些带有一些卡的智能卡读卡器(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); 
    } 

addsubtract方法添加或5个。减去单位声明的变量(平衡量)。我想在操作后将余额存入卡片。有谁知道我该如何写入卡片的价值?如果可能的话,我怎么读?

感谢任何帮助。 谢谢。

回答

2

永久(永久存储器意味着EEPROM或闪存)字段中的任何状态都将保留,直到删除小程序实例。非瞬态数组元素中的状态也是如此。当然,你需要保留对数组的持久引用。一旦进行上下文切换,瞬态(瞬态装置RAM)CLEAR_ON_DESELECT数组的内容将被清除,例如,当另一个Applet被选中(并且当前的一个被取消选择)或者发生软复位或硬复位时。当然CLEAR_ON_RESET阵列只会在复位(包括断电)时被擦除。

基本上所有对象实例都存在于持久内存中,这意味着使用new创建的任何对象实例。对于API未明确指定结果为瞬态的平台创建的任何对象也是如此。每次调用process方法时,APDU缓冲区本身将始终清除

如果你想存储一些类似余额的东西,你需要知道Java Card事务机制,特别是如果你的操作不是原子操作。

请注意,许多Java卡模拟器当包含模拟器的进程结束时不保留任何状态。这并不能很好地表示真正的Java Card实现的行为。

+0

谢谢你分享你的知识猫头鹰,现在我发现使用java卡更容易。问候。 – Charles

+1

不客气!不要忘记投票和/或接受你喜欢的答案。 –

+0

我改变了文字,以明确瞬态意味着RAM,非瞬态与持久性相同 –

2

答案很简单:只需在JavaCard applet类中添加字段即可。一旦“启动”Java卡小程序“运行”,直到它们被卸载。

当然,“运行”是错误的术语 - 它们保持其内部状态,并且如果接收到下一个APDU之前APDU中的状态仍然存在,即使该卡在接收到智能卡读卡器第一个APDU。

+0

但是,当我删除卡时,字段值丢失。我需要该卡在断开与读卡器的连接后保留字段值。无论如何永久保存这个值? – Charles

+0

我想我误解了卡的功能。您的意思是,如果我将小程序安装到智能卡/ Java卡中,即使将它从读卡器中取出后,它也会保留这些信息,直到小程序被卸载? – Charles

+0

是的,所有的字段值和对象实例默认都在卡的闪存中。 – Robert

0

实际上,您正在保存这些值:) 声明的值瞬态或本地变量不存储在EEPROM中,否则所有值都存储在EEPROM中,并且将是非易失性的。删除后插入卡时可以访问它们。

但是从你发布的代码我不能说你正在使用什么类型的变量。如果你想要一个精确的答案只需发布完整的代码,那么我们会准确回答你。