Подтвердить что ты не робот

Чтение данных из тега NFC (IsoDep)

Я новичок в Android API NFC.

В настоящее время у меня есть тег NFC, я делаю приложение Android для чтения данных из него. Мое простое приложение запускается, когда мой телефон приближается к тегу NFC. Но я не знаю, как читать данные внутри тега NFC. В теге используется технология IsoDep.

Мой текущий код:

@Override
protected void onResume (){
    super.onResume();

    Intent intent = getIntent();
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    IsoDep isoDep = IsoDep.get(tag);

    // How to read data from IsoDep instance?

Я googled в Интернете, я замечаю, что люди отправляют команды на IsoDep, чтобы получить ответ от тега NFC. Я полагаю, что из ответа мы можем проанализировать данные в теге, я видел, как люди это делали:

 //What is the 'command' ? How to define the command?
 //e.g.:
 byte command = (byte) 0x6A
 isoDep.transceive(command)

Но команда просто byte, как новичок, слишком сложно понять, что происходит. Я понятия не имею, как определить команду для чтения данных? Кто-нибудь может мне объяснить? или есть документ, который я могу узнать о команде?

Как правило, мне нужно руководствоваться тем, как определять команды и как анализировать данные из ответа, я хотел бы прочитать данные, хранящиеся в теге, и показать данные в формате String в элементе пользовательского интерфейса (например, TextView).

* И ***

У меня нет проблем с этими конфигурациями (например, AnroidManifest.xml), пожалуйста, не рассказывайте мне, как настроить:)

4b9b3361

Ответ 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();