예제 #1
0
  /**
   * 本来は複数ブロックやサービスに同時に書き込めますが、この実装は1ブロックだけです。 JIS_X_6319_4 を見ると複数ブロックに書き込む方法がわかります。
   *
   * @param serviceCode 書込むサービスコード
   * @param addr 何ブロック目に書き込むか。 0~N
   * @param buff 書きこむブロックデータ. 16バイトである必要があります。
   * @return 0: 正常終了, -1: 異常終了
   * @throws NfcException
   */
  public int writeWithoutEncryption(ServiceCode serviceCode, int addr, byte[] buff)
      throws NfcException {
    if (buff == null || buff.length != 16) {
      return -1;
    }

    byte[] bytes = serviceCode.getBytes();
    ByteBuffer b = ByteBuffer.allocate(6 + buff.length);
    b.put(
        new byte[] {
          (byte) 0x01 // Number of Service
          ,
          (byte) bytes[0] // サービスコード (little endian)
          ,
          (byte) bytes[1],
          (byte) 1 // 同時書き込みブロック数
          ,
          (byte) 0x80,
          (byte) addr // ブロックリスト
        });
    b.put(buff); // 書き出すデータ

    CommandPacket writeWoEncrypt = new CommandPacket(COMMAND_WRITE_WO_ENCRYPTION, idm, b.array());
    CommandResponse r = execute(writeWoEncrypt);
    byte[] retBytes = r.getBytes();
    if (retBytes != null && retBytes.length > 10 && retBytes[10] == (byte) 0) {
      return 0; // normal
    } else {
      return -1; // error
    }
  }
예제 #2
0
  /**
   * 認証不要なサービスコードのデータを読み取ります。 本来は、複数のブロックを同時に読めます。 JIS_X_6319_4 を見ると複数ブロックにアクセスする方法がわかります。
   *
   * @param serviceCode データを読み取るサービスコード
   * @param addr 何ブロック目を読むか。 0~N
   * @return 読み取ったブロックのByte列を返します。読み取りステータスが正常でなければnullを返します。
   * @throws NfcException
   */
  public byte[] readWithoutEncryption(ServiceCode serviceCode, int addr) throws NfcException {
    byte[] bytes = serviceCode.getBytes();
    CommandPacket readWoEncrypt =
        new CommandPacket(
            COMMAND_READ_WO_ENCRYPTION,
            idm,
            new byte[] {
              (byte) 0x01 // サービス数
              ,
              (byte) bytes[0],
              (byte) bytes[1],
              (byte) 0x01 // 同時読み込みブロック数
              ,
              (byte) 0x80,
              (byte) addr
            }); // ブロックリスト

    CommandResponse r = execute(readWoEncrypt);
    ReadResponse rr = new ReadResponse(r);
    if (rr.getStatusFlag1() == 0) {
      return rr.getBlockData();
    } else {
      return null; // error
    }
  }