Доступ к режиму эмуляции карты на USB-NFC-Reader

У меня есть планшет с Android 4.2. Этот планшет не имеет оборудования NFC. Однако у меня есть внешний USB-ридер: ACR 1252U, поставляемый с библиотекой Android. Я задал несколько общих вопросов о моей настройке здесь. Теперь, когда он становится более конкретным, мне нужно задать еще один вопрос. В этом предыдущем вопросе я узнал, что могу использовать библиотеку ACS Android для доступа к возможностям эмуляции карты ридеров.

Моя первая цель — заставить этот ридер эмулировать метку NFC, содержащую URL-адрес. Любой телефон Android с поддержкой NFC должен иметь возможность сканировать этот эмулированный тег и автоматически открывать браузер. Я протестировал его, и он работает с реальным (физическим) тегом. Но, к сожалению, я не могу правильно эмулировать этот тег...

Сейчас я написал приложение для Android, но застрял. Согласно API для чтения (PDF) , я могу перевести его в режим эмуляции карты, отправив команду

E0 00 00 40 03 01 00 00

Когда я это делаю, он дает мне ответ:

E1 00 00 00 03 01 01 01

Это подтверждает, что он находится в режиме эмуляции карты. С помощью приложения для Android я теперь могу сканировать эмулированный тег, в котором говорится, что он распознан как тег «NXP MIFARE Ultralight».

Теперь моя проблема заключается в том, как передать тег URL-адресом. Согласно API считывателя (раздел 5.10.3) мне нужно отправить команду:

E0 00 00 60 13 01 01 00 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D

где D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D – это сообщение NDEF, содержащее URL-адрес "http://www.google.com". Я создал это сообщение NDEF, используя этот код Android Java:

String target_url = "http://www.google.com";
Uri uri = Uri.parse(target_url);
NdefRecord recordNFC = NdefRecord.createUri(uri);
NdefMessage message = new NdefMessage(recordNFC);

Приложение на моем телефоне Android, которое считывает тег NFC, говорит следующее:

Ширина

Как видите, URL-адрес сохраняется в эмулируемом теге.

  • Так почему же браузер моего телефона не открывает URL-адрес?
  • Я что-то упускаю? Мои команды неверны?
  • Почему есть некоторые "?" символы?

person Michael B    schedule 13.11.2015    source источник


Ответы (1)


Команда, которую вы используете,

E0 00 00 60 <Lc> 01 01 <Byte address> <Length> <Data>

записывает байты данных, начиная с блока 3 эмулируемого тега NFC Forum Type 2. Таким образом, адрес байта 0x00 обращается к первому байту блока 3.

Проблема, с которой вы столкнулись, заключается в том, что вы записываете только само сообщение NDEF, начиная с блока 3 (байт 0). Однако для тега NFC Forum Type 2 требуются дополнительные метаданные. В частности, блок 3 является блоком контейнера возможностей. Для конкретной схемы памяти, представленной ACR1252U, блок CC должен быть заполнен значением

  • E1 10 06 00 (если должен быть разрешен доступ на запись) или
  • E1 10 06 0F (если другие устройства NFC должны рассматривать тег как доступный только для чтения).

E1 — это магическое число, указывающее, что это тег форума NFC, 10 относится к версии 1.0 (текущая версия) сопоставления данных, определяемой спецификацией операции тега NFC Forum Type 2, а 06 указывает, что тег имеет в общей сложности 12 тегов. блоки данных.

Кроме того, вам необходимо обернуть сообщение NDEF в блок TLV сообщения NDEF. Блок TLV сообщения NDEF имеет тег 0x03. Таким образом, упакованное сообщение NDEF будет выглядеть так:

03 0F D1010B5501676F6F676C652E636F6D

Таким образом, память тегов, которую вам нужно записать, будет выглядеть так:

E1 10 06 00
03 0F D1 01
0B 55 01 67
6F 6F 67 6C
65 2E 63 6F
6D         

Наконец, вы должны заполнить память тегов до полных блоков, поместив Terminator TLV (тег 0xFE, без длины) в конце и заполнив оставшиеся байты нулями (0x00). Это также относится к случаю, когда данные уже выровнены по полным блокам, но за концом ваших данных есть дополнительные (пустые) блоки.

E1 10 06 00
03 0F D1 01
0B 55 01 67
6F 6F 67 6C
65 2E 63 6F
6D FE 00 00

Таким образом, вы можете использовать следующую команду записи для сохранения данных в эмулируемом теге типа 2:

E0 00 00 60 1C 01 01 00 18 E1 10 06 00 03 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D FE 00 00
person Michael Roland    schedule 09.05.2016
comment
Большое спасибо за ответ! Этот вопрос был довольно давно. С тех пор проект был заброшен менеджером проекта. Тем не менее я приму его, потому что он кажется очень хорошим. Для будущих читателей: имейте в виду, я никогда не проверял это;) - person Michael B; 09.05.2016