Разработка современного приложения с использованием NFC

Радиочастотная связь ближнего действия (NFC) — это набирающая популярность технология беспроводной связи малого радиуса действия. Требуемое расстояние составляет 2 сантиметра, поэтому люди могут соприкасаться своими устройствами для отправки и приема контента. При этом вы можете быстро выбрать нужный объект или человека. Такой способ не только быстр, но и прост в освоении. Не нужно читать руководство — достаточно один раз увидеть все своими глазами.

Например, представьте ситуацию, когда вы просматриваете фотографии вместе с подругой и она хочет получить некоторые из них. Благодаря технологии NFC вам достаточно прикоснуться устройством к ее компьютеру, чтобы начать отправку фотографий. Слишком просто? Возможно, но главная идея и заключается именно в простоте обмена контентом между устройствами.

'На изображении показан динамик Nokia 360, обменивающийся с устройством Windows Phone информацией о связывании по каналу Bluetooth

Рисунок 1. На изображении показан динамик Nokia 360, обменивающийся с устройством
Windows Phone информацией о связывании по каналу Bluetooth

Аналогично Bluetooth и Wi-Fi технология NFC представляет собой стандартный протокол беспроводной связи, определенный ассоциацией NFC Forum. Ваш компьютер должен быть оснащен радиопередатчиком NFC. Множество компьютеров с Windows 8 уже имеют встроенный радиопередатчик NFC. Если ваш компьютер еще не оборудован таким радиопередатчиком, вы можете приобрести аппаратные ключи NFC, подключаемые к компьютеру.

NFC предоставляет несколько замечательных возможностей. С помощью касания люди могут отправить фотографии, открыть меню и заказать блюдо в ресторане или даже выполнить связывание с устройством Bluetooth. Эти сценарии существенно отличаются друг от друга, однако их объединяет взаимодействие с помощью касания. NFC используется в различных устройствах, таких как компьютеры, телефоны, динамики, гарнитуры, беспроводные экраны и т. д., чтобы сделать соединение устройств простым и интуитивно понятным. Кроме того, NFC использует метки RFID — это дешевые и легкие пассивные антенны, которые могут содержать довольно большой объем данных и размещаться практически где угодно, чаще всего их помещают на плакаты и афиши. Например, для покупки билета в кинотеатр достаточно коснуться афиши фильма! Мы рассмотрим простейший пример с касанием метки NFC, чтобы продемонстрировать основные принципы API NFC.

Но сначала давайте подробнее разберемся с касанием устройствами.

Определение термина "касание"

Выполняете ли вы касание для связывания с мышью Bluetooth или для обмена фотографиями, важно соприкоснуться устройствами правильно. И хотя сама по себе идея касание хорошо знакома и понятна пользователям, касание компьютером другого устройства для большинства людей будет в новинку. Ниже приведены рекомендации по касанию, позволяющие пользователям определить следующее:

  1. Место для соприкосновения устройств — это место определяется с помощью сенсорной метки, также называемой визуальной меткой "Поднести и сделать", обозначающей место расположения антенны NFC. В зависимости от модели для касания используются разные части компьютера. Например, на планшете это может быть задняя панель, а на универсальном компьютере — передняя. Вот как выглядит метка на любом компьютере с Windows 8 с поддержкой NFC:

    Визуальная метка "Поднести и сделать"

    Рисунок 2. Визуальная метка "Поднести и сделать"

  2. Взаимодействие устройств друг с другом — во время касания пользователи должны быть уверены, что нужная операция выполняется, даже если они не могут увидеть передаваемые данные. Поэтому Windows воспроизводит звук, когда устройства находятся на достаточно близком расстоянии и обмениваются данными.

Все это осуществляется операционной системой Windows в автоматическом режиме и не требует выполнения каких-либо действий с вашей стороны. Дополнительную информацию об этих аспектах взаимодействия с пользователем можно найти в Спецификации по реализации радиочастотной связи ближнего действия в Windows 8. Учитывая все вышеизложенное, давайте рассмотрим несколько интересных сценариев использования NFC.

