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 00 08 41 27 90 00

我可以看到 ff 00 00 00 所以我想我不必指定当我发送直接命令时,但这仍然返回:

调试 libnfc.chip.pn53x 芯片错误:“命令不可接受”(27),返回错误:“无效参数”(-2))

是不是 libnfc 添加的十六进制把这搞砸了?请问有人吗???

我还更改了初始代码。

我也尝试过使用 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 公开)进行交互,并将直接发送包含特定于读卡器命令的 CCID 帧(用于 PN532 NFC 的 APDU 包装的本机命令ACR122U 内的控制器)。

因此,在 的情况下nfc_initiator_transceive_bytes(),这意味着 libnfc 将执行以下操作:

  • 发送 PN532 命令 InDataExchange(以 开头d4 40)用于通过 NFC 向其他 NFC 设备发送数据。
  • 将 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)。

对您而言,这实际上意味着您不能使用该方法发送 ACR122U 特定的 APDU 命令 ( ff 00 48 00 00) 以使用该方法获取读卡器的固件版本。相反,如果您想使用这样的命令,您应该使用例如 PC/SC 直接向阅读器发送 APDU 命令。

于 2014-07-01T07:44:54.173 回答