NFC ADPU CLA = 0x03,这是什么意思?

时间:2014-07-06 15:56:01

标签: android nfc smartcard rfid apdu

我使用微控制器和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
            }

1 个答案:

答案 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中实现了几种存在检查的替代方法:

    通道0上的
  • READ_BINARY 00 B0 00 00 01:这是第一代libnfc-nci的默认设置,并且在大多数使用Broadcom芯片组至Android 4.4.4的设备上使用。
  • 通道3上的
  • READ_BINARY 03 B0 00 00 01:这已经被实现为在通道0上发送READ_BINARY命令的替代方案。这背后的想法似乎是避免干扰通道0上的任何正在进行的通信。但是,从我发现它似乎从未打开通道3(既不通过MANAGE_LOGICAL_CHANNEL显式也不通过SELECT命令隐式)。因此,这可能仍会导致某些(许多?)卡出现问题。
  • ISO / IEC 14443停用并重新激活卡。
  • 使用空I块的ISO / IEC 14443符合状态检查。

通过/system/etc/libnfc-bcrm.conf配置文件设置状态检查机制。请参阅libnfc-bcrm.conf starting on line 250