Хотелось бы понять манипуляции с NfcV ISO-15639

Я новичок в технологии NFC!

Мне трудно понять, как манипулировать блоками.

  byte[] cmd = new byte[] {
     (byte)0x20, //FLAG
     (byte)0x21, //WRITE SINGLE BLOCK 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
   };

Мои вопросы о приведенном выше коде:

Что такое FLAG и какова его функция?

Что такое UID и какова его функция? в коде строка UID имеет 8 «индексов», можно ли увеличить или уменьшить размер? вместо 8, как в коде, уменьшить до 6 или увеличить до 10?

Что такое СМЕЩЕНИЕ и какова его функция?

В строке 6 кода с комментариями как ДАННЫЕ я определяю размер своего блока в байтах? В коде у него 4 индекса, значит ли это, что мои данные, хранящиеся в блоке, будут иметь 4 байта? можно увеличить или уменьшить?

Предположим, у меня есть 4 байта данных myData = "ABCD", и я хочу записать эти данные в блок 04 моего тега, как мне это сделать в соответствии с кодом, упомянутым выше?


person cazzruan    schedule 30.10.2019    source источник
comment
Некоторые ответы зависят от того, какой чип установлен в карте. Можете ли вы дать информацию о чипе/карте, которую вы используете?   -  person Andrew    schedule 31.10.2019
comment
Technology Supported: Совместимость с ISO/IEC 15693-3 Совместимость с ISO/IEC 15693-2 Supported Commands: Чтение/запись одного блока, чтение/запись нескольких блоков, получение системной информации, AFI, DSFID NfcV and NdefFormatable   -  person cazzruan    schedule 31.10.2019
comment
Хм, немного больше помощи, например, модель чипа. приложение NFC Tools дает NXP MIFARE Ultralight - NTAG216 для карт, которые я использую (модель чипа NTAG216)   -  person Andrew    schedule 31.10.2019


Ответы (1)


Я не эксперт по NfcV, но ниже я узнал о тегах и низкоуровневом доступе.

Что означает Flag байт? - Неизвестно, НО http://www.ti.com/lit/an/sloa141/sloa141.pdf Раздел 4.1 содержит подробную информацию о значениях флагов ISO 15693.

Но один из флагов означает использование адресного или безадресного режима, это приводит к UID.

Что такое UID байта. Большинство тегов имеют серийный номер или уникальный идентификационный номер.

В адресном режиме вы должны указать правильный UID карты, с которой вы читаете или пишете, чтобы он был успешным. Это означает, что вы не будете писать или читать не с той карты. Есть команда сначала прочитать UID с карты.

В безадресном режиме UID предоставляется как нули.

Вы выяснили, что второй байт 0x21 для команды записи.

0x20 для команды чтения

http://www.ti.com/lit/an/sloa141/sloa141.pdf Раздел 4.2 содержит подробную информацию о значениях команд ISO 15693, и, как вы можете видеть, обязательными из них являются Optional или Custom и поддержка, и то, что они делают, зависит от чипа.

OFFSET, как вы выразились, представляет собой смещение блока памяти от первого блока или лучше описывается как адрес памяти (подумайте об этом как о номере страницы в книге). Большинство чипов разбивают память на блоки заданного размера. Некоторые микросхемы используют один байт в качестве адреса памяти, а некоторые используют 2 байта.

Каждый блок представляет собой заданное количество байтов, обычно он составляет 4 байта, но я видел спецификации чипа, где он равен 128 байтам.

Структура данных, которую вы указали в своем вопросе, обычно используется в качестве шаблона правильно сформированной команды для чипа, с которым вы пытаетесь связаться.

DATA 4 байта в вашем примере - это просто заполнители для фактических данных, которые вы хотите записать, вы должны скопировать в шаблон фактические 4 байта, которые вы хотите записать, перед отправкой команды.

Поэтому, когда вы используете его для записи, вы должны настроить OFFSET/Memory Address так, чтобы он был «правильной страницей книги», и скопировать нужное количество «букв», которые можно написать на странице, в DATA часть книги. шаблон

Некоторые примеры кода NfcV для Android от производителя микросхем можно увидеть в конце https://www.st.com/ content/ccc/resource/technical/document/application_note/group0/76/0e/00/a0/1b/04/4c/f2/DM00103491/files/DM00103491.pdf/jcr:content/translations/en.DM00103491.pdf< /а>

Итак, последний вопрос Lets go suppose, i have a 4 bytes data myData = "ABCD", and i want to write this data to block 04 of my tag

пример построения команды


// Command Template
byte[] cmd = new byte[] {
     (byte)0x20, //FLAG
     (byte)0x21, //WRITE SINGLE BLOCK 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
   };

// The data to be written
String myData = "ABCD";
// Get the data as bytes
byte[] data = myData.getBytes();

// Change the "OFFSET" / "Block number" to the the fourth Block
// If that what was meant by "block 04"
// The addresses start at Zero and the byte array starts at zero
// So the "Block Number" is the 11th byte in the command
cmd[10] = (byte)((3) & 0x0ff);

// Copy in 4 bytes of data in to bytes 11 to 15
// Starting at byte 0 in the data array
System.arraycopy(data,  0, cmd, 11, 4);


Для справки, какие arraycopy параметры https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)

person Andrew    schedule 31.10.2019