Команда записи нескольких блоков завершилась неудачно через NfcV

Я пытаюсь записать некоторые данные в тег NXP ICODE SLIX SL2S2002 (ISO 15693) с помощью команды WRITE MULTIPLE BLOCKS через объект NfcV:

private void writeTagData(Tag tag) throws Exception {
    int offset = 0;
    int blocks = 19;

    String _writedata = "1hello34567850000071234561815064150220161603201016022018112233445552031033";
    byte[] data = _writedata.getBytes(StandardCharsets.UTF_8);
    data = Arrays.copyOfRange(data, 0, 4 * blocks );

    byte[] id = tag.getId();
    boolean techFound = false;
    for (String tech : tag.getTechList()) {
        if (tech.equals(NfcV.class.getName())) {
            techFound = true;
            NfcV nfcvTag = NfcV.get(tag);
            try {
                nfcvTag.connect();
            } catch (IOException e) {
                Toast.makeText(this, "IO Exception", Toast.LENGTH_LONG).show();
                return;
            }
            try {
                byte[] cmd = new byte[] {
                        (byte)0x20,
                        (byte)0x24,
                        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                        (byte)(offset & 0x0ff),
                        (byte)((blocks - 1) & 0x0ff)
                };
                System.arraycopy(id, 0, cmd, 2, 8);

                byte[] cmd_plus_data = new byte[88];
                System.arraycopy(cmd, 0, cmd_plus_data, 0, cmd.length);
                System.arraycopy(data, 0, cmd_plus_data, 12, data.length);

                byte[] response = nfcvTag.transceive(cmd_plus_data);
                String strResponse = Common.toHexString(response);
            } catch (IOException e) {
                Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
                return;
            }

            try {
                nfcvTag.close();
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                return;
            }
        }
    }
}

Ответ от метода transceive(...) - 010f (что указывает на «Неизвестную ошибку»). Раньше я мог успешно читать данные с помощью команды READ MULTIPLE BLOCKS из того же тега.

Я попытался вызвать getMaxTransceiveLength() для объекта NfcV, и значение равно 253.


person ibrahim    schedule 25.11.2016    source источник
comment
Для какого конкретного продукта с тегами вы пытаетесь написать? Учитывая, что вы указали значение UID тега e004015057da807b в предыдущем посте, я бы предположил, что это NXP ICODE SLIX SL2S2xx2, верно?   -  person Michael Roland    schedule 25.11.2016
comment
NXP ICODE SLIX SL2S2002   -  person ibrahim    schedule 25.11.2016


Ответы (1)


ISO / IEC 15693 определяет команды WRITE MULTIPLE BLOCKS как необязательные. Реализовать эту команду должен чип тега (или фактически его производитель).

В вашем случае NXP ICODE SLIX SL2S2xx2 (как и все (большинство?) Тегов ICODE SLI / SLIX) не поддерживает команду WRITE MULTIPLE BLOCKS. Следовательно, тег возвращает код ошибки 0x0F. В таблице данных ICODE SLIX SL2S2xx2 указано, что этот код ошибки возвращается в случае, если команда не поддерживается.

Вместо этого SL2S2xx2 поддерживает команду WRITE SINGLE BLOCK (0x21). Вы можете использовать эту команду в цикле для записи всех ваших данных:

byte[] cmd = new byte[] {
        /* FLAGS   */ (byte)0x20,
        /* COMMAND */ (byte)0x21,
        /* UID     */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
        /* OFFSET  */ (byte)0x00,
        /* DATA    */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
};
System.arraycopy(id, 0, cmd, 2, 8);

for (int i = 0; i < blocks; ++i) {
    cmd[10] = (byte)((offset + i) & 0x0ff);
    System.arraycopy(data, 4 * i, cmd, 11, 4);

    byte[] response = nfcvTag.transceive(cmd);
}
person Michael Roland    schedule 25.11.2016
comment
Это действительно здорово. Могу ли я узнать, где взять ссылку на команды NfcV? - person Shihab; 16.05.2019
comment
@Shihab Базовый набор команд (например, ЧТЕНИЕ / ЗАПИСЬ ОДИН БЛОК) определен в ISO / IEC 15693, поэтому вы можете найти их там. - person Michael Roland; 18.05.2019
comment
@Michael Roland иногда пишет несколько одиночных блоков, теряет соединение и бросает, java.lang.IllegalStateException: сначала вызовите connect ()! . И это довольно случайно, я имею в виду не фиксированный блок. Каждая запись / чтение в моем случае записывает более 12 блоков данных. Целесообразно ли вызывать тег подключения - ›писать единичный блок -› закрывать тег в цикле для такого количества блоков. - person Praween k; 16.05.2020