我是Xamarin以及Android开发的新手。我有一个NFC标签,特别是ST M24LR64E,上面有数据。我可以在Google Play上使用ST应用查看数据块。在我的Xamarin应用程序中,我无法在不获取TagLostException的情况下向标记发送消息。我可以毫无问题地查询标签ID,但是尝试读取单个数据块,我得到了异常。任何方向都会感激不尽。
byte[] response = new byte[] { 0x0A };
byte[] cmd = new byte[]
{
(byte) 0x26,
(byte) 0x01,
0x00
};
response = nfcv.Transceive(cmd);
byte[] single = new byte[]
{
(byte) 0x40, // FLAGS
(byte) 0x20, // READ_SINGLE_BLOCK
0, 0, 0, 0, 0, 0, 0, 0,
(byte) (0 & 0x0ff)
};
Array.Copy(id, 0, single, 2, 8);
response = nfcv.Transceive(single);
第一个Transceive()
没问题,我看到10个字节回来了。一旦我尝试读取数据块,我就会得到TagLostException。
答案 0 :(得分:1)
使用NfcV标记技术,TagLostException
可能表示读者无法再与标记通信或命令导致错误。
根据其manual,M24LR64E仅支持READ_SINGLE_BLOCK命令的扩展版本(协议扩展标志集):
应将Protocol_extension_flag设置为1,以使M24LR64E-R正常运行。如果Protocol_extension_flag为0,则M24LR64E-R以错误代码回答。
因此,您的READ_SINGLE_BLOCK命令版本与标记不兼容。您需要设置协议扩展标志并提供16位块编号。应该有效的版本是:
int blockNumber = 0;
byte[] readSingleBlock = new byte[] {
(byte) 0x28, // Flags: Addressed (bit 5), Protocol Extension (bit 3)
(byte) 0x20, // Command: READ_SINGLE_BLOCK
0, 0, 0, 0, 0, 0, 0, 0, // placeholder for UID
(byte) (blockNumber & 0x0ff),
(byte) ((blockNumber >> 8) & 0x0ff)
};
byte[] id = nfcv.GetTag().GetId();
Array.Copy(id, 0, readSingleBlock, 2, 8);
response = nfcv.Transceive(readSingleBlock);
由于您使用了高数据速率(Data_rate标志设置)和INVENTORY命令,因此您可能还希望将高数据速率与READ_SINGLE_BLOCK命令一起使用。在这种情况下,您将使用标记值0x2A
(而不是0x28
)。
最后,您应该避免在任何NfcX标记技术对象上发送防冲突/枚举命令,例如INVENTORY命令。虽然这可能有效,但您可能会混淆ANdroid NFC堆栈的内部状态保持,因为它已经为您执行这些命令并跟踪枚举的标记。您可以从Tag
对象和NfcV
对象获取通过INVENTORY请求获得的所有信息:
tag.GetId()
为您提供了代码的UID。nfcv.GetDsfId()
为您提供了代码的DSFID。nfcv.GetResponseFlags()
为您提供INVENTORY响应的标志字节。