我有很多新手NfcA的问题。文档和其他网站对此似乎没有什么指导,所以我希望没有人会介意我把一些基本问题放在一起.
我使用nfcA.transceive()将数据写入NTAG213标记,如下所示:
byte[] result = nfcA.transceive(new byte[] {
(byte)0xA2, // WRITE
(byte)(pageNum & 0x0ff),
myData[0], myData[1], myData[2], myData[3]
});
1. result
数组是一个值为10的字节。这意味着什么,以及我应该注意哪些其他值?
我还使用相同的方法从我的NTAG213标记中读取数据:
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个字节)更好?
发布于 2016-10-28 10:35:21
1.写命令的结果数组是值为10的单个字节。这意味着什么,以及我应该注意哪些其他值?
值10 (十六进制中的Ah或二进制表示中的1010b )是一个显式的ACK,当不返回数据的命令成功时返回的确认。
可能的值是实际数据、ACK、被动ACK或NACK。它们由NFC论坛数字协议规范和NFC论坛类型2标记操作规范定义。
NACK 213/215/216产品数据表对可能的NACK值更具体:
除了上面的内容外,某些设备上的NFC堆栈实现没有正确地将NACK响应传播到应用程序。相反,它们要么抛出一个TagLostException
,要么返回null
。同样,你可能(?)获取一个指示被动ACK的TagLostException
。
因此,您通常会检查以下的收发信机方法的结果(除非您发送了一个预期会导致被动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
}
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个块):
int firstBlockNum = 0;
int lastBlockNum = 42;
byte[] result = nfcA.transceive(new byte[] {
(byte)0x3A, // FAST_READ
(byte)(firstBlockNum & 0x0ff),
(byte)(lastBlockNum & 0x0ff),
});
https://stackoverflow.com/questions/40288795
复制相似问题