Android NfcV获取信息命令只返回一个字节

时间:2016-04-30 05:19:40

标签: android tags nfc rfid iso-15693

我正在编写一个用于阅读NFC标签的二进制信息的应用程序。这是NFC意图处理函数的代码:

protected void onNewIntent(@NonNull Intent intent)
{
    try
    {
        Tag    tag     = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        NfcV   nfcV    = NfcV.get(tag);
        byte[] cmdInfo = new byte[]{(byte) 0x02, (byte) 0x2b}; // 'Get info' command
        byte[] answer  = nfcV.transceive(cmdInfo); // Read info from tag.

        ...
    }
    catch(IOException e)
    {
        ...
    }
}

如果我在Samsung S3 Neo上运行此功能读取NFC标签,一切正常,答案变量充满了预期的数据:

00 04 4B A0 14 01 00 A0 07 E0 F3 07

如果我在华为P8lite上运行相同的功能读取相同的NFC标签,那么答案变量只填充一个字节:

03

如果出现错误,ISO 15693-3标准规定我应该收到类似

的内容
01 03

即。至少两个字节,其中第二个字节是错误代码。所以我实际得到的答案在理论上是不可能的。

我做错了什么?它取决于移动硬件吗?我该如何解决?

1 个答案:

答案 0 :(得分:4)

由于您没有使用已寻址的命令(未设置Address_flag,请求中没有UID字段)。如果标签不支持可选命令(甚至不是错误代码),您根本不应该收到任何共鸣。因此,您不应该根据标准接收0301 03

请注意,Android设备中的NFC芯片组在ISO / IEC 15693中通常具有局限性,并且不支持完整标准。例如,已知一些芯片组存在未寻址命令的问题。您可以使用命令的寻址版本来解决这个问题:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcV nfcV = NfcV.get(tag);
byte[] cmdInfo = new byte[]{
        (byte)0x20,
        (byte)0x2B,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00 };
System.arraycopy(tag.getId(), 0, cmdInfo, 2, 8);
byte[] answer = nfcV.transceive(cmdInfo);

您可能还希望使用Data_rate_flag的不同设置进行测试,因为设备上的NFC芯片组可能存在VICC以高数据速率响应的问题。