NFC ACR122 TgInitAsTarget, инициатор освобождает цель

Я пытаюсь заставить свое устройство ACR122 (usb) эмулировать пассивную метку NFC, но у меня возникают трудности с правильной связью. Я надеюсь, что кто-то увидит, что я здесь делаю неправильно, и поможет указать мне правильное направление.

Ответ на этот другой вопрос ACR122 — эмуляция карты указывает на документ по адресу http://code.google.com/p/nfcip-java/source/browse/trunk/nfcip-java/doc/ACR122_PN53x.txt, но когда мы следуем этому письму, он ведет себя не так, как ожидалось.

Мы используем устройство Samsung Galaxy S3 Android 4.3 для тестирования и наблюдаем следующее поведение:

Transmit (TgInitAsTarget)
....'......4V@..  FF 00 00 00 27 D4 8C 00 08 00 12 34 56 40 01 FE 
................  A2 A3 A4 A5 A6 A7 C0 C1 C2 C3 C4 C5 C6 C7 FF FF 
...wfUD3"...      AA 99 88 77 66 55 44 33 22 11 00 00 

Receive
..%....7.5<...w.  D5 8D 25 1E D4 00 08 37 D9 35 3C BF D5 AE 77 9C 
...2Ffm.........  00 00 00 32 46 66 6D 01 01 11 03 02 00 13 04 01 
...               96 90 00 

Transmit (GetData)
.......           FF 00 00 00 02 D4 86 

Receive
..)..             D5 87 29 90 00 

Команда TgInitAsTarget работает, возвращая режим 0x25, который, как мы понимаем, означает «Активный режим, DEP, 424 кбит/с».

Но затем команда «GetData» немедленно терпит неудачу, возвращая код состояния 0x29 «PN532, настроенный как цель, был выпущен его инициатором».

Мы попытались изменить команду TgInitAsTarget с различными режимами (вместо режима 0x00 «Все»), попробовав следующее, которое все еще возвращает 0x29 для следующей команды GetData:

  • Режим 0x01 «Пассивный», что приводит к режиму ответа 0x04 «DEP».
  • Режим 0x02 «DEP», что приводит к режиму ответа 0x25 (то же, что и «Все»).
  • Режим 0x03 «DEP Passive», что приводит к режиму ответа 0x04 «DEP».

Во всех случаях кажется, что Android не поддерживает соединение, хотя я недостаточно знаком с протоколами NFC DEP, чтобы понять, что я здесь делаю неправильно. Я прочитал справку по микросхеме PN532, и, кажется, это указывает на то, что я все делаю правильно.

Я также пробовал устройство Windows Phone NFC, и оно обнаружило ту же проблему и тот же код ошибки в GetData.

Любая помощь от тех, кто знаком с NFC, будет принята с благодарностью.

Дэйв


person codinginthevoid    schedule 10.01.2014    source источник


Ответы (1)


Чтобы перевести ACR122 (точнее, чип контроллера NFC PN532 внутри него) в режим эмуляции карты, вы должны сделать следующее:

  1. ЧитатьРегистрация:

    > FF000000 08 D406 6305 630D 6338
    < D507 xx yy zz 9000
    
  2. Обновить значения регистров:

    xx = xx | 0x004;  // CIU_TxAuto |= InitialRFOn
    yy = yy & 0x0EF;  // CIU_ManualRCV &= ~ParityDisable
    zz = zz & 0x0F7;  // CIU_Status2 &= ~MFCrypto1On
    
  3. НаписатьРегистрация:

    > FF000000 11 D408 6302 80 6303 80 6305 xx 630D yy 6338 zz
    < D509 9000
    
  4. Установить параметры:

    > FF000000 03 D412 30
    < D513 9000
    
  5. Тгинитастаржет

    > FF000000 27 D48C 05 0400 123456 20 000000000000000000000000000000000000 00000000000000000000 00 00
    < D58D xx ... 9000
    

    Где xx должно быть равно 0x08.

  6. Общайтесь, используя последовательность команд TgGetData и TgSetData:

    > FF000000 02 D486
    < D587 xx <C-APDU> 9000
    

    Где xx — это код состояния (должен быть 0x00 для успеха), а C-APDU — это команда, отправленная считывателем.

    > FF000000 yy D48E <R-APDU>
    < D587 xx 9000
    

    Где yy — это 2 + длина R-APDU (ответ), а xx — это код состояния (в случае успеха должно быть 0x00).

person Michael Roland    schedule 14.01.2014
comment
Большое спасибо, Михаил, это точно поставило нас на правильный путь. Если вы не возражаете, есть ли какие-либо ссылки, которые вы могли бы порекомендовать нам прочитать? Кажется, ключом к этому были параметры команды initastarget (настройка режима PICC), но мы не смогли найти никаких ссылок, в которых говорилось бы о различных режимах, о том, как они работают и т. д. - person codinginthevoid; 15.01.2014
comment
Я бы посоветовал вам следовать руководству пользователя PN532 (вы должны найти его через Google) и техническому описанию PN532 (не уверен, что оно уже доступно без NDA). - person Michael Roland; 15.01.2014
comment
У нас есть руководство (а не техническое описание), но хотя оно описывает части команды TgInitAsTarget (например, параметры MiFare здесь, параметры FeliCa здесь, режим PICC/DEP/Passive), следуя примерам, мы в конечном итоге мы знаем, что мы устанавливаем, но не почему мы это устанавливаем, если это имеет смысл. Я уверен, что это придет со временем, мне просто было любопытно, есть ли какие-нибудь полезные ссылки, которые помогут нам понять концепции. Сейчас мы определенно на правильном пути; в настоящее время мы работаем над пониманием входящих значений C-APDU. Еще раз спасибо, очень признателен. - person codinginthevoid; 15.01.2014
comment
Просто для полноты картины, на случай, если кто-то пойдет тем же путем, что и мы, мы нашли четкое описание последовательности C-APDU/R-APDU для тегов NDEF в Спецификация работы тега NFC Forum Type 4. Протокол основан на ISO7816-4, и мы сочли эту ссылку полезной для понимания всего. - person codinginthevoid; 16.01.2014
comment
При вводе команды TgInitAsTarget я сталкиваюсь с ошибкой, я получаю несколько нулевых байтов, после чего поток, кажется, останавливается. Я получаю константу -1 от моего InputStream. - person gudenau; 22.03.2017
comment
@gudenau Вы используете ACR122U? Или вы используете PN532 напрямую? Через какой интерфейс? Возможно, вы захотите задать это как отдельный вопрос вместо того, чтобы захватывать этот QA. - person Michael Roland; 22.03.2017
comment
Использование серийного номера напрямую к PN532. - person gudenau; 23.03.2017
comment
@gudenau TgInitAsTarget - это блокирующая команда (вы получите только кадр ACK, но не получите фактический ответ сразу после отправки команды), поэтому вы не получите никакого ответа, пока читатель не подключится к эмулируемому тегу. Получение мусора между кадрами не является неожиданным. Убедитесь, что вы интерпретируете только правильные кадры. - person Michael Roland; 23.03.2017
comment
Аааа, спасибо. Я не понимал этого, такая глупая ошибка с моей стороны. - person gudenau; 24.03.2017
comment
@MichaelRoland, как насчет соединения на основе ACR122U. Я не смог получить никакого результата от примененной команды TgInitAsTarget. вот моя текущая проблема: stackoverflow.com/questions/55986533/ - person zacoder; 28.06.2019
comment
@MichaelRoland Можете ли вы немного пояснить, зачем нужны эти настройки регистра? А также, зачем вызывать SetParameters со значением 0x30, разве это не гарантирует использование значений PN532 по умолчанию (fAutomaticRATS и fISO1444-4_PICC оба установлены, все остальные не установлены). - person Papyrus; 13.04.2021