TgInitAsTarget コマンドをカード エミュレーション モードで PN532 に送信しようとしています。これを送信しようとすると:
FF000000 27 D48C 05 0400 123456 20 000000000000000000000000000000000000 00000000000000000000 00 00
apdu エラーが発生します。
- スレッド「メイン」の例外 java.lang.IllegalArgumentException: apdu の長さは少なくとも 2 バイトである必要があります
- javax.smartcardio.ResponseAPDU.check (不明なソース) で
- javax.smartcardio.ResponseAPDU で。(不明なソース)
- sun.security.smartcardio.ChannelImpl.transmit (不明なソース) で
以下のコードは私が使用するコードです。このコードは間違っていますか?
//TgInitAsTarget
byte[] bytes4 = { (byte) 0xD4,(byte) 0x8C,(byte) 0x05,(byte) 0x04,(byte) 0x00,
(byte) 0x12,(byte) 0x34,(byte) 0x56,(byte) 0x20,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00 };
CommandAPDU command4 = new CommandAPDU(0xFF,0x00,0x00,0x00, bytes4);
ResponseAPDU response4 = channel.transmit(command4);
System.out.println(bytesToHex(response4.getBytes()));
この投稿に続いて、Readregister、WriteRegister、および SetParams パーツが良い反応を示しているようです。穴コード:
List<CardTerminal> terminals = null;
TerminalFactory factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
CardTerminal terminal = terminals.get(0);
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
//Read register
byte[] bytes1 = {(byte) 0xD4, 0x06, 0x63, 0x05, 0x63, 0x0D, 0x63, 0x38 };
CommandAPDU command1 = new CommandAPDU(0xFF,0x00,0x00,0x00, bytes1);
ResponseAPDU response1 = channel.transmit(command1);
System.out.println(bytesToHex(response1.getBytes()));
//Update registers
int xx = 47;
int yy = 00;
int zz = 01;
xx = xx | 0x004;
yy = yy & 0x0EF;
zz = zz & 0x0F7;
byte xxByte = toByte(hexStringToByteArray("0x"+Integer.toHexString(xx)));
byte yyByte = toByte(hexStringToByteArray("0x0"+Integer.toHexString(yy)));
byte zzByte = toByte(hexStringToByteArray("0x0"+Integer.toHexString(zz)));
//WriteRegister
byte[] bytes2 = { (byte) 0xD4, 0x08, 0x63, 0x02, (byte) 0x80,
0x63, 0x03, (byte) 0x80, (byte) 0x63, (byte) 0x05,
xxByte, 0x63, 0x0D,yyByte, 0x63, 0x38, zzByte};
CommandAPDU command2 = new CommandAPDU(0xFF,0x00,0x00,0x00, bytes2);
ResponseAPDU response2 = channel.transmit(command2);
System.out.println(bytesToHex(response2.getBytes()));
//SetParameters
byte[] bytes3 = {(byte) 0xD4,(byte) 0x12,(byte) 0x30};
CommandAPDU command3 = new CommandAPDU(0xFF,0x00,0x00,0x00, bytes3);
ResponseAPDU response3 = channel.transmit(command3);
System.out.println(bytesToHex(response3.getBytes()));
//TgInitAsTarget
byte[] bytes4 = { (byte) 0xD4,(byte) 0x8C,(byte) 0x05,(byte) 0x04,(byte) 0x00,
(byte) 0x12,(byte) 0x34,(byte) 0x56,(byte) 0x20,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,
(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00,(byte) 0x00 };
CommandAPDU command4 = new CommandAPDU(0xFF,0x00,0x00,0x00, bytes4);
ResponseAPDU response4 = channel.transmit(command4);
System.out.println(bytesToHex(response4.getBytes()));
ヘルプ、応答、またはアドバイスをいただければ幸いです!!
よろしくお願いします!