Когда использовать NFC

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

Ниже приведено несколько примеров использования NFC для выбора объектов в приложении. Вы можете коснуться и…

  • Получить информацию с афиши: метки NFC — легкие и недорогие метки RFID, их стоимость составляет около 0,15–1,00 долл. США (цена зависит от затрат на печать). Они похожи на QR-коды, однако проще и быстрее в использовании. Касание метки удобнее фотографирования штрихкода (для которого требуется еще и правильный угол съемки). Производители все чаще помещают метки на афиши и плакаты в многолюдных местах, таких как аэропорты, станции метро и автобусные остановки. Такие метки могут содержать от 48 байт до 4 килобайт данных. Вы можете запрограммировать метку на открытие определенной страницы приложения.
  • Обменяться контактными данными: вместо того, чтобы по буквам диктовать свои контактные данные другу и надеяться на отсутствие ошибок, коснитесь устройствами для обмена соответствующей информацией. По аналогии с предыдущим сценарием вы можете занести свою информацию на визитку/метку с поддержкой технологии NFC либо обменяться этой информацией напрямую через приложение.
  • Воспроизвести любимую музыкальную радиостанцию: собираетесь ли вы заняться спортом, садитесь в машину или просто отдыхаете дома, воспользуйтесь меткой NFC для прослушивания радиостанции. Вы даже можете запрограммировать разные радиостанции на разных метках, например использовать одну метку для спортзала, другую — для отдыха, третью — для сна.
  • Заказать ужин в популярном ресторане: заказ блюд в таком ресторане в вечерние часы может занять достаточно много времени. Вместо этого коснитесь метки на столе для заказа блюд.
  • Сыграть в многопользовательскую игру с другом: вы можете легко подключиться к многопользовательской игре, например "Морской бой", "Шахматы" или "Эрудит", вместе с другом, просто соприкоснувшись устройствами. После касания соединение поддерживается по внеполосному каналу с более широким диапазоном и более высокой пропускной способностью, например Bluetooth или Wi-Fi Direct.

Теперь мы имеем более-менее четкое представление о том, когда использовать NFC. Пришло время для по-настоящему интересной задачи — разработки приложения, использующего API-интерфейсы близкого взаимодействия (NFC) в Windows 8.

Как реализовать NFC

Как вы могли заметить, NFC упрощает выполнение множества повседневных задач для пользователей. Рассмотрим в качестве примера установку будильника. Я уверена, что практически каждый из нас несколько раз по ошибке устанавливал будильник на неправильное время. Когда за окнами уже ночь и вы хотите спать, не всегда удается сохранить концентрацию. NFC упрощает эту задачу, позволяя вам просто предварительно настроить метку, подтвердить операцию и спокойно лечь спать. Чтобы помочь пользователям с выполнением такой повседневной задачи, давайте представим, что вы разработали приложение будильника, позволяющее устанавливать сигнал с использованием метки NFC. Данную процедуру можно разделить на два сценария:

  1. Установка сигнала на метке: метки NFC могут использоваться многократно, поэтому приложение должно предоставлять пользователю возможность программирования сигнала. Например, пользователь может запрограммировать разные сигналы — один для рабочих дней, а другой для выходных. Эта процедура называется публикацией данных в метке.
  2. Установка сигнала из метки: после касания метки пользователем приложение должно подтвердить установку сигнала. Это означает, что приложение может запускаться с контекстом (аргументами).

API NFC предоставляет несколько способов добиться желаемого, но для данного сценария я бы воспользовалась самым простым из них.

