Android nfcV获取信息命令returns只有一个字节
Android NfcV get information command returns only one byte
我正在编写一个应用程序来读取 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)
{
...
}
}
如果我运行这个函数读取三星 S3 Neo 上的 NFC 标签一切正常,答案变量填充了预期的数据:
00 04 4B A0 14 01 00 A0 07 E0 F3 07
但是,如果我 运行 相同的函数在华为 P8lite 上读取相同的 NFC 标签,则答案变量仅填充一个字节:
03
如果出现错误,ISO 15693-3 标准规定我应该收到类似
的信息
01 03
即至少两个字节,其中第二个字节是错误代码。所以我实际得到的答案在理论上是不可能的。
我做错了什么?它取决于移动硬件吗?我该如何解决?
因为您没有使用寻址命令(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 以高数据速率响应的问题。
我正在编写一个应用程序来读取 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)
{
...
}
}
如果我运行这个函数读取三星 S3 Neo 上的 NFC 标签一切正常,答案变量填充了预期的数据:
00 04 4B A0 14 01 00 A0 07 E0 F3 07
但是,如果我 运行 相同的函数在华为 P8lite 上读取相同的 NFC 标签,则答案变量仅填充一个字节:
03
如果出现错误,ISO 15693-3 标准规定我应该收到类似
的信息01 03
即至少两个字节,其中第二个字节是错误代码。所以我实际得到的答案在理论上是不可能的。
我做错了什么?它取决于移动硬件吗?我该如何解决?
因为您没有使用寻址命令(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 以高数据速率响应的问题。