【问题标题】:Android NfcV get information command returns only one byteAndroid NfcV 获取信息命令只返回一个字节
【发布时间】:2016-08-25 08:48:21
【问题描述】:

我正在编写一个应用程序来读取 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

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

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

【问题讨论】:

    标签: android tags nfc rfid iso-15693


    【解决方案1】:

    由于您没有使用寻址命令(未设置地址标志,请求中没有 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 以高数据速率响应的问题。

    【讨论】:

    • 使用已解决的命令版本解决了该问题。非常感谢!
    • @CarloCe 您是否也尝试过 Data_rate_flag 的不同设置?其他 SO 读者可能很想知道 P8lite 是否支持这两个选项...
    • 如果我使用寻址命令它接受 data_rate set 和 unset
    猜你喜欢
    • 2015-05-14
    • 2013-11-16
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多