Давайте рассмотрим процедуру установки сигнала на метке NFC:

  1. Дмитрий запускает приложение будильника и задает время, например "7:00". Ничего необычного и требующего использования NFC здесь нет.
  2. Дмитрий выбирает параметр "Установка сигнала на метке NFC". При этом приложение вызывает API-интерфейсы NFC для публикации информации, а именно строки идентификатора приложения и "07:00", на радиопередатчике NFC. Метки NFC используют стандартизированный формат сообщений под названием NDEF (NFC Defined Exchange Format). Вашему приложению не требуется самостоятельно преобразовывать данные в формат сообщения NDEF, поскольку за это отвечает операционная система Windows. Теперь пользователь может коснуться метки NFC.
  3. Дмитрий соприкасается меткой с компьютером, и приложение подтверждает программирование метки. После касания метки важно дать пользователям понять, что приложение успешно запрограммировало метку. Как было указано ранее, большинство людей незнакомо с принципом касания компьютера, поэтому такое подтверждение придает пользователю уверенности в выполнении нужной операции. Приложение "узнает" об успешной передаче сообщения благодаря регистрации обработчика переданных сообщений.

API-интерфейсы NFC расположены в пространстве имен Windows.Networking.Proximity. Они вступают в игру на втором этапе, то есть после того, как пользователь выберет параметр "Установка сигнала на метке NFC". Сначала приложение инициализирует объект близкого взаимодействия. Он используется для определения появления метки (или устройства) в пределах радиуса действия или выхода за его пределы. Затем мы добавляем обработчик событий DeviceArrival. Этот обработчик распознает момент касания метки, после чего мы можем начинать запись информации в метку. Полезно сообщить пользователям о выполнении записи в метку, чтобы они не перемещали устройство из радиуса действия. Вы можете использовать это же событие для распознавания момента касания любого устройства с поддержкой близкого взаимодействия.

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

JavaScript

 var proximityDevice;

function initializeProximityDevice() {
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();

    if (proximityDevice) {
        proximityDevice.addEventListener("devicearrived", proximityDeviceArrived);
       
}
   else {
        // No NFC radio on the PC, display an error message
    }


function proximityDeviceArrived(device) {
        // Let the user know we’re ‘Writing to Tag’

}
}

C#

 private void InitializeProximityDevice()
{

Windows.Networking.Proximity.ProximityDevice proximityDevice;
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

    if (proximityDevice != null) {
        proximityDevice.DeviceArrived += ProximityDeviceArrived;
    
    }
    else
    {
        // No NFC radio on the PC, display an error message
    }
}

private void ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)
{
            // Let the user know we’re ‘Writing to Tag’

}

Затем мы публикуем информацию в метке. Приложение публикует два элемента: строку идентификатора приложения, состоящую из идентификатора и платформы приложения, и аргументы запуска. Для Windows 8 идентификатор приложения — <имя семейства пакета>!<идентификатор приложения>, а платформа приложения — "Windows". Вам следует скопировать значение идентификатора приложения из атрибута ID элемента Application в манифесте пакета приложения. Аргументом запуска является "07:00", то есть установленный пользователем сигнал. Давайте назовем все это сообщением.

Если приложение предназначено для работы на нескольких платформах, Windows позволяет опубликовать альтернативные значения идентификатора и платформы приложения. То есть вы можете касаться той же метки на другом устройстве, поддерживающем NFC, например на устройстве под управлением Windows Phone 8. Дополнительную информацию об альтернативных идентификаторах можно найти на сайте MSDN.

Приложение публикует данные в метку с помощью метода publishBinaryMessage. Этот метод принимает три параметра — messageType, message и функцию messageTransmittedHandler. Мы установим для messageType значение "LaunchApp:WriteTag", чтобы сообщить Windows о том, что приложению требуется записать информацию в метку NFC. Параметр message — это то сообщение, которое мы определили ранее (строка идентификатора приложения и аргументы запуска); нам потребуется хранить его в двоичном виде в буфере. Функция messageTransmittedHandler регистрируется для обратных вызовов. Это позволяет приложению узнать об успешной записи сообщения в метку. Мы будем это использовать, чтобы сообщить пользователю две вещи: мы успешно записали сообщение в метку, и метку можно больше не удерживать в пределах радиуса действия.

