Чтение тега Mifare с использованием Windows Phone 8 NFC?
Поддерживает ли Windows Phone 8 NFC теги Mifare Ultralight/Classic?
Я использую этот код для доступа к устройству NFC на Nokia Lumia 920 (пример кода был взят из NDEF Tag Reader - NFC NDEF Tag Reader)
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
ProximityDevice device = ProximityDevice.GetDefault();
device.DeviceArrived += DeviceArrived;
device.DeviceDeparted += DeviceDeparted;
device.SubscribeForMessage("NDEF", MessageReceived);
}
private void DeviceArrived(ProximityDevice sender)
{
// this event occurs when I am tapping any of my tags (tried 5 different Mifare Ultralight/Classic)
}
private void DeviceDeparted(ProximityDevice sender)
{
// this event occurs when I am moving away any tag
}
private void MessageReceived(ProximityDevice sender, ProximityMessage message)
{
// this event is never fired!!! :(
}
}
Является ли NFC на WP8 дефектным или этот код неправильный?
Update:
Из этого документа Теги типа NFC Forum вы можете найти, что Mifare Ultralight совместим с NDEF. Устройства Android могут легко читать теги этого типа.
Ответы
Ответ 1
Mifrare поддерживается на WP8 и Lumia 920. Я предполагаю здесь, но, скорее всего, ваш тег Mifare NFC не отформатирован/не инициализирован NDEF. Вы можете запросить, чтобы ваши теги NFC были отформатированы NDEF при покупке тегов NFC.
Чип Lumia 920 (семейство NXP PN544) поддерживает следующие типы тегов (по крайней мере):
- Тип 1: семья Топаз
- Тип 2: семейство Mifare Ultralight, my-d-move, NTag
- Тип 3: семья Фелики
- Тип 4: семья Desfire
- Не стандартизировано: стандарт Mifare
Относительно тегов NFC Создание NDEF:
- WP8 поддерживает только уровень доступа NDEF к этим тегам, что означает, что тег должен быть отформатирован в формате NDEF или иметь к нему сообщение NDEF (может быть пустым). Если вы попытаетесь использовать API-интерфейсы для неформатированных тегов NFC, они не сработают (поскольку WP8 не поддерживает поддержку определенных типов/типов тегов типа низкого уровня)
- Если вы хотите, чтобы NDEF форматировал теги, у вас есть следующие параметры: при заказе тегов запрашивать их в формате NDEF (или/или содержать пустое сообщение NDEF и тег, который нужно разблокировать), используйте NFC USB Reader/Writer HW для ПК или использовать устройство NFC для Symbian/MeeGo/Android с приложением для написания NFC.
С уважением,
- Джастин Анхель
Главный инженер для Windows Phone Developer Experience в Nokia
Ответ 2
Введенный вами код должен читать NDEF сообщения из тега NFC.
В то время как Mifare также используется с тегами NFC, где заканчивается сходство: совершенно другой протокол со своим собственным (проприетарным) форматом данных.
Итак, этот код на самом деле не прав (и NFC на WP8 вообще "неисправен" ), но если вы ожидаете, что он будет читать теги Mifare, этот подход не будет работать для вас.
Я не знаю, можно ли читать теги Mifare с WP8: это зависит от аппаратного обеспечения (поскольку Mifare использует некоторые не-ISO-кадры), а также поддержку API. Быстрый поиск Google предполагает, что Java SDK для старых телефонов Nokia поддерживает Mifare, поэтому аппаратная поддержка может быть там. Однако ничего не нашел для WP8, поэтому для этого, скорее всего, потребуется некоторое расширенное кодирование, если оно вообще работает.
Чтобы дать вам некоторое представление о том, что необходимо: после получения вашего события DeviceArrived (это означает, что читатель обнаружил тег ISO NFC), вам нужно получить UID карты. Это должно быть довольно просто, поскольку эта стандартная функциональность ISO.
Далее вам нужна возможность напрямую отправлять теги MIFAIR и команды чтения/записи сектора. Поскольку эти команды не соответствуют стандарту ISO, здесь ситуация становится более сложной и зависящей от читателя. На этом этапе действительно нужна протокольная документация и рабочий инструмент Mifare для вашего телефона. Наконец, большинство карт Mifare полностью не читаются, если вы, по крайней мере, не знаете один секторный ключ, а формат данных приложения является проприетарным (специфичным для эмитента карт), поэтому даже после всей этой работы он не гарантирует, что вы можете получить полезную информацию карта...
Ответ 3
Приложения Windows Phone 8 имеют доступ только к библиотекам очень высокого уровня и не могут читать теги, которые не отформатированы в формате NDEF.
Теги MIFARE UL должны использовать стандарт NFC Forum NDEF Type 2, который упрощен из-за небольшой 48-байтной пользовательской памяти тега.
Если у вас есть читатель/писатель низкого уровня, вы можете сделать свой UL-тег NDEF совместимым без изменения большинства ваших данных, но вам нужно жертвовать:
- все 4 байта OTP-памяти на стр. 3 (для контейнера возможностей NDEF)
- первые 6 байтов программируемой памяти пользователя (6, как минимум, могут потребоваться до 8 для чистоты заполнения первых двух страниц).
Тег отформатирован так: (ссылка - www.nfc-forum.org/specs/spec_list/#tagtypes)
- СТРАНИЦА 3, БАЙТЫ 0-3: СС [ВОЛШЕБНЫЙ НОМЕР, ВЕРСИЯ, РАЗМЕР ПОЛЬЗОВАТЕЛЯ, ЧТЕНИЕ/ПИСАТЬ]
- PAGE 4, BYTES 0-1: NDEF MESSAGE TLV HEADER [Тип, длина] (рекомендуют тип ExternalRtd)
- PAGE 4, BYTES 2-3: RECORD DESCRIPTOR (Включает строку, указывающую тип записи, предлагая сделать ее 1 байт для экономии места или 3 байта для аккуратного заполнения)
- СТРАНИЦА 5, БАЙТЫ 0-1 или 3: ОПИСАНИЕ ЗАПИСИ
- ОТДЫХ СТРАНИЦ/БАЙТОВ ЗАПИСЬ/ДАННЫЕ
ПРИМЕР: У тега есть тип сообщения ExternalRtd и тип записи "abc" (тип записи должен быть форматически "urn: nfc: ext: companyname.com: typename" полностью совместим с NDEF, но мы не можем позволяют использовать это много места)
[Номер страницы, № байта], Значение, Комментарий
- [3, 0], 0xE1, магическое число
- [3, 1], 0x10, номер версии NDEF, основная версия 1, младшая версия 0.
- [3, 2], 0x06, размер памяти пользователя тега /8. В этом случае 6, так как 6 * 8 = 48
- [3, 3], 0x00, чтение/запись разрешено. 0x00 = запись разрешена, 0x0F = только для чтения
- [4, 0], 0x03, T в TLV, тип. В этом случае сообщение NDEF.
- [4, 1], 0x2E, L в TLV, длина. В этом случае остальная часть тега, 46 байт.
- [4, 2], 0xD4, запись MB_ME_CF_SR_IL_TNF. В этом случае 11010100 (является первой записью, является последней записью, не является фрагментом, является коротким сообщением, без идентификатора в заголовке, имеет тип "Внешний тип" ).
- [4, 3], 0x03, Тип записи. В этом случае 3 (тип "abc" имеет длину 3)
- [5, 0], 0x28, длина полезной нагрузки, остальная часть тега. В этом случае 40.
- [5, 1], 0x61, Первый байт типа, 0x61 = 97 = 'a'
- [5, 2], 0x61, Второй байт типа, 0x62 = 98 = 'b'
-
[5, 3], 0x61, Третий байт типа, 0x63 = 99 = 'c'
-
Остальные 40 байтов тега, страницы с 6 по 11, являются вашей полезной нагрузкой.
Если вы просто хотите инициализировать тег, чтобы телефон мог его прочитать и сделать все остальное, просто напишите CC и только TLV с L нуля и без V. (4,0 = 0x03 и 4, 1 = 0x00).
Ответ 4
У меня была аналогичная проблема, я купил пакет тегов NFC на eBay, но они не были отформатированы в формате NDEF. WP8 может использовать только теги формата NDEF, поэтому мне пришлось найти способ их форматирования. Я нашел в Твиттере парня с телефоном Android с поддержкой NFC, и он отформатировал эти теги для меня.
Жаль, что Windows Phone 8 тоже не может этого сделать.
Вы можете проголосовать здесь на официальной странице WPdev Uservoice для низкоуровневой функции API NFC:
Предоставить низкоуровневый API NFC для форматирования NDEF и (un) блокировки