Ошибка записи команды Single Block через NfcV

Я пытаюсь записать данные в NXP I-CODE SLI (ISO 15693 — Модель №: IQC21-50P) с помощью команды WRITE SINGLE BLOCK (0x21) через объект NfcV.

Следующий код успешно считывает тег:

Tag currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] id = currentTag.getId();
for (String tech : currentTag.getTechList()) {
    if (tech.equals(NfcV.class.getName())) {
        NfcV nfcvTag = NfcV.get(currentTag);
        try {
            nfcvTag.connect();
            // nfcvTag.getMaxTransceiveLength() returns 253
            int offset = 0;  // offset of first block to read
            int blocks = 8;  // number of blocks to read
            byte[] cmd = new byte[] {
                    (byte) 0x60,  // flags: addressed (= UID field present)
                    (byte) 0x23, // command: READ MULTIPLE BLOCKS
                    (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,  // placeholder for tag UID
                    (byte) (offset & 0x0ff),  // first block number
                    (byte) ((blocks - 1) & 0x0ff)  // number of blocks (-1 as 0x00 means one block)
            };
            System.arraycopy(id, 0, cmd, 2, 8);
            byte[] response = nfcvTag.transceive(cmd);
        } 
        catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
            return;
        }
    }
}

Когда я пытаюсь записать данные в тег с помощью следующего кода, данные не записываются в тег, и я также не получаю никаких ошибок.

Вот код записи одного блока, который я использую:

Tag currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] id = currentTag.getId();
String dataString = "CGH13F1V0AK1234567:6 012 ";

for (String tech : currentTag.getTechList()) {
    if (tech.equals(NfcV.class.getName())) {
        NfcV nfcvTag = NfcV.get(currentTag);
        try {
            nfcvTag.connect();
            int offset = 0;  // offset of first block to read
            int blocks = 8;  // number of blocks to read
            byte[] data = convertHexToByte(convertStringToHex(dataString));
            byte[] cmd = new byte[] {
                    (byte)0x60, // FLAGS
                    (byte)0x21, // WRITE SINGLE COMMAND
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // UID
                    (byte)0x00, // OFFSET
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00  //DATA
            };
            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);
            }

        } 
        catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
            return;
        }
    }
}


person Kamila    schedule 25.04.2019    source источник
comment
Вы пытались отправить команду записи без установленного флага опции? т.е. ФЛАГИ установлены на 0x40?   -  person Michael Roland    schedule 26.04.2019
comment
Спасибо Михаил за то, что поставил меня на правильный путь. Я изменил флаг опции на 0x22, и все заработало.   -  person Kamila    schedule 26.04.2019
comment
@Kamila Я пытаюсь прочитать тег nfcv, используя ваш код, но получаю сообщение об ошибке «Тег потерян». Можете ли вы помочь мне с этим?   -  person Mini Chip    schedule 09.07.2020


Ответы (1)


Изменение значения флага на (byte)0x22 устранило проблему.

person Kamila    schedule 26.04.2019