Сообщения публикуются до тех пор, пока мы не вызовем функцию StopPublishingMessage или не будет освобожден объект ProximityDevice. В данном примере мы будем использовать функцию останова. PublishBinaryMessage возвращает идентификатор публикации, этот же идентификатор публикации используется для остановки публикации сообщения на радиопередатчике NFC.

В следующем фрагменте кода показано, как записать данные в метку NFC:

JavaScript

 var proximityDevice;

function getAlarmTime(){

    // Grab time set by the user, call this variable ‘Alarm’
    return Alarm;

}

function publishLaunchApp() {
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

if (proximityDevice) {
        // The format of the app launch string is: "<args>\tWindows\t<AppName>".
        // The string is tab or null delimited.

        // The <args> string can be an empty string ("").
        var launchArgs = getAlarmTime();

        // The format of the AppName is: PackageFamilyName!PRAID.
        var praid = "AlarmApp"; // The Application Id value from your package.appxmanifest.

        var appName = Windows.ApplicationModel.Package.current.id.familyName + "!" + praid;

        var launchAppMessage = launchArgs + "\tWindows\t" + appName;

        var dataWriter = new Windows.Storage.Streams.DataWriter();
        dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf16LE;
        dataWriter.writeString(launchAppMessage);
        var launchAppPubId =
             proximityDevice.publishBinaryMessage(
                 "LaunchApp:WriteTag", 
                 dataWriter.detachBuffer(), 
                 proximityWriteTagLaunchAppMessageTransmitCallback);
        
    if (launchAppPubId != -1) {
            // Stop publishing the message on NFC radio
        proximityDevice.stopPublishingMessage(launchAppPubId);
    }

     }
}

function proximityWriteTagLaunchAppMessageTransmitCallback() {
    // Inform the user that: the message has been successfully written to a tag & the tag no longer needs to be in range
}

C#

 Windows.Networking.Proximity.ProximityDevice proximityDevice;

private string GetAlarmTime(){

    // Grab time set by the user, call this variable ‘Alarm’
    return Alarm;
}

private void PublishLaunchApp()
{
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

if (proximityDevice != null)
    {
        // The format of the app launch string is: "<args>\tWindows\t<AppName>".
        // The string is tab or null delimited.

        // The <args> string can be an empty string ("").
        string launchArgs = getAlarmTime();

        // The format of the AppName is: PackageFamilyName!PRAID.
        string praid = "MyAppId"; // The Application Id value from your package.appxmanifest.

        string appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + "!" + praid;

        string launchAppMessage = launchArgs + "\tWindows\t" + appName;

        var dataWriter = new Windows.Storage.Streams.DataWriter();
        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
        dataWriter.WriteString(launchAppMessage);
        var launchAppPubId =
        proximityDevice.PublishBinaryMessage(
            "LaunchApp:WriteTag", dataWriter.DetachBuffer(), 
            proximityWriteTagLaunchAppMessageTransmitCallback);
    
    if (launchAppPubId!= -1)
    {
        proximityDevice.StopPublishingMessage(launchAppPubId);
    // Stop publishing the message on NFC radio
    }

    }
}

private void proximityWriteTagLaunchAppMessageTransmitCallback(
    Windows.Networking.Proximity.ProximityDevice sender,
    long messageId)
{
        // Inform the user that: the message has been successfully written to a tag & the tag no longer needs to be in range
}

Вот и все! Теперь вы знаете, как выполнить запись в метку NFC из приложения Магазина Windows. Здесь нет никаких сложностей, поэтому давайте перейдем к следующему сценарию — установке сигнала из метки. Рассмотрим процедуру считывания сигнала из метки NFC:

  1. Дмитрий просматривает информацию на домашнем экране (составляет сообщение электронной почты, играет в игру или использует Windows) и понимает, что ему нужно установить сигнал будильника на утро понедельника. Он берет метку "Сигнал для рабочего дня" и касается ей своего компьютера. Отображается всплывающее уведомление, предлагающее запустить ваше приложение будильника. До этого момента всю работу выполняет Windows, ваше приложение бездействует.
  2. Дмитрий соглашается, и ваше приложение открывает экран "Подтвердить сигнал?" со временем "7:00". После принятия всплывающего уведомление Дмитрием Windows передает аргументы запуска (которые были описаны выше) в ваше приложение во время активации. Это называется контекстным запуском и соответствует запуску приложения, открытого на определенной странице.
  3. Дмитрий устанавливает сигнал. Ничего необычного и требующего использования NFC здесь нет.

