我使用微控制器和NFC前端设置了4型NFC标签的仿真。 第一步是向NFC智能手机显示短信, 将NDEF消息发送到NFC阅读器(手机)后,它会按预期显示, 但随后读者发送了一个额外的ADPU命令:
0x02 PCB
0x03 CLA
0xB0 INS
0x00
0x00
0x01
CLA = 0x03是什么意思?
这意味着最后一个响应-ADPU出了什么问题?
读者对标签的期望是什么?
我检查了ISO7816,但没有找到解释
我希望读者在获得最终NDEF消息后释放标签,还是应该将我的NFC前端置于空闲模式?
感谢您的投入, 安德烈亚斯
case AMS_WF_NDEF_READ_REQ:
if ((nBytesInFIFO==6)
&(fifoData[0]==0x03) // PCB header byte
&(fifoData[1]==0x00) // ATPDU: CLA instruction class
&(fifoData[2]==0xB0) // ATPDU: INS instruction code (B0=SELECT-FILE, see ISO7816, table-11)
&(fifoData[3]==0x00) // ATPDU: P1 instruction parameter #1, P1 and P2 are the offset for reading
&(fifoData[4]==0x02) // ATPDU: P2 instruction parameter #2
&(fifoData[5]==0x0A))// ATPDU: Lc Length of data field in the reply
{
sprintf_P(str,PSTR("NDEF-RD-RQST\n")); uart_puts(str);
ams_resp(0x0A+3, // num parameter, depends on the data length info from reader
0x03, // PCB header
0xD1, // NDEF header
0x01, // type length
0x06, // payload length
0x54, // type, for example: 'T'=Text
0x02, //
0x65,0x6E, // language code, for example: "en"
0x6F,0x6B,0x0A,// payload
0x90,0x00); // OK
ams_state=AMS_WF_PCD_SEL_BY_DF_NAME; // back to initial state
}
答案 0 :(得分:1)
您收到的命令03 B0 00 00 01
是最后一个选定文件的READ_BINARY命令(在逻辑通道3上发出)。这是libnfc-nci NFC堆栈的典型行为(因此存在于具有Broadcom NFC芯片组的所有设备上)。 NFC堆栈尝试使用此命令读取NDEF文件的一个字节(NFC论坛类型4标签)。众所周知,这会干扰许多应用程序,因为它可能发生在应用程序发送的其他命令的中间。
libnfc-nci NFC堆栈(错误地)实现了在基本通道(逻辑通道0)上发送READ_BINARY命令(00 B0 00 00 01
)作为存在检查机制来检测是否有标签仍然存在或已从NFC读取器中删除。基于libnfc-nxp(NXP芯片组)的设备正确使用ISO 14443-4中描述的存在检查机制。这是一个已知且未修复的错误很长一段时间:issue #58773。
为了克服此类"存在检查"产生的问题,在较新版本的libnfc-nci中实现了几种存在检查的替代方法:
00 B0 00 00 01
:这是第一代libnfc-nci的默认设置,并且在大多数使用Broadcom芯片组至Android 4.4.4的设备上使用。03 B0 00 00 01
:这已经被实现为在通道0上发送READ_BINARY命令的替代方案。这背后的想法似乎是避免干扰通道0上的任何正在进行的通信。但是,从我发现它似乎从未打开通道3(既不通过MANAGE_LOGICAL_CHANNEL显式也不通过SELECT命令隐式)。因此,这可能仍会导致某些(许多?)卡出现问题。通过/system/etc/libnfc-bcrm.conf配置文件设置状态检查机制。请参阅libnfc-bcrm.conf starting on line 250。