2012-03-02 10 views
1

私はSIMカードアプレットを書いています。私はSIMカードにデータを保存する必要があります。SIMカードアプリケーションからSIMカードにデータを保存するにはどうすればいいですか?

しかし、私はそれをしませんでした。 私は例を見つけてそれを使用しますが、シミュレータを再起動すると常にデータが消えます。 私は "cmdPUTDATA(apdu);"を使用します。データを保存するためのメソッドと私は "cmdGETDATA(apdu);"データを保存する方法。

ここは私のコードとレスポンスです。

 public void process(APDU apdu) { 

     byte[] buffer = apdu.getBuffer(); 

     if (apdu.isISOInterindustryCLA()) { 
      if (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4)) { 
       return; 
      } 
      ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); 
     } 

     switch (buffer[ISO7816.OFFSET_INS]) { 
      case INS_GET_BALANCE: 
       getBalance(apdu); 
       return; 
      case INS_CREDIT: 
       credit(apdu); 
       return; 
      case INS_CHARGE: 
       charge(apdu); 
       return; 
//   case INS_SELECT:      // it is a SELECT FILE instruction 
//    cmdSELECT(apdu); 
//    break; 
//   case INS_VERIFY:      // it is a VERIFY instruction 
//    cmdVERIFY(apdu); 
//    break; 
//   case INS_PUTDATA:      // it is a PUT DATA instruction 
//    cmdPUTDATA(apdu); 
//    break; 
//   case INS_GETDATA:      // it is a GET DATA instruction 
//    cmdGETDATA(apdu); 
//    break; 
      default: 
       ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 
     } 
    } 

// @TransactionType(REQUIRED) 
    //synchronized 
    private void credit(APDU apdu) { 

     byte[] buffer = apdu.getBuffer(); 
     byte numBytes = buffer[ISO7816.OFFSET_LC]; 
     byte byteRead = (byte) (apdu.setIncomingAndReceive()); 

     if ((numBytes != 2) || (byteRead != 2)) { 
      ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 
     } 

     short creditAmount = (short) ((short) (buffer[ISO7816.OFFSET_CDATA] << (short) 8) | (buffer[ISO7816.OFFSET_CDATA + 1])); 

     if ((creditAmount > MAX_BALANCE) || (creditAmount < (short) 0)) { 
      ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT); 
     } 

     if ((short) (balance + creditAmount) > MAX_BALANCE) { 
      ISOException.throwIt(SW_MAX_BALANCE_EXCEEDED); 
     } 
     JCSystem.beginTransaction(); 
     balance = (short) (balance + creditAmount); 
     JCSystem.commitTransaction(); 
    } 

    private void getBalance(APDU apdu) { 
     byte[] buffer = apdu.getBuffer(); 
     buffer[0] = (byte) (balance >> (short) 8); 
     buffer[1] = (byte) (balance & (short) 0x00FF); 
     //apdu.setOutgoingLength((byte) 2);   
     //apdu.sendBytes((short) 0, (short) 2); 
     apdu.setOutgoingAndSend((short)0, (short)2); 
    } 

    private void charge(APDU apdu) {   
     byte[] buffer = apdu.getBuffer(); 
     byte numBytes = buffer[ISO7816.OFFSET_LC]; 
     byte byteRead = (byte) (apdu.setIncomingAndReceive()); 

     if ((numBytes != 2) || (byteRead != 2)) { 
      ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 
     } 

     short chargeAmount = (short) ((short) (buffer[ISO7816.OFFSET_CDATA] << (short) 8) | (buffer[ISO7816.OFFSET_CDATA + 1])); 

     if ((chargeAmount > MAX_BALANCE) || (chargeAmount < (short) 0)) { 
      ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT); 
     } 

     if ((short) (balance - chargeAmount) < 0) { 
      ISOException.throwIt(SW_MIN_BALANCE_EXCEEDED); 
     } 
     JCSystem.beginTransaction(); 
     balance = (short) (balance - chargeAmount); 
     JCSystem.commitTransaction(); 
    } 

enter image description here

+0

あなたのデザインは間違っています。基本的なフィールド(例えば、 'pin'、' memory'フィールド)には 'static'キーワードを使用しないでください。そうでなければあなたのように見えます。 –

+0

私はhttp://www.wrankl.deからそれを参照し、私の考えでは真実です。 –

+0

あなたが耳を傾けたくなければ、良い。基本的なクラス設計だから、Javaの経験がある人は皆私がここにいることを確認し、それをフィールドにリファクタリングすれば完璧に動作します。 –

答えて

0

コンストラクタメソッドと私の他のメソッドはここにあります。 「beginTransaction」コードと「commitTransaction」コードの間には、EEPROMがデータを引き継ぎます。しかし、それは古典的なアプレット(Java Card API 3.0)だけを実行し、Extendetアプレットを実行しません。

private Akbil_Classic(byte[] bArray, short bOffset, byte bLength) { 
      memory = new byte[SIZE_MEMORY]; 
    } 

private void charge(APDU apdu) {   
    byte[] buffer = apdu.getBuffer(); 
    byte numBytes = buffer[ISO7816.OFFSET_LC]; 
    byte byteRead = (byte) (apdu.setIncomingAndReceive()); 

    if ((numBytes != 2) || (byteRead != 2)) { 
     ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 
    } 

    short chargeAmount = (short) ((short) (buffer[ISO7816.OFFSET_CDATA] << (short) 8) | (buffer[ISO7816.OFFSET_CDATA + 1])); 

    if ((chargeAmount > MAX_BALANCE) || (chargeAmount < (short) 0)) { 
     ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT); 
    } 

    if ((short) (balance + chargeAmount) > MAX_BALANCE) { 
     ISOException.throwIt(SW_MAX_BALANCE_EXCEEDED); 
    } 
    JCSystem.beginTransaction(); 
    balance = (short) (balance - chargeAmount); 
    JCSystem.commitTransaction(); 
} 
+0

OK、トランザクションを追加しましたが、これはあなたの質問とは何も関係ありません。 –

0

ときシミュレータ再起動?通常、Java Cardシミュレータは、永続メモリと一時メモリの両方をRAMに保持します。シミュレータを停止させる代わりに、「カード破損」を実行するためにリセット(ATR要求)を使用してください。

+0

そして、私はソースコードを読んでいました: –

+0

はい、プログラムを再実行すると、プログラムは常に再インストールされます..とても圧倒的なデータが消えてしまいました。 –

+0

あなたの答えは正しいですか?シミュレータの再起動後、データを表示するのに問題がありました。答えのコードはこれをどのように修正しますか? –

関連する問題