使用nfc_initiator_transceive_bytes()无法使用libnfc发送大型APDU命令

时间:2017-12-14 19:39:47

标签: android c++ nfc apdu lib-nfc

我正在尝试围绕libnfc构建一个C ++包装器,以便在我的Android和PN532 RFID模块之间进行通信。

这对我帮助很大:http://nfc-tools.org/index.php/Libnfc:APDU_example

此代码用于发送一个APDU命令,其中正文包含在http://localhost/cod_ign/index.php/news/localhost/cod_ign/index.php/news/create中(我没有发送任何头字节等),并将响应读入message

问题:如果response超过 262 字符,则会出现检测到缓冲区溢出错误。否则它的效果非常好。我甚至不认为NFC库会引发错误。

message

1 个答案:

答案 0 :(得分:1)

262字节的限制是PN532 NFC芯片的硬限制。这是可以在一个InDataExchange命令中发送(和接收)的原始数据的最大大小。 libnfc明确强制实施方法nfc_initiator_transceive_bytes()的此限制(请参阅the definition of abtCmd in pn53x_initiator_transceive_bytes()definition of PN53x_EXTENDED_FRAME__DATA_MAX_LEN)。

您可以采取哪些措施来克服此限制,即构建您自己的ISO / IEC 14443-4块(使用InCommunicateThru,即nfc_initiator_transceive_bytes()并关闭m_nfcDevice->bEasyFraming。虽然每个帧仍然有限到263个字节(PN532实际上允许264个字节用于InCommunicateThru,但libnfc似乎将此限制为263个字节),然后您可以将扩展长度的APDU打包到多个ISO / IEC 14443-4 I块中。但是,您需要处理整个ISO / IEC 14443-4框架自己(这意味着你还必须照顾接收确认等)。

最后,由于其他通信端点是Android设备:许多Android设备不支持扩展长度的APDU。因此,即使您发送更长的APDU,您也可能无法在Android端接收和处理它们。另外,请注意,您应该发送符合ISO / IEC 7816-4中定义的结构的正确APDU(即具有有效标头和长度字段的APDU),否则在与某些设备通信时可能会遇到问题。