Получение аргументов запуска из метки NFC не вызывает никаких трудностей. Приложению требуется обработать контекстный запуск из метки NFC. Контекстный запуск аналогичен запуску приложения, открытого на определенной странице. Наши аргументы запуска задают сигнал "7:00" и используются приложением для отображения предлагаемого сигнала. Кроме того, если ваше приложение не установлено на компьютере, Windows предлагает Дмитрию установить его из Магазина Windows в автоматическом режиме.

В следующем фрагменте кода показано, как реализовать контекстный запуск.

JavaScript

 app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket") {
            //do nothing here.
        }
        else {
    // Use args.detail.arguments to parse out ’07.00’ string, and display to the user
        }

        args.setPromise(WinJS.UI.processAll());
    }
}

C#

 async protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            if (args.Arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket")
            {
                _isLaunchedByTap = true;
            }
            else
            {
// Use args.Arguments to parse out ’07.00’ string, and display to the user

            }
            Window.Current.Activate();
        }

Вот и все, что требуется от вашего приложения для поддержки чтения и записи метки NFC. Довольно просто для передовых технологий, не так ли? В завершение статьи рассмотрим еще один важный аспект — обработку ошибок.

Обработка ошибок

Существует несколько распространенных ошибок, с которыми может столкнуться ваше приложение.

  • Метка, к которой совершено касание, имеет формат, отличный от NDEF. Windows 8 не поддерживает автоматическое переформатирование метки в NDEF, поэтому вам требуется загрузить и установить модуль форматирования NDEF.
  • Метка, к которой совершено касание, доступна только для чтения. Некоторые метки NFC могут быть заблокированы и доступны только для чтения (аналогично старым видеокассетам VHS).
  • Метка, к которой совершено касание, слишком мала и не может вместить все данные.
  • Компьютер пользователя не оснащен средствами NFC. Как я уже упоминала в начале, NFC — это развивающаяся технология, время повсеместного внедрения которой еще не настало. Чтобы проверить, поддерживает ли компьютер близкое взаимодействие, воспользуйтесь методом ProximityDevice.getDefault(), который возвращает значение NULL, когда установленные радиопередатчики NFC отсутствуют.

Это интересно и интуитивно понятно!

Технология NFC прошла этап разработки и готова для массового потребителя, а Windows имеет экосистему и хорошо проработанный комплексный пользовательский интерфейс. Эта технология обладает огромным потенциалом по привнесению элемента интерактивности во взаимодействие устройств и приложений с пользователем. Все это очень интересно и интуитивно понятно.

NFC объединяет в себе множество различных аспектов, поэтому следите за новыми публикациями о других возможностях NFC в Windows 8 для разработчиков.

Дополнительную информацию по NFC и близкому взаимодействию можно найти в приведенных ниже ресурсах.

Ресурсы

Ссылка

Типы

Руководство по разработке с использованием возможностей близкого взаимодействия

Документ

API-интерфейсы близкого взаимодействия

Документ

Тестирование и диагностика приложений с поддержкой близкого взаимодействия

Документ

Публикация и подписка (с дополнительными подробностями)

Документ

Пример приложения с использованием близкого взаимодействия

Пример

Есть вопросы по близкому взаимодействию? Задайте их здесь

Форум

Спасибо за внимание!

Прия Дандавейт (Priya Dandawate)

Руководитель программы, устройства и сетевые возможности

Соавторы: Макс Моррис (Max Morris), Марзена Макута (Marzena Makuta), Майк Лохорт (Mike Loholt), Джейк Сабульски (Jake Sabulsky) и Вишал Матре (Vishal Mhatre)