Ошибка получения на ISO15693 / Tag-it HF-I

У меня есть несколько чипов ISO15693 / Tag-it HF-I Plus, и мне нужно что-то на них написать. Эти чипы совершенно свежие, и я прочитал тонну pdf, рассказывающую мне все то же самое. Но ничего не работает, и я все время получаю ошибку Transceive Failed.

Я отправляю эти данные в команду transceive:

Byte:  <data>
0:     0x00 // pdf says the tag understands only flag = 0x00
1:     0x21 // write single block
2-10:  ID // needs to be send for this tag, only supports addressed mode
11:    0x00 // Block ID, try to write to block 0
12-16: DATA // LSB First
17-18: CRC16 // do i need to send this? and if yes, LSB first?

Я пробовал очень разные флаги и режимы записи, но ни один из них не работает:

Flags: 0x01, 0x02, 0x20,0x22,0x42,0x40,0x80,0x82
Modes: 0x21,0xA2 (+ Vendor Mode 0x07)

это моя функция записи:

private void write(Tag tag) throws IOException, FormatException {
if (tag == null) {
    return;
}
NfcV nfc = NfcV.get(tag);
byte[] ID = tag.getId();

nfc.connect();

Log.d(TAG, "Data: " + new String(((EmergencyApplication) getApplication()).getData()));

byte[] data = ((EmergencyApplication) getApplication()).getData();
// NfcV Tag has 64 Blocks with 4 Byte
if ((data.length / 4) > 64) {
    // ERROR HERE!
    Log.d(TAG, "too much data...");
}

for (int i = 0; i < data.length; i++) {
    byte[] arrByte = new byte[17];

    // Flags
    arrByte[0] = 0x00; // Tag only supports flags = 0
    // Command
    arrByte[1] = 0x21;
    // ID
    Log.d(TAG, "Found ID length: " + ID.length + "... ID: " + Arrays.toString(ID));
    System.arraycopy(ID, 0, arrByte, 2, 8);
    // block number
    arrByte[10] = (byte) (i);

    // data
    // TODO send LSB first...
    System.arraycopy(data, i * 4, arrByte, 11, 4);

    // CRC 16 of all command
    byte[] check = new byte[15];
    System.arraycopy(arrByte, 0, check, 0, 15);
    int crc = CRC.crc16(check);
    arrByte[15] = (byte) (crc >> 8);
    arrByte[16] = (byte) (crc & 0xFF);

    Log.d(TAG, "Writing Data: " + Arrays.toString(arrByte));

    byte[] result = nfc.transceive(arrByte);
    Log.d(TAG, "got result: " + Arrays.toString(result));
}

nfc.close();
Toast.makeText(this, "wrote to tag", Toast.LENGTH_LONG).show();

}

Это еще одна ошибка с Nexus S? Я использую Cyanogenmod 10.1.2, так что я думаю, что здесь исправлена ​​ошибка потери тегов... Я, конечно, могу прочитать тег, и если я использую приложение информации о тегах NFC, оно показывает мне все блоки чистыми и доступными для записи. Я прочитал эти PDF-файлы:

http://rfidshop.com.hk/datasheet%20tag/philip%20icode%20SLI.pdf - таблица данных моего тега http://www.waazaa.org/download/fcd-15693-3.pdf - таблица данных ISO15693-3 http://www.ti.com/lit/ug/scbu003a/scbu003a.pdf - Таблица данных Tag-it HF-I Plus

Я проверил чтение с помощью следующего кода: чтение тега NXP ICODE SLI-L с Android - оно работает на всех 64 блоках, но запись по-прежнему не работает... даже с флагом = 0x20...

Изменить: теперь я увидел, что DSFID на карте 0x00, что означает для ISO15693-3, что карта вообще не доступна для записи:

Если его программирование не поддерживается VICC, VICC должен ответить нулевым значением ('00')

Это байт [] при отправке 0x2B:

                                                     DSFID \  / AFI
                                                           |  |
                                                           v  v
infoRmation: [0, 15, 120, 40, -51, -51, 119, -128, 7, -32, 0, 0, 63, 3, -117]

1 ответ

Решение

Найдены некоторые вещи, я хочу поделиться:

  • Не отправляйте сначала данные с LSB, кажется, что команда transceive делает это автоматически при отправке
  • Не используйте адресный режим, похоже, что реализация Android имеет некоторые проблемы с этим
  • Установите бит опции (0x40) в флажках.
  • Быстрый режим (0x02), кажется, поддерживается моими тегами, так что вы можете установить его или нет
  • Не устанавливайте CRC16, потому что он добавлен Android

Но хуже всего то, что теги не отвечают во время, которое компилируется в средство записи тегов. Вы получите Tag is lost. Исключение составляют данные, которые будут записаны в тег! Таким образом, решение состоит в том, чтобы просто проигнорировать это исключение и, возможно, проверить данные после записи и повторить попытку, если это не работает.

Мой текущий код записи выглядит так:

public static void write(Tag tag, byte[] data) throws IOException, FormatException,
InterruptedException {
if (tag == null) {
    return;
}
NfcV nfc = NfcV.get(tag);

nfc.connect();

Log.d(TAG, "Max Transceive Bytes: " + nfc.getMaxTransceiveLength());

// NfcV Tag has 64 Blocks with 4 Byte
if ((data.length / 4) > 64) {
    // ERROR HERE!
    Log.d(TAG, "too much data...");
}

if ((data.length % 4) != 0) {
    byte[] ndata = new byte[(data.length) + (4 - (data.length % 4))];
    Arrays.fill(ndata, (byte) 0x00);
    System.arraycopy(data, 0, ndata, 0, data.length);
    data = ndata;
}

byte[] arrByte = new byte[7];
// Flags
arrByte[0] = 0x42;
// Command
arrByte[1] = 0x21;

for (int i = 0; i < (data.length / 4); i++) {

    // block number
    arrByte[2] = (byte) (i);

    // data, DONT SEND LSB FIRST!
    arrByte[3] = data[(i * 4)];
    arrByte[4] = data[(i * 4) + 1];
    arrByte[5] = data[(i * 4) + 2];
    arrByte[6] = data[(i * 4) + 3];

    Log.d(TAG, "Writing Data to block " + i + " [" + printHexString(arrByte) + "]");
    try {
    nfc.transceive(arrByte);
    } catch (IOException e) {
    if (e.getMessage().equals("Tag was lost.")) {
        // continue, because of Tag bug
    } else {
        throw e;
    }
    }
}

nfc.close();
}

и это работает довольно хорошо. Если есть настоящая ошибка, например, сообщение не понято, вы получите Transceive Failed сообщение.

Другие вопросы по тегам