Ошибка Apdu при отправке команды TgInitAsTarget на PN532 (ACR122u)

Я пытаюсь отправить команду TgInitAsTarget на PN532 в режиме эмуляции карты. Когда я пытаюсь отправить это:

FF000000 27 D48C 05 0400 123456 20 000000000000000000000000000000000000 00000000000000000000 00 00

Я получаю ошибку apdu:

  • Исключение в потоке "main" java.lang.IllegalArgumentException: apdu должен иметь длину не менее 2 байтов
  • at javax.smartcardio.ResponseAPDU.check(неизвестный источник)
  • at javax.smartcardio.ResponseAPDU. (Неизвестный источник)
  • at 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()));

Любая помощь, ответ или совет приветствуется!

Спасибо заранее!

1 ответ

Решение

Наконец, у меня есть решение. Я отвечу на свой вопрос, если есть другие люди с такой же проблемой.

Я подключил терминал с direct вместо *, Смотрите этот ответ. Во-вторых, на верхней части ридера должна быть размещена карта. Когда я помещаю свою Galaxy 5 в считыватель, он работал со следующим кодом:

byte[] commandAPDU4     = {(byte)0xFF, 0x00, 0x00, 0x00 , 0x27 , (byte)0xD4, (byte)0x8C , 0x05 , 0x04, 0x00 , 0x12, 0x34, 0x56 , 0x20 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00}; 
byte[] responseAPDU4    = card.transmitControlCommand(IOCTL_SMARTCARD_ACR122_ESCAPE_COMMAND, commandAPDU4 );                
System.out.println(bytesToHex(responseAPDU4) + "...");  

//Response: D58D08E0809000...
Другие вопросы по тегам