/** * 本来は複数ブロックやサービスに同時に書き込めますが、この実装は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 } }
/** * 認証不要なサービスコードのデータを読み取ります。 本来は、複数のブロックを同時に読めます。 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 } }