首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android nfcA.connect()、nfcA.transceive()、nfcA.setTimeout()和nfcA.getMaxTransceiveLength()

Android nfcA.connect()、nfcA.transceive()、nfcA.setTimeout()和nfcA.getMaxTransceiveLength()
EN

Stack Overflow用户
提问于 2016-10-27 15:36:42
回答 1查看 5.2K关注 0票数 10

我有很多新手NfcA的问题。文档和其他网站对此似乎没有什么指导,所以我希望没有人会介意我把一些基本问题放在一起.

我使用nfcA.transceive()将数据写入NTAG213标记,如下所示:

代码语言:javascript
运行
复制
    byte[] result = nfcA.transceive(new byte[] {
            (byte)0xA2,  // WRITE
            (byte)(pageNum & 0x0ff),
            myData[0], myData[1], myData[2], myData[3]
    });

1. result数组是一个值为10的字节。这意味着什么,以及我应该注意哪些其他值?

我还使用相同的方法从我的NTAG213标记中读取数据:

代码语言:javascript
运行
复制
    byte[] result = nfcA.transceive(new byte[] {
            (byte)0x30,  // READ
            (byte)(pageNum & 0x0ff)
    });

2. --我期望它返回4个字节的用户数据(即与我的pageNum对应的4个字节),但它返回了16个字节。为什么是这种情况?

3.在调用nfcA.connect()之前检查nfcA.isConnected()是否很好,如果是的话,这样做可能会导致性能损失吗?(我问的是,我看到了这两种代码的可靠来源的代码示例。)

4.nfcA.connect()之前或之后调用nfcA.setTimeout()更好吗?

5.用于标记的NTAG213 nfcA.getMaxTransceiveLength()返回253。这是否真的意味着我可以一次编写多达251个字节的用户数据(加上其他两个字节),如果是这样的话,这是明智的,还是用单独的nfcA.transceive()调用编写每个页面(4个字节)更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-28 10:35:21

1.写命令的结果数组是值为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)。

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

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

除了上面的内容外,某些设备上的NFC堆栈实现没有正确地将NACK响应传播到应用程序。相反,它们要么抛出一个TagLostException,要么返回null。同样,你可能(?)获取一个指示被动ACK的TagLostException

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

代码语言:javascript
运行
复制
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
}

2.我期望READ方法返回4个字节的用户数据(即与我的pageNum对应的4个字节),但它返回了16个字节。为什么是这种情况?

READ命令定义为返回以指定块号开头的4个数据块(在NFC论坛类型2标记操作规范中)。因此,如果为块4发送读命令,就会得到块4、5、6和7的数据。

3.在调用nfcA.isConnected()之前检查nfcA.connect()好吗?如果是的话,这样做可能会对性能造成任何明显的损失吗?

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

4.在nfcA.setTimeout()之前还是之后调用nfcA.connect()比较好?

我不确定那件事。但是,在断开标记技术时,通常会重置收发超时。

5.对于我的NTAG213标记,nfcA.getMaxTransceiveLength()返回253。这是否真的意味着我可以一次编写多达251个字节的用户数据(加上其他两个字节),如果是这样的话,这是明智的,还是用单独的nfcA.transceive()调用编写每个页面(4个字节)更好?

不,你一次只能写一个街区。这受到NTAG213的写命令的限制,它只支持一个块作为数据输入。

但是,如果缓冲区大小为253,则可以使用FAST_READ命令一次读取多个块(最多62个块,NTAG213最多45个块):

代码语言:javascript
运行
复制
int firstBlockNum = 0;
int lastBlockNum = 42;
byte[] result = nfcA.transceive(new byte[] {
        (byte)0x3A,  // FAST_READ
        (byte)(firstBlockNum & 0x0ff),
        (byte)(lastBlockNum & 0x0ff),
});
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40288795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档