ACR122U Отправка прямых команд с возвратом -2 и ошибка сегментации

#c #centos #apdu #acr122 #lib-nfc

#c #centos #apdu #acr122 #lib-nfc

Вопрос:

Я пытаюсь отправить прямую команду считывателю 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 00 81 00 d5 41 27 90 00

Я вижу ff 00 00 00, поэтому, я думаю, мне не нужно указывать это при отправке прямой команды, но это все равно возвращает это:

ошибка чипа debug libnfc.chip.pn53x: «Команда неприемлема» (27), возвращенная ошибка: «Недопустимые аргументы» (-2))

Это шестнадцатеричный код, который добавляет libnfc, который все портит? Пожалуйста, кто-нибудь???

Я также изменил исходный код.

Я также пытался использовать nfc_target_send_bytes, выполнив:

nfc_target_send_bytes(pnd, abtCmd, 5,0);

Это приводит к ошибке сегментации.

Ответ №1:

libnfc — это уровень абстракции для функциональности NFC устройств с интерфейсом NFC (таких как ACR122U). Таким образом, метод nfc_initiator_transceive_bytes() уже обрабатывает протокол, зависящий от устройства ACR122U.

В вашем случае (вы используете драйвер интерфейса acr122_usb), libnfc будет напрямую взаимодействовать с устройством CCID NFC (предоставляемым ACR122U) и напрямую отправлять кадры CCID, содержащие команды, специфичные для считывателя (собственные команды в оболочке APDU для контроллера PN532 NFC внутри ACR122U).

Таким образом, в случае nfc_initiator_transceive_bytes() , это означает, что libnfc выполнит следующее:

  • Отправьте команду PN532 в DataExchange (начиная с 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 считывателю, если вы хотите использовать такие команды.

Комментарии:

1. Спасибо за ответ. Есть ли у вас какой-либо пример кода ps / sc, отправляющего команды apdu?

2. @AntonioCS Нет, не в C.