Доступ к режиму эмуляции карты на USB-NFC-Reader
У меня планшет Android с 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-адрес?
- Я что-то пропустил? Мои команды неверны?
- Почему есть некоторые "?" персонажи?
1 ответ
Команда, которую вы используете,
E0 00 00 6001 01 <адрес байта> <длина> <данные>
записывает байты данных, начиная с блока 3 эмулируемого тега типа 2 форума NFC. Таким образом, адрес байта 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 (текущую версию) отображения данных, определенную спецификацией операции тегов типа 2 форума NFC, и 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
Наконец, вы должны заполнить память тега до полных блоков, поместив терминатор 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