我想了解NfcV ISO-15639

时间:2019-10-30 17:37:41

标签: android tags nfc iso-15693

我是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 个答案:

答案 0 :(得分:1)

我不是NfcV专家,但以下是我对标签和低级别访问的了解

Flag字节是什么意思? -未知的http://www.ti.com/lit/an/sloa141/sloa141.pdf第4.1节详细介绍了ISO 15693标志的含义

但是其中一个标志意味着使用寻址或未寻址模式,这导致了UID

UID字节是什么-大多数标签具有序列号或唯一IDentifier编号

在寻址模式下,您必须提供正在读取或写入的卡的正确UID,以使其成功。这意味着您不会用错误的卡进行写入或读取。有一条命令要先从卡中读取UID。

在未寻址模式下,UID为零

您已经计算出写命令的第二个字节为0x21

0x20用于读取命令

http://www.ti.com/lit/an/sloa141/sloa141.pdf第4.2节提供了ISO 15693命令值的详细信息,并且您必须看到它们必须是OptionalCustom并受支持,它们的作用取决于芯片。

您所说的OFFSET是相对于第一个块的存储块偏移量,或者可以更好地描述为存储地址(例如书中的页码)。大多数芯片将内存分割成一定大小的块。有些芯片使用一个字节作为内存地址,有些芯片使用2个字节。

每个块都是固定的字节数,通常为4字节,但是我看过芯片规格为128字节。

您在问题中给出的数据结构通常用作您要与之通信的芯片的格式正确的命令的模板。

示例中的DATA 4字节只是要写入的实际数据的占位符,在发送命令之前,应将要写入的实际4字节复制到模板中。

因此,当您使用它进行书写时,必须将OFFSET / Memory Address调整为“书的正确页面”,并复制正确数量的“字母”写在页面上模板的DATA部分

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的结尾可以看到一些来自芯片制造商的Android NfcV代码示例

最后一个问题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)