1
    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 位。

4

1 回答 1

0

未来任何人的背景:

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 页)的有效负载,因此我们将重写整个页面。

这是我的经验开始崩溃的地方,但我建议采用以下方法:

  1. 读取第 42 页,将字节复制到缓冲区
  2. 将这些复制的字节写入第 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); 

完全未经测试,但我希望这会有所帮助。

于 2017-05-01T03:57:08.313 回答