1

ACR122U リーダーに直接コマンドを送信しようとしています。私が持っている最も単純なものは次のとおりです: FF 00 48 00 00

このコマンドは、ファームウェアのバージョンを返すと想定されています。ACR122U ツールを使用すると、正常に動作することがわかります。nfc_initiator_transceive_bytes を使用してこれを送信し、ファームウェア バージョンを取得しようとしています。これが私がやっている方法です:

uint8_t abtCmd[] = {0xFF,0x00,0x48,0x00,0x00};
int res = nfc_initiator_transceive_bytes(
            pnd,           
            abtCmd,
            5,
            pbtRx,
            400,           
            2000
            );

これは常に -2 を返します。nfc_initiator_transceive_bytes は正しい関数ではありませんか? 私は何を間違っていますか?ありがとう!

PS:そこに \xFF\x00\x00\x00\x05 があります。これは、マニュアルにそのように書かれているためです (API_ACR122U_v1.4.pdf セクション 6.1 直接コマンド)。

libnfc でデバッグを有効にしましたが、次のように表示されます。

デバッグ libnfc.driver.acr122_usb TX: 6f 0d 00 00 00 00 00 00 00 00 ff 00 00 00 08 d4 40 01 ff 00 48 00 00 デバッグ
libnfc.driver.acr122_usb RX: 80 05 00 00 00 00 01 00 41 27 90 00

私は ff 00 00 00 を見ることができるので、直接コマンドを送信するときにそれを指定する必要はないと思いますが、これはまだこれを返しています:

debug libnfc.chip.pn53x チップ エラー:「コマンドが受け入れられません」(27)、返されたエラー:「無効な引数」(-2))

これを台無しにしているのは、libnfc が追加している 16 進数ですか? 誰かお願いします???

初期コードも変更しました。

また、次のようにして nfc_target_send_bytes を試しました。

nfc_target_send_bytes(pnd, abtCmd, 5,0);

これにより、セグメンテーション違反が発生します。

4

1 に答える 1

2

libnfc は、NFC インターフェイス デバイス (ACR122U など) の NFC 機能の抽象化レイヤーです。したがって、メソッドはnfc_initiator_transceive_bytes()すでに ACR122U デバイス固有のプロトコルを処理しています。

あなたの場合 (acr122_usb インターフェイス ドライバーを使用しています)、libnfc は NFC CCID デバイス (ACR122U によって公開されます) と直接対話し、リーダー固有のコマンド (PN532 NFC の APDU ラップされたネイティブ コマンド) を含む CCID フレームを直接送信します。 ACR122U 内のコントローラー)。

の場合nfc_initiator_transceive_bytes()、これは libnfc が次のことを行うことを意味します。

  • d4 40NFC 経由で他の NFC デバイスにデータを送信するために、PN532 コマンド InDataExchange (で始まる) を送信します。
  • PN532 ネイティブ コマンドを APDU にラップして、CCID 経由で転送します ( で始まりff 00 00 00 08ます)。
  • コマンド全体を USB CCID クラス フレームにラップします ( で始まり6f 0dます)。

そして答えのために:

  • 応答 CCID フレームをアンラップします ( で始まり80 05ます)。
  • 応答 APDU をアンラップします ( d5 41 27 90 00)。
  • ネイティブ PN532 InDataExchange 応答をデコードします ( d5 41 27)。

ff 00 48 00 00これは事実上、その方法を使用して ACR122U 固有の APDU コマンド ( ) を送信し、この方法を使用してリーダーのファームウェア バージョンを取得することはできないことを意味します。代わりに、たとえば PC/SC を使用して、APDU コマンドをリーダーに直接送信する必要があります (そのようなコマンドを使用したい場合)。

于 2014-07-01T07:44:54.173 に答える