2015-11-13 4 views
3

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

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

Теперь я написал приложение для Android, но я застрял. Согласно readers 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, где это сообщение ЦНК, который содержит URL «http://www.google.com». Я создал это сообщение ЦНКА с помощью этого 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-адрес?
  • Я что-то пропустил? Ошибочны ли мои команды?
  • Почему есть некоторые "?" персонажи?

ответ

2

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

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, блок СС должен был бы быть заполнен значением

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

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

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

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
+1

Большое спасибо за Ваш ответ! Этот вопрос был довольно давно. Проект был оставлен с тех пор руководителем проекта. Тем не менее, я соглашусь, потому что это кажется очень хорошим. Для будущих читателей: имейте в виду, я никогда не тестировал это;) –