启用/禁用NTAG213的计数器

时间:2017-04-27 18:16:02

标签: java android nfc mifare open-nfc

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

1 个答案:

答案 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. 阅读第42页,将字节复制到缓冲区
  2. 将这些复制的字节写入第42页,但首先更新计数器位
  3. 执行第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); 
    

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