我正在编写一个用于读取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标准规定我应该收到类似的东西
03年1月
即至少两个字节,其中第二个字节是错误代码。所以我得到的答案在理论上是不可能的。
我做错了什么?它依赖于移动硬件吗?我该怎么修?
由于您没有使用寻址命令(未设置Address_flag,请求中没有UID字段)。如果标记不支持可选命令(甚至不支持错误代码),则根本不应收到任何响应。因此,根据标准,您不应接收03
和01 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在高数据速率下响应的问题。