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()调用?
值10(十六进制中的Ah或二进制表示中的1010b)是显式ACK,当不返回数据的命令成功时返回确认.
可能的值是实际数据,ACK,被动ACK或NACK.这些由NFC论坛数字协议规范和NFC论坛类型2标签操作规范定义.
NTAG213/215/216产品数据表对可能的NACK值更加具体:
除了上述之外,某些设备上的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)
READ命令被定义为返回以指定的块编号开始的4个数据块(在NFC论坛类型2标签操作规范中).因此,如果您发送块4的READ命令,则会获得块4,5,6和7的数据.
nfcA.isConnected()在打电话之前检查是否是一种好的做法nfcA.connect(),如果是这样的话,这样做是否有可能造成重大的性能损失?如果Tag直接从NFC系统服务接收句柄(通过NFC意图),则不会连接标签.因此,除非您Tag在致电前使用手柄,否则nfca.connect()我不明白为什么您之前要打电话nfca.isConnected().但是,在连接之前调用该方法几乎没有任何性能开销,因为调用isConnected()封闭标记技术对象将由famework API处理而不调用NFC系统服务.因此,它比对象if的布尔成员变量的简单开销要少得多NfcA.
nfcA.setTimeout()之前或之后打电话会更好nfcA.connect()吗?我不确定那一个.但是,通常在断开标签技术时重置收发超时.
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)
| 归档时间: |
|
| 查看次数: |
2876 次 |
| 最近记录: |