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

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

该代码旨在发送APDU命令,其中正文包含在message中(我不发送任何头字节等),并将响应读入response

问题:如果message超过 262个字符,则我收到缓冲区溢出,检测到错误。否则它会很好地工作。我什至不认为该错误是由NFC库引发的。

bool send(const std::string &message, std::string &response){
    std::vector<uint8_t> apduCmd(message.begin(), message.end());
    uint8_t *capdu = &apduCmd[0];
    size_t capdulen = apduCmd.size();
    uint8_t rapdu[10];
    size_t rapdulen = 10;

    // BUFFER OVERFLOW HERE
    int res = nfc_initiator_transceive_bytes(m_nfcDevice, capdu, capdulen, rapdu, rapdulen, 500);
    if (res<0) {
        return false;
    }

    if(res<2 || rapdu[res-2] != 0x90 || rapdu[res-1] != 0x00){
        return false;
    }

    // byteArrayToString omitting the last two bytes
    response = byteArrayToString(rapdu, 0, res-2);
    return true;
}

最佳答案

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(即具有有效 header 和长度字段的APDU),否则在与某些设备通信时可能会遇到问题。

关于android - 无法使用nfc_initiator_transceive_bytes()与libnfc发送大型APDU命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47820902/

10-11 00:50