2017-12-14 17 views
1

私はAndroidとPN532 RFIDモジュール間の通信を行うためにlibnfcの周りにC++ラッパーを構築しようとしています。nfc_initiator_transceive_bytes()を使用してlibnfcで大きなAPDUコマンドを送信できません

これは私をたくさん助けた:http://nfc-tools.org/index.php/Libnfc:APDU_example

このコードは(私はバイトなど任意のヘッダを送信していないよ)本体はmessageに含まれているAPDUコマンドを送信し、responseに応答を読み込むためのものです。

問題: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のサポートを探す必要があるかもしれません - あなたのAndroidデバイスがデータ長> 255バイトのAPDUをサポートしていないことが問題です。cla [1] + ins [1] + param [2] + lc [1] + data [255] + le [1] = 261 bytes' –

答えて

1

262バイトの制限は、PN532 NFCチップに課せられた厳しい制限です。これは、1つの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でInCommunicateThru、すなわちnfc_initiator_transceive_bytes()を使用して、独自のISO/IEC 14443-4ブロックは(。オフに構成することですInCommunicateThruの場合は264バイト、libnfcの場合は263バイトに制限されているようです)、拡張長のAPDUを複数のISO/IEC 14443-4 Iブロックにパックできますが、ISO/IEC 14443-

最後に、他の通信エンドポイントがAndroidデバイスであるため、多くのAndroidデバイスは拡張された長さのAPDUをサポートしていないため、たとえあなたが長いAPDUを送信すると、Android側でAPDUを受信して​​処理できない場合があります。また、ISO/IEC 7816-4で定義されている構造(つまり有効なヘッダーと長さのフィールドを持つAPDU)に準拠した適切なAPDUを送信する必要があります。そうしないと、一部のデバイスと通信するときに問題が発生する可能性があります。

+0

このような詳細な回答ありがとうございます;)私は複数のブロックを送信し、独自にプロトコルを実装しなければならないと思います –

+1

@OmarAflakおそらく、複数のAPDUにまたがってデータを分割し、APDUの上にプロトコルを実装するという選択肢があります。このような場合は、タイミングに関する注意を払う必要はありません(ISO/IEC 14443-4トランスミッションを自分で処理する必要があります)。 –

関連する問題