2017-12-14 6 views
1

Ich versuche, einen C++ - Wrapper um libnfc zu bauen, um eine Kommunikation zwischen meinem Android und dem PN532 RFID-Modul herzustellen. Ich kann nicht große APDU-Befehle mit libnfc senden unter Verwendung von nfc_initiator_transceive_bytes()

Das hat mir sehr geholfen: http://nfc-tools.org/index.php/Libnfc:APDU_example

Dieser Code soll einen APDU-Befehl senden, wo der Körper in message enthalten ist (ich bin keine Header-Bytes usw. Senden) und die Antwort in response lesen.

Problem: Wenn message Zeichen überschreitet dann bekomme ich einen Pufferüberlauf Fehler erkannt. Ansonsten klappt es ganz gut. Ich glaube nicht einmal, dass der Fehler von der NFC-Bibliothek ausgelöst wird.

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

Möglicherweise müssen Sie nach Unterstützung für erweiterte APDU suchen - das Problem könnte sein, dass Ihr Android-Gerät keine APDUs mit Datenlänge> 255 Byte 'cla [1] + ins [1] + param [2] + lc unterstützt [1] + data [255] + le [1] = 261 bytes' –

Antwort

1

Die Grenze von 262 Bytes ist eine harte Grenze der PN532 NFC-Chip auferlegt. Dies ist die maximale Größe der Rohdaten, die in einem InDataExchange-Befehl gesendet (und empfangen) werden können. libnfc erzwingt dieses Limit explizit für die Methode nfc_initiator_transceive_bytes() (siehe the definition of abtCmd in pn53x_initiator_transceive_bytes() und definition of PN53x_EXTENDED_FRAME__DATA_MAX_LEN).

Was Sie tun können, diese Grenze zu überwinden, ist Ihre eigene ISO/IEC 14443-4 Blöcke zu komponieren (mit InCommunicateThru, dh nfc_initiator_transceive_bytes() mit m_nfcDevice->bEasyFraming ausgeschaltet. Während jeder Frame tatsächlich noch auf 263 Bytes (die PN532 begrenzt werden würde erlaubt 264 Bytes für InCommunicateThru, aber libnfc scheint dies auf 263 Bytes zu begrenzen), Sie können dann Ihre erweiterten Längen-APDUs in mehrere ISO/IEC 14443-4 I-Blöcke packen.Allerdings müssten Sie die gesamte ISO/IEC 14443- 4 Framing auf eigene Faust (was bedeutet, dass Sie auch auf Empfangsquittungen, etc. kümmern müssen)

Schließlich, da der andere Kommunikationsendpunkt ein Android-Gerät ist: Viele Android-Geräte unterstützen keine erweiterten Länge APDUs. auch wenn Du Senden Sie längere APDUs, die Sie möglicherweise nicht auf der Android-Seite empfangen und verarbeiten können. Beachten Sie außerdem, dass Sie korrekte APDUs senden sollten, die den in ISO/IEC 7816-4 definierten Strukturen entsprechen (z. B. APDUs mit gültigen Feldern für Header und Längen), da es sonst zu Problemen beim Kommunizieren mit einigen Geräten kommen kann.

+0

Danke für so eine ausführliche Antwort;) Nun, ich schätze, ich werde mehrere Blöcke senden und das Protokoll selbst implementieren müssen –

+1

@OmarAflak Das leichtere Die Auswahl würde wahrscheinlich darin bestehen, die Daten auf mehrere APDUs aufzuteilen und Ihr Protokoll auf APDUs zu implementieren. In diesem Fall müssten Sie nicht viel auf das Timing achten (was Sie tun müssten, wenn Sie die Übertragung von ISO/IEC 14443-4 selbständig durchführen würden). –

Verwandte Themen