Ответ 1
IsoDep позволяет вам связываться через соединение ISO-14443-4 с операцией transceive
. По этим протоколам применяются данные (APDU). Формат указан, вы найдете описание на Wikipedia.
Для того, чтобы выбрать приложение на смарт-карте с определенным идентификатором приложения (AID), вы должны выполнить следующую команду APDU. Результат просто указывает ok (9000) или ошибку.
byte[] SELECT = {
(byte) 0x00, // CLA Class
(byte) 0xA4, // INS Instruction
(byte) 0x04, // P1 Parameter 1
(byte) 0x00, // P2 Parameter 2
(byte) 0x0A, // Length
0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID
};
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
IsoDep tag = IsoDep.get(tagFromIntent);
tag.connect();
byte[] result = tag.transceive(SELECT);
if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00))
throw new IOException("could not select applet");
После того, как приложение было выбрано, вы можете выполнять команды, специфичные для приложения. Программы обычно записываются в JavaCard, который следует за спецификацией GlobalPlatorm. Следующий пример выполняет в вышеприведенном приложении метод 4 (0x04), который возвращает массив байтов не более 11 байтов. Затем этот результат преобразуется в строку.
byte[] GET_STRING = {
(byte) 0x80, // CLA Class
0x04, // INS Instruction
0x00, // P1 Parameter 1
0x00, // P2 Parameter 2
0x10 // LE maximal number of bytes expected in result
};
result = tag.transceive(GET_STRING);
int len = result.length;
if (!(result[len-2]==(byte)0x90&&result[len-1]==(byte) 0x00))
throw new RuntimeException("could not retrieve msisdn");
byte[] data = new byte[len-2];
System.arraycopy(result, 0, data, 0, len-2);
String str = new String(data).trim();
tag.close();