我是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个"索引",是否可以增加或减少大小?减少到6还是增加到10
什么是OFFSET,它的功能是什么
在注释为DATA的代码的第6行中,这是我定义块的字节大小的地方吗?在代码中,它有4个索引,这是否意味着我存储在块中的数据将有4个字节?我可以增加还是减少
让我们假设,我有一个4字节的数据myData = "ABCD"
,我想把这个数据写到我的标签的块04,我该如何根据上面提到的代码来做?
我不是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
部分
芯片制造商为Android提供的NfcV代码的一些示例可以在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.Oobject,%20int.%20int(