Я хотел бы понять манипуляции с NfcV ISO-15639 - PullRequest
1 голос
/ 30 октября 2019

Я новичок в технологии 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?

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

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

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

1 Ответ

1 голос
/ 01 ноября 2019

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

Что означает байт Flag? - Неизвестно, НО http://www.ti.com/lit/an/sloa141/sloa141.pdf В разделе 4.1 приведены подробные сведения о значениях флагов ИСО 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)

...