未来任何人的背景:
NTAG21x 具有 NFC 计数器功能。此功能使 NTAG21x 自动增加 24 位计数器值,由第一个有效值触发
NTAG21x 标签由射频场供电后。一旦 NFC 计数器达到 FF FF FF hex 的最大值,NFC 计数器值将不再变化。NFC 计数器通过 NFC_CNT_EN 位启用或禁用(参见第 8.5.7 节)http://www.nxp.com/documents/data_sheet/NTAG213_215_216.pdf。
我的理解是,您在写入标签方面走在正确的轨道上,您想使用该 transceive
方法来更新该位,但您不确定要写入哪些数据才能实现此目的。请注意,这MifraUltralight.transceieve(byte[])
相当于通过NfcA
和调用连接到此标签transceive(byte[])
。
需要注意的重要一点是“应用程序只能发送完整字节的命令”(来自Android 文档),因此我们必须更新整个字节。但是,我们要写入标签,它只支持 4 字节(1 页)的有效负载,因此我们将重写整个页面。
这是我的经验开始崩溃的地方,但我建议采用以下方法:
- 读取第 42 页,将字节复制到缓冲区
- 将这些复制的字节写入第 42 页,但首先更新计数器位
执行步骤 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);
完全未经测试,但我希望这会有所帮助。