#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.