Android nfcA.connect(),nfcA.transceive(),nfcA.setTimeout()和nfcA.getMaxTransceiveLength()

ban*_*ing 6 tags android response nfc mifare

我有一些新手NfcA的问题.在文档和网络上的其他地方似乎没有这方面的指导,所以我希望没有人会在这里把几个基本问​​题串在一起......

我正在使用nfcA.transceive()数据写入我的NTAG213标签,如下所示:

    byte[] result = nfcA.transceive(new byte[] {
            (byte)0xA2,  // WRITE
            (byte)(pageNum & 0x0ff),
            myData[0], myData[1], myData[2], myData[3]
    });
Run Code Online (Sandbox Code Playgroud)

1.result阵列的值10.单字节这是什么意思,我应该去寻找其他什么价值?

我也使用相同的方法从我的NTAG213标签读取数据:

    byte[] result = nfcA.transceive(new byte[] {
            (byte)0x30,  // READ
            (byte)(pageNum & 0x0ff)
    });
Run Code Online (Sandbox Code Playgroud)

2.我希望这能返回4个字节的用户数据(即对应于我的pageNum的4个字节),但它返回了16个字节.为什么会这样?

3.nfcA.isConnected()在打电话之前检查是否是一种好的做法nfcA.connect(),如果是这样的话,这样做是否有可能造成重大的性能损失?(我问,因为我看过两个声誉良好的代码示例.)

4.nfcA.setTimeout()之前或之后打电话会更好nfcA.connect()吗?

5.对于我的NTAG213标签nfcA.getMaxTransceiveLength()返回253.这是否真的意味着我可以一次写入最多251个字节的用户数据(加上另外2个字节),如果是这样,那是可取的,或者编写每个页面更好( 4个字节)单独nfcA.transceive()调用?

Mic*_*and 8

1. WRITE命令的结果数组是一个值为10的单字节.这是什么意思,我应该注意哪些其他值?

值10(十六进制中的Ah或二进制表示中的1010b)是显式ACK,当不返回数据的命令成功时返回确认.

可能的值是实际数据,ACK,被动ACK或NACK.这些由NFC论坛数字协议规范和NFC论坛类型2标签操作规范定义.

  1. 如果预期命令在成功时返回实际数据,则返回数据而不是显式ACK值.
  2. ACK被定义为4比特短帧(参见NFC论坛数字协议规范和ISO/IEC 14443-3以获得更多细节),其值为1010b(Ah).
  3. 被动ACK被定义为在特定超时内根本不发送响应的标签.
  4. NACK定义为4位短帧,其值为0x0xb(其中x为0或1).

NTAG213/215/216产品数据表对可能的NACK值更加具体:

  1. 0000b(0h)表示无效的命令参数.
  2. 0001b(1h)表示奇偶校验或CRC错误.
  3. 0100b(4h)表示认证计数器溢出无效.
  4. 0101b(5h)表示EEPROM写入错误.

除了上述之外,某些设备上的NFC堆栈实现不会将NACK响应正确地传播到app.相反,他们要么抛出,TagLostException要么返回null.同样,您可能(?)得到一个TagLostException指示被动ACK.

因此,您通常会检查以下的收发方法的结果(除非您发送预期会导致被动ACK的命令):

try {
   response = nfca.transceive(command);
   if (response == null) {
       // either communication to the tag was lost or a NACK was received
   } else if ((response.length == 1) && ((response[0] & 0x00A) != 0x00A)) {
       // NACK response according to Digital Protocol/T2TOP
   } else {
       // success: response contains ACK or actual data
   }
} catch (TagLostException e) {
   // either communication to the tag was lost or a NACK was received
}
Run Code Online (Sandbox Code Playgroud)

2.我希望READ方法返回4个字节的用户数据(即与pageNum对应的4个字节),但它返回16个字节.为什么会这样?

READ命令被定义为返回以指定的块编号开始的4个数据块(在NFC论坛类型2标签操作规范中).因此,如果您发送块4的READ命令,则会获得块4,5,6和7的数据.

3. nfcA.isConnected()在打电话之前检查是否是一种好的做法nfcA.connect(),如果是这样的话,这样做是否有可能造成重大的性能损失?

如果Tag直接从NFC系统服务接收句柄(通过NFC意图),则不会连接标签.因此,除非您Tag在致电前使用手柄,否则nfca.connect()我不明白为什么您之前要打电话nfca.isConnected().但是,在连接之前调用该方法几乎没有任何性能开销,因为调用isConnected()封闭标记技术对象将由famework API处理而不调用NFC系统服务.因此,它比对象if的布尔成员变量的简单开销要少得多NfcA.

4. nfcA.setTimeout()之前或之后打电话会更好nfcA.connect()吗?

我不确定那一个.但是,通常在断开标签技术时重置收发超时.

5.对于我的NTAG213标签nfcA.getMaxTransceiveLength()返回253.这是否真的意味着我可以一次写入最多251个字节的用户数据(加上另外2个字节),如果是这样,那是可取的,或者编写每个页面更好( 4个字节)单独nfcA.transceive()调用?

不,你一次只能写一个块.这受到NTAG213的WRITE命令的限制,该命令仅支持一个块作为数据输入.

但是,收发缓冲区大小为253允许您使用FAST_READ命令一次读取多个块(最多62个,NTAG213最多45个):

int firstBlockNum = 0;
int lastBlockNum = 42;
byte[] result = nfcA.transceive(new byte[] {
        (byte)0x3A,  // FAST_READ
        (byte)(firstBlockNum & 0x0ff),
        (byte)(lastBlockNum & 0x0ff),
});
Run Code Online (Sandbox Code Playgroud)