MifareUltralight mifareUltralight = MifareUltralight.get(tag);
byte[] toggleCounterCommand = new byte[]{(byte)0xA2, // NTAG213 command to write
(byte)0x2A, // page 42(dec) 2A(hex)
(byte)___};// not sure what to put here.
NTAG213的数据表说第42页的第0个字节有访问信息。
第0个字节的结构如下:
7 6 5 *4* 3 2 1 0
PROT CFGLCK RFUI *NFC_CNT_EN* NFC_CNT_PWD_PROT AUTHLIM
将第4位设置为0或1应启用或禁用计数器。但我不确定如何在标签上写入时设置第4位。
答案 0 :(得分:0)
将来有人会遇到这种情况的背景:
NTAG21x具有NFC计数器功能。此功能使NTAG21x能够运行 自动增加由第一个有效
触发的24位计数器值
- READ命令或
- FAST-READ命令
在NTAG21x标签由RF场供电之后。一旦NFC计数器达到FF FF FF hex的最大值,NFC计数器值将不再改变。使用NFC_CNT_EN位启用或禁用NFC计数器(参见第8.5.7节)http://www.nxp.com/documents/data_sheet/NTAG213_215_216.pdf。
我的理解是你在写入标签时走在正确的轨道上,你想使用transceive
方法来更新那个位,但是你不确定要写什么数据来实现这个 。请注意,MifraUltralight.transceieve(byte[])
相当于通过NfcA
连接到此标记并调用transceive(byte[])
。
需要注意的一件重要事情是“应用程序必须只发送完整字节的命令”(来自Android docs),因此我们必须更新整个字节。但是,我们想要写入标签,它只支持4字节(1页)的有效负载,因此我们将重写整个页面。
这是我的经历开始分解的地方,但我建议采用以下方法:
执行第1步:
NfcA transaction = NfcA.get(tag);
transaction.connect(); // error handle
byte cmdRead = (byte)0x30;
byte page = (byte)(0x42 & 0xff); // AND to make sure it is the correct size
byte[] command = new byte[] {cmdRead, page};
byte[] page42 = nfcAtransaction.transceive(command); // error handle
byte mask = 0b00010000; // 3rd bit, or should it be 4th?
byte newData = page42[0] | mask;
执行第2步:
byte cmdWrite = (byte)0xA2;
byte page = (byte)(42 & 0xff);
byte[] command = new byte[] { cmdWrite, page, newData, page42[1], page42[2], page42[3]};
byte[] result = nfcA.transceive(command);
完全未经测试,但我希望这会有所帮助。