ACR122 - Эмуляция карты

Как я могу заставить NFC бесконтактный считыватель ACR122U вести себя как тег (режим эмуляции карты)? В проспекте утверждается, что устройство может выполнять эмуляцию карты, но SDK, похоже, не предоставляет пример или документацию для этой функции.

Кто-нибудь знает, как это сделать? Требуется ли дополнительное программное обеспечение? Обратите внимание: моя целевая платформа - это MS Windows.

Заранее спасибо

Ответ 1

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

** Command to PN532 **
0xd4 0x8c TgInitAsTarget instruction code
0x00 Acceptable modes
(0x00 = allow all, 0x01 = only allow to be
initialized as passive, 0x02 = allow DEP only)

_6 bytes (_MIFARE_)_:
0x08 0x00 SENS_RES
0x12 0x34 0x56 NFCID1
0x40 SEL_RES

_18 bytes (_Felica_)_:
0x01 0xfe 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7
NFCID2
0xc0 0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7
?
0xff 0xff System parameters?
0xaa 0x99 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11
NFCID3
0x00 ?
0x00 ?

Это ответ, когда инициатор активировал эту цель:

** Response from PN532 **
0xd5 0x8d TgInitAsTarget response code
0x04 Mode
(0x04 = DEP, 106kbps)

Сообщите мне, если это работает!

Ответ 2

Также вы можете попробовать отправить следующий ADPU в HEX, чтобы поместить читателя в режим эмуляции карты:

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 AA 99 88 77 66 55 44 33 22 11 00 00

Ответ 3

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

  • ReadRegister:

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

    xx = xx | 0x004;  // CIU_TxAuto |= InitialRFOn
    yy = yy & 0x0EF;  // CIU_ManualRCV &= ~ParityDisable
    zz = zz & 0x0F7;  // CIU_Status2 &= ~MFCrypto1On
    
  • WriteRegister:

    > FF000000 11 D408 6302 80 6303 80 6305 xx 630D yy 6338 zz
    < D509 9000
    
  • SetParameters:

    > FF000000 03 D412 30
    < D513 9000
    
  • TgInitAsTarget

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

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

  • Общайтесь с использованием последовательности команд 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).

Ответ 4

Вы можете использовать LibNFC. Для этого есть пример кода.

Я до сих пор так плохо работал в Windows. Вероятно, вам придется скомпилировать libnfc для определенных драйверов.

Кроме того, ACR122u, по-видимому, довольно плохо поддерживается многими библиотеками. По-видимому, он не предназначен для этого. Также есть проблемы с эмуляцией карты (например, тайм-аут). Нам действительно нужно остановить ACR122u. Я только что купил то, что было популярно и легко получить, но пожалею об этом сейчас.

К будущим браузерам/поисковым машинам, попадающим на это: пожалуйста, проверьте раздел совместимости на сайте libnfc и купите то, что они рекомендуют!