ISO15693 (NfcV) / Команды Tag-it HF-I вызывают исключение потери тега

Когда я пытаюсь передать команды для тега NFC-V Tag-it HF-I Plus Inlay, я получаю исключение TagLostException для большинства команд.

Из ссылок, которые я прошел, это исключение может быть вызвано неправильными командами.

Как я могу создать правильный байт команды ISO15693 [] для вкладыша Nfc V Tag-it HF-I Plus?

В техническом описании показаны поддерживаемые команды, но как создать правильные команды для чтения тегов NFC-V?

Команды в документе:

Ширина

Тег, который я пытаюсь прочитать:

Ширина

Код:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.i(TAG, " tag "+tag );
if (tag != null) {
    NfcV tech = NfcV.get(tag);
    Log.i(TAG, " tech "+tech  );

    if (tech != null) {
    try {
        tech.connect();
        Log.i(TAG, " on connect" );
        byte[] data = tech.transceive(Nfcv.InventoryRequest());
        Log.i(TAG, "resp data " + data);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            byte b = data[i];
            System.out.println(b);
            sb.append(String.format("%02X ", b));
        }
        System.out.println("response: " + sb.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            tech.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Я прошел через следующее:

РЕДАКТИРОВАТЬ

Команды, которые я пробовал:

public class Nfcv {
    // texas get system info -> tag lost exception
    public static byte[] GET_SYSTEM_INFO = ReadNfcActivity.hexStringToByteArray("010A00030418002B0000");

    //read multiple blocks -> not working
    byte[] read_multiple_blocks= ReadNfcActivity.hexStringToByteArray("010C00030418002301020000");

    byte[] readSingleBlock = ReadNfcActivity.hexStringToByteArray("010B000304180020050000");

    // readUID generic command -> not working
    public static byte[] readUID = ReadNfcActivity.hexStringToByteArray("FFCA000000");

    public static  byte[] InventoryRequest(){
        //working response: 00 00 3A E5 00 04 00 00 07 E0
        // R/0 UID is E0 07 00 00 04 00 E5 3A 00 00 (reverse)
        return new byte[] { (byte) 0x24, (byte) 0x01, (byte) 0x00};
    }

    //-> not working
    private byte[] ReadSingleBlockUnadressed(byte blocknumber) {
        return new byte[] {(byte) 0x00, (byte) 0x20, blocknumber};
    }

    //-> response 03
    public static byte[] get_system_info = {0x00,(byte)0x2B};
}

person Rachita Nanda    schedule 27.04.2015    source источник
comment
Может помочь, если вы добавите соответствующий код (например, что такое Nfcv.InventoryRequest()?)   -  person Michael Roland    schedule 28.04.2015
comment
@MichaelRoland, пожалуйста, посмотрите мою правку   -  person Rachita Nanda    schedule 28.04.2015


Ответы (1)


Стек Android NFC автоматически обрабатывает опрос (поиск тегов с использованием различных технологий тегов/протоколов), предотвращение конфликтов (перечисление нескольких тегов в рамках одной технологии тегов/протокола) и активацию (инициирование связи с одним конкретным тегом) за вас. Поэтому вам никогда не следует самостоятельно отправлять команды, используемые для предотвращения столкновений и активации. Команда Inventory является одной из таких команд (используется для обнаружения тегов в диапазоне).

Что касается команды Inventory, обычно нет необходимости посылать эту команду. Вся информация, которую вы получите от этой команды, уже предоставлена ​​Android NFC API:

  • Вы можете получить UID, используя tag.getId().
  • Вы можете получить DSFID, используя tech.getDsfId().

Кроме того, чтобы ваше приложение надежно работало на разных платформах устройств Android (= разные стеки NFC), вы всегда должны использовать версию команд с адресом (например, набор Address_flag и UID, отправляемые как часть запроса). См. команда Android NfcV get information возвращает только один байт.

Если вы хотите прочитать/записать в тег, вы можете использовать команды READ_SINGLE_BLOCK и WRITE_SINGLE_BLOCK:

byte[] tagUid = tag.getId();  // store tag UID for use in addressed commands
int blockAddress = 0; // block address that you want to read from/write to

READ_SINGLE_BLOCK:

byte[] cmd = new byte[] {
    (byte)0x20,  // FLAGS
    (byte)0x20,  // READ_SINGLE_BLOCK
    0, 0, 0, 0, 0, 0, 0, 0,
    (byte)(blockAddress & 0x0ff)
};
System.arraycopy(tagUid, 0, cmd, 2, 8);

byte[] response = tech.transceive(cmd);

WRITE_SINGLE_BLOCK:

byte[] cmd = new byte[] {
    (byte)0x60,  // FLAGS
    (byte)0x21,  // WRITE_SINGLE_BLOCK
    0, 0, 0, 0, 0, 0, 0, 0,
    (byte)(blockAddress & 0x0ff),
    ... // data block that you want to write (same length as the blocks that you read)
};
System.arraycopy(tagUid, 0, cmd, 2, 8);

byte[] response = tech.transceive(cmd);
person Michael Roland    schedule 08.05.2016
comment
Как точка данных, мой Moto X Play по-прежнему выдает исключение «потеря тега» даже при использовании адресации. Хотя ответ очень информативный. - person Hod; 01.06.2017