Статьи

Работа со статическими NFC-картами на Windows Phone 8


С выпуском Windows Phone 8 разработчики могут создавать приложения, использующие преимущества датчика близости (NFC — Near Field Communications).
Эта возможность позволяет использовать различные сценарии совместного использования, как с другими устройствами (не обязательно Windows Phone), так и с другими статическими элементами, такими как карты NFC, которые будут в центре внимания этой части.

ПРИМЕЧАНИЕ. Чтобы следовать этой статье, вам потребуется физическое устройство Windows Phone 8. Также убедитесь, что на устройстве включена функция Tap + Send.

Прежде всего, создайте новый проект Windows Phone 8 в Visual Studio 2012. Базовым классом, который работает с данными, передаваемыми через датчик приближения, является ProximityDevice . Поскольку по понятным причинам имеется только одно устройство NFC, подключенное к существующему оборудованию, разработчик должен получить доступ к текущему экземпляру.

Убедитесь в том , чтобы объявить ID_CAP_PROXIMITY возможности в WMAppManifest.xml :

Для этого вызывается GetDefault :

ProximityDevice device = ProximityDevice.GetDefault();

if (device != null)
{

}

Вы можете спросить — если это приложение для Windows Phone 8, почему я все еще должен проверить, является ли устройство нулевым? Сценарии в этом случае могут отличаться — например, поставщик может быть недоступен или отключен.

Прежде всего, давайте предположим, что вы хотите записать что-то на карту NFC. Для этого вам нужно использовать   класс DataWriter в сочетании с PublishBinaryMessage   — методом, предоставляемым через доступного в настоящее время поставщика NFC.

Фрагмент, подобный этому, запишет строку на карту:

DataWriter writer = new DataWriter();
writer.WriteString("Test Message");

device.PublishBinaryMessage("Windows:WriteTag.NFCTest", writer.DetachBuffer(), new MessageTransmittedHandler((pDevice, id) =>
    {
        Debug.WriteLine("Message sent.");
    }));

На этом этапе, если вы запустите приложение и коснитесь совместимого тега NFC на телефоне, сообщение будет записано в него. Это довольно простая настройка, но есть кое-что, на что вы должны обратить внимание. Когда вызывается PublishBinaryMessage , первый аргумент, который передается функции, представляет протокол и подтип (подробнее здесь ).

Windows: WriteTag означает, что есть двоичное сообщение, которое должно быть записано. Подтип (в данном случае NFCTest ) указывается разработчиком и связывает тег с приложением.

Чтобы прочитать сообщение из тега, вам нужно использовать SubscribeForMessage :

device.SubscribeForMessage("Windows.NFCTest", new MessageReceivedHandler((proxDevice, message) =>
    {
        Debug.WriteLine(message.DataAsString);
    }));

Обратите внимание, что вы все еще ссылаетесь на протокол Windows (для двоичных данных) и подтип NFCTest. Если карта содержит подтип, который не связан с вашим приложением, она будет проигнорирована. Если сообщение прочитано, у вас будет доступ к   экземпляру ProximityMessage .

Простое текстовое сообщение может быть полезным, в зависимости от приложения, но вы можете сделать гораздо больше. Например, вы также можете написать URL-адрес карты, которая откроет любую веб-страницу на телефоне:

DataWriter writer = new DataWriter();
writer.UnicodeEncoding = UnicodeEncoding.Utf16LE;
writer.WriteString("http://bing.com");

device.PublishBinaryMessage("WindowsUri:WriteTag", writer.DetachBuffer(), new MessageTransmittedHandler((pDevice, id) =>
    {
        Debug.WriteLine("Message sent.");
    }));

Вам необходимо явно указать здесь кодировку UTF16-LE . Если кодировка не указана, URL не будет записан в тег. Записанный URL-адрес будет доступен для всей системы, что означает, что если пользователь нажмет на тег, он получит приглашение открыть браузер.

Вы также можете написать URI, которые связаны с определенными стандартными или сторонними приложениями Windows Phone 8. Например, вы можете легко написать эти ссылки на схемы URI:

  1. мс-настройка-Bluetooth:
  2. mailto: [ адрес электронной почты ]
  3. мс-настройка-счет:
  4. мс-настройка-Fi:

Для более подробного списка, вы можете посетить эту страницу MSDN .

Вы также можете записать в тег пользовательский контент, например картинку. Например, вот фрагмент для записи изображения JPEG на карту Nokia NFC:

Uri uri = new Uri("/test.jpg", UriKind.Relative);
BitmapImage image = new BitmapImage(uri);
imgTest.Source = image;

DataWriter writer = new DataWriter();

WriteableBitmap bitmap = new WriteableBitmap(image);
int[] data = bitmap.Pixels;
int length = data.Length * 4;
byte[] result = new byte[length];
System.Buffer.BlockCopy(data, 0, result, 0, length);

writer.WriteBytes(result);

device.PublishBinaryMessage("WindowsMime:WriteTag.image/jpeg", writer.DetachBuffer(), new MessageTransmittedHandler((pDevice, id) =>
    {
        Debug.WriteLine("Message sent.");
    }));

Стоит отметить, что на данный момент вам нужно быть очень осторожным с объемом информации, которую вы пытаетесь записать в тег. Вы можете вызвать device.MaxMessageBytes,   чтобы узнать лимит отправки, но есть ограничение размера тега.

Что произойдет, если вы попытаетесь отправить фотографию слишком большого размера тегу, который не может ее сохранить? MessageTransmittedHandler никогда не будет срабатывать, но вы также не получите сообщение об ошибке .