2017-12-14 4 views
1

내 안드로이드와 PN532 RFID 모듈 사이의 통신을 위해 libnfc 주위에 C++ 래퍼를 작성하려고합니다. 이 코드는 몸이 message에 포함 된 APDU 명령을 (내가 어떤 헤더 바이트 등을 전송하고 있지 않다) 보내 response에 응답을 읽기위한 것입니다 http://nfc-tools.org/index.php/Libnfc:APDU_examplenfc_initiator_transceive_bytes()를 사용하여 libnfc와 함께 커다란 APDU 명령을 보낼 수 없습니다.

:

나에게 많은 도움이되었습니다.

문제 : 262 문자를 초과message 경우는 내가 버퍼 오버 플로우가 오류를 발견 얻을. 그렇지 않으면 완벽하게 잘 작동합니다. 나는 오류가 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; 
} 
+1

확장 된 APDU의 지원을 찾아야 할 수도 있습니다. 안드로이드 장치가 데이터 길이> 255 바이트 인 cla [1] + ins [1] + param [2] + lc로 APDU를 지원하지 않을 수 있습니다. [1] + data [255] + le [1] = 261 bytes' –

답변

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 참조)에 대해이 제한을 명시 적으로 적용합니다. 각 프레임은 여전히 ​​실제로 263 바이트합니다 (PN532로 제한 될 것이지만이 한계를 극복하기 위해 무엇을 할 수 있는지

은. m_nfcDevice->bEasyFraming의 전원이 꺼져 즉 nfc_initiator_transceive_bytes()와 InCommunicateThru을 사용하여 자신의 ISO/IEC 14443-4 블록 (구성하는 것입니다 InCommunicateThru의 경우 264 바이트를 허용하지만 libnfc는 263 바이트로 제한하는 것 같습니다.) 그러면 확장 된 길이의 APDU를 여러 ISO/IEC 14443-4 I- 블록에 압축 할 수 있습니다. 그러나 ISO/IEC 14443-4 I- 블록 전체를 처리해야합니다. 4 프레이밍 (즉, 수신 확인 등을 처리해야 함을 의미 함)

마지막으로 다른 통신 엔드 포인트는 Android 디바이스이므로 많은 Android 디바이스는 확장 된 길이의 APDU를 지원하지 않으므로, 당신이 더 긴 APDU를 보내면 안드로이드 측에서 APDU를 수신하고 처리 할 수 ​​없을 수도 있습니다. 또한 ISO/IEC 7816-4에 정의 된 구조 (즉 유효한 헤더 및 길이 필드가있는 APDU)에 맞는 적절한 APDU를 보내야합니다. 그렇지 않으면 일부 장치와 통신 할 때 문제가 발생할 수 있습니다.

+0

그런 상세한 해답을 가져 주셔서 감사합니다.) 글쎄요, 여러 블록을 보내고 프로토콜을 직접 구현해야 할 것 같네요. –

+1

@OmarAflak 선택은 아마도 여러 APDU에 걸쳐 데이터를 분리하고 APDU 상단에 프로토콜을 구현하는 것입니다. 이 경우 타이밍에 많은 신경을 쓸 필요가 없습니다. ISO/IEC 14443-4 전송을 직접 처리해야하는 경우 필요합니다. –

관련 문제