Java の javax.smartcardio を使用して Mifare クラシックの特定のブロックを読みたいと思います。これが私のコードです:
public byte[] getCardUID() throws CardException {
CardTerminals terminals = TerminalFactory.getDefault().terminals();
terminal = terminals.list().get(0);
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
CommandAPDU command = new CommandAPDU( new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0xD4, (byte) 0x4A, (byte) 0x01, (byte) 0x00 });
ResponseAPDU response = channel.transmit(command);
card.disconnect(true);
if (response.getSW1() == 0x90) {
byte[] data = response.getData();
data = Arrays.copyOfRange(data, 0x08, data.length);
return data;
}
return new byte[] {};
}
この方法 (インターネットで見つけたサンプル) は、カードの UID を正常に読み取ることができますが、独自のコマンドを作成しようとすると、常にエラー SW1=63 になります。
このサイト (http://www.acs.com.hk/drivers/eng/API_ACR122U_v2.00.pdf) で、APDU に関する情報を見つけましたが、何も機能せず、その理由がわかりません。次のコマンドを試してみましたが成功しませんでした (常にエラー 63): FF B0 00 04 10 (B0 - バイナリ ブロックの読み取り、04 - セクター数、10 - 16 バイトの読み取り)。また、値ブロック (INS B1) を読み取って 1 バイトだけを読み取ろうとしましたが、成功しませんでした。
FF 00 00 00 ...(私の例から)は直接送信する必要がありますが、ブロックを読み取るための次の指示がわかりません。
誰でも私を助けることができますか?どうもありがとう。(私の英語でごめんなさい)