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 и купите то, что они рекомендуют!