Создание приложения для смарт-карты NFCCreate an NFC Smart Card app

Важно!

Этот раздел относится только к Windows 10 Mobile.This topic applies to Windows 10 Mobile only.

ОС Windows Phone 8.1 поддерживала приложения эмуляции для карты NFC с помощью защищенного элемента на основе SIM-карты, но для этой модели требовалось, чтобы приложения для безопасной оплаты были тесно связаны с операторами мобильных сетей (ОМС).Windows Phone 8.1 supported NFC card emulation apps using a SIM-based secure element, but that model required secure payment apps to be tightly coupled with mobile-network operators (MNO). Это ограничивало выбор возможных способов оплаты для продавцов и разработчиков, не связанных с ОМС.This limited the variety of possible payment solutions by other merchants or developers that are not coupled with MNOs. В Windows 10 Mobile мы внедрили новую технологию эмуляции карты под названием HCE (Host Card Emulation).In Windows 10 Mobile, we have introduced a new card emulation technology called, Host Card Emulation (HCE). Технология HCE позволяет вашему приложению устанавливать прямую связь с устройством чтения карт NFC.HCE technology allows your app to directly communicate with an NFC card reader. В этом разделе показано, как технология HCE работает на устройствах под управлением Windows 10 Mobile и как разработать приложение с поддержкой HCE, чтобы клиенты могли получать доступ к вашим службам с помощью телефона вместо физической карты и без обязательной связи с ОМС.This topic illustrates how Host Card Emulation (HCE) works on Windows 10 Mobile devices and how you can develop an HCE app so that your customers can access your services through their phone instead of a physical card without collaborating with an MNO.

Необходимые условия для разработки приложения с поддержкой HCEWhat you need to develop an HCE app

Для разработки приложения эмуляции карты на основе HCE для Windows 10 Mobile нужно настроить среду разработки.To develop an HCE-based card emulation app for Windows 10 Mobile, you will need to get your development environment setup. Выполнить настройку можно, установив программное обеспечение Microsoft Visual Studio 2015. В нем содержатся средства разработчика Windows и эмулятор Windows 10 Mobile с поддержкой эмуляции NFC.You can get set up by installing Microsoft Visual Studio 2015, which includes the Windows developer tools and the Windows 10 Mobile emulator with NFC emulation support. Подробнее о настройке см. в разделе НастройкаFor more information about getting setup, see, Get set up

Если же вы хотите выполнить тестирование на реальном устройстве под управлением Windows 10 Mobile, а не с помощью включенного в ПО эмулятора Windows 10 Mobile, вам также потребуются следующие элементы.Optionally, if you want to test with a real Windows 10 Mobile device instead of the included Windows 10 Mobile emulator, you will also need the following items.

  • Устройство под управлением Windows 10 Mobile с поддержкой HCE NFC.A Windows 10 Mobile device with NFC HCE support. В настоящее время приложения для NFC на основе HCE поддерживаются на телефонах Lumia 730, 830, 640 и 640 XL.Currently, the Lumia 730, 830, 640, and the 640 XL have the hardware to support NFC HCE apps.
  • Терминал устройства считывания, поддерживающий протоколы ISO/IEC 14443-4 и ISO/IEC 7816-4A reader terminal that supports protocols ISO/IEC 14443-4 and ISO/IEC 7816-4

В Windows 10 Mobile реализована служба HCE, предоставляющая следующие функциональные возможности.Windows 10 Mobile implements an HCE service that provides the following functionalities.

  • Приложения могут регистрировать идентификаторы приложений (AID) для карт, которые они собираются эмулировать.Apps can register the applet identifiers (AIDs) for the cards they would like to emulate.
  • Устранение конфликтов и маршрутизация команды и ответа APDU связываются с одним из зарегистрированных приложений, исходя из выбора внешней карты устройства считывания и настройки пользователя.Conflict resolution and routing of the Application Protocol Data Unit (APDU) command and response pairs to one of the registered apps based on the external reader card selection and user preference.
  • Обработка событий и уведомлений приложений как результата действий пользователя.Handling of events and notifications to the apps as a result of user actions.

Windows 10 поддерживает эмуляцию смарт-карт, основанных на протоколе ISO-DEP (ISO-IEC 14443-4), и передает данные с помощью APDU согласно определению в спецификации протокола ISO-IEC 7816-4.Windows 10 supports emulation of smart cards that are based on ISO-DEP (ISO-IEC 14443-4) and communicates using APDUs as defined in the ISO-IEC 7816-4 specification. Windows 10 поддерживает технологию ISO/IEC 14443-4 типа A для приложений с HCE.Windows 10 supports ISO/IEC 14443-4 Type A technology for HCE apps. Технологии типов B и F, а также технологии, отличные от ISO-DEP (например, MIFARE), по умолчанию направляются на SIM-карту.Type B, type F, and non-ISO-DEP (eg MIFARE) technologies are routed to the SIM by default.

Функция эмуляции карты работает только на устройствах под управлением Windows 10 Mobile.Only Windows 10 Mobile devices are enabled with the card emulation feature. Эмуляция карты на основе SIM-карты и HCE недоступна в других версиях Windows 10.SIM-based and HCE-based card emulation is not available on other versions of Windows 10.

Архитектура для эмуляции карты на основе SIM-карты и HCE показана на схеме ниже.The architecture for HCE and SIM based card emulation support is shown in the diagram below.

Архитектура для эмуляции карты на основе SIM-карты и HCE

Выбор приложения и маршрутизация AIDApp selection and AID routing

Для разработки приложения с HCE необходимо понимать, как устройства под управлением Windows 10 Mobile перенаправляют AID конкретному приложению, так как пользователи могут устанавливать много разных приложений с HCE.To develop an HCE app, you must understand how Windows 10 Mobile devices route AIDs to a specific app because users can install multiple different HCE apps. Каждое приложение может регистрировать несколько карт на основе HCE и SIM-карты.Each app can register multiple HCE and SIM-based cards. Традиционные приложения для Windows Phone 8.1, основанные на SIM-карте, будут и дальше работать в Windows 10 Mobile при условии, что пользователь выберет параметр "SIM-карта" в качестве карты для оплаты по умолчанию в меню "Параметры NFC".Legacy Windows Phone 8.1 apps that are SIM-based will continue to work on Windows 10 Mobile as long as the user chooses the "SIM Card" option as their default payment card in the NFC Setting menu. Этот параметр устанавливается по умолчанию во время первого включения устройства.This is set by default when turning the device on for the first time.

Когда пользователь коснется терминала своим устройством под управлением Windows 10 Mobile, данные будут автоматически перенаправлены соответствующему приложению, установленному на устройстве.When the user taps their Windows 10 Mobile device to a terminal, the data is automatically routed to the proper app installed on the device. Эта маршрутизация основана на идентификаторах приложения (AID), состоящих из 5–16 байт.This routing is based on the applet IDs (AIDs) which are 5-16 byte identifiers. Во время касания внешний терминал передает команду SELECT APDU, чтобы указать идентификатор AID, на который следует перенаправлять все последующие команды APDU.During a tap, the external terminal will transmit a SELECT command APDU to specify the AID it would like all subsequent APDU commands to be routed to. Последующие команды SELECT снова изменят маршрутизацию.Subsequent SELECT commands, will change the routing again. Исходя из идентификаторов AID, зарегистрированных приложениями, и параметров пользователя, трафик APDU перенаправляется на конкретное приложение, которое будет направлять ответ APDU.Based on the AIDs registered by apps and user settings, the APDU traffic is routed to a specific app, which will send a response APDU. Следует помнить о том, что терминал может связываться с несколькими разными приложениями во время одного касания.Be aware that a terminal may want to communicate with several different apps during the same tap. Поэтому необходимо обеспечить скорейший выход фоновой задачи приложения во время деактивации, чтобы освободить пространство для фоновой задачи другого приложения для ответа APDU.So you must ensure your app's background task exits as quickly as possible when deactivated to make room for another app's background task to respond to the APDU. Фоновые задачи описаны далее в этом разделе.We will discuss background tasks later in this topic.

Чтобы получить APDU для идентификатора AID, приложения с HCE должны самостоятельно зарегистрироваться с определенными идентификаторами AID, которые они могут обработать.HCE apps must register themselves with particular AIDs they can handle so they will receive APDUs for an AID. Приложения декларируют идентификаторы AID с помощью групп AID.Apps decalre AIDs by using AID groups. Группа AID концептуально эквивалентна отдельной физической карте.An AID group is conceptually equivalent to an individual physical card. Например, одна кредитная карта декларируется с помощью группы AID, а вторая кредитная карта из другого банка декларируется с помощью другой, второй группы AID, при этом обе карты могут иметь один и тот же AID.For example, one credit card is declared with an AID group and a second credit card from a different bank is declared with a different, second AID group, even though both of them may have the same AID.

Устранение конфликтов для групп AID оплатыConflict resolution for payment AID groups

Когда приложение регистрирует физические карты (группы AID), оно может задекларировать категорию группы AID как "Оплата" или "Другая".When an app registers physical cards (AID groups), it can declare the AID group category as either "Payment" or "Other." Одновременно могут существовать несколько групп AID оплаты, зарегистрированных в какой-либо момент времени, однако только для одной из этих групп может быть одновременно включена функция оплаты касанием. Этот выбор определяет пользователь.While there can be multiple payment AID groups registered at any given time, only one of these payment AID groups may be enabled for Tap and Pay at a time, which is selected by the user. Такое поведение обусловлено тем, что пользователь желает контролировать ситуацию, сознательно выбирая для использования один платеж, одну кредитную или дебетную карту, чтобы не платить другой непредусмотренной картой во время касания устройством терминала.This behavior exists because the user expects be in control of consciously choosing a single payment, credit, or debit card to use so they don't pay with a different unintended card when tapping their device to a terminal.

Однако при этом одновременно могут быть включены несколько групп AID, зарегистрированных как «Другая», без взаимодействия с пользователем.However, multiple AID groups registered as "Other" can be enabled at the same time without user interaction. Такое поведение обусловлено тем, что другие типы карт, в частности скидочные карты, купоны или проездные карты, должны просто работать без лишних действий или подсказок во время касания телефона.This behavior exists because other types of cards like loyalty, coupons, or transit are expected to just work without any effort or prompting whenever they tap their phone.

Все группы AID, зарегистрированные как "Оплата", отображаются в списке карт на странице параметров NFC, на которой пользователь может выбрать карту для оплаты по умолчанию.All the AID groups that are registered as "Payment" appear in the list of cards in the NFC Settings page, where the user can select their default payment card. Если карта для оплаты по умолчанию выбрана, приложение, которое зарегистрировало эту группу AID оплаты, станет приложением для оплаты по умолчанию.When a default payment card is selected, the app that registered this payment AID group becomes the default payment app. Приложения для оплаты по умолчанию могут включать или отключать любые из своих групп AID без взаимодействия с пользователем.Default payment apps can enable or disable any of their AID groups without user interaction. Если пользователь отклонит запрос относительно приложения для оплаты по умолчанию, текущее приложение для оплаты по умолчанию (если имеется) останется приложением по умолчанию.If the user declines the default payment app prompt, then the current default payment app (if any) continues to remain as default. На следующем снимке экрана показана страница параметров NFC.The following screenshot shows the NFC Settings page.

Снимок экрана со страницей параметров NFC

В этом примере (на снимке экрана выше) в случае изменения пользователем карты для оплаты по умолчанию на карту, которая не зарегистрирована приложением "HCE Application 1", система создаст запрос подтверждения согласия пользователя.Using the example screenshot above, if the user changes his default payment card to another card that is not registered by "HCE Application 1," the system creates a confirmation prompt for the user’s consent. Если же пользователь изменит свою карту для оплаты по умолчанию на карту, которая зарегистрирована приложением "HCE Application 1", система не создаст запрос подтверждения для пользователя, так как "HCE Application 1" уже является приложением для оплаты по умолчанию.However, if the user changes his default payment card to another card that is registered by "HCE Application 1," the system does not create a confirmation prompt for the user, because "HCE Application1" is already the default payment app.

Устранение конфликтов для групп AID, не предназначенных для оплатыConflict resolution for non-payment AID groups

Карты, не предназначенные для оплаты, отнесенные к категории "Другая", не отображаются на странице параметров NFC.Non-payment cards categorized as "Other" do not appear in the NFC settings page.

Ваше приложение может создавать, регистрировать и включать группы AID, не предназначенные для оплаты, так же, как и группы оплаты AID.Your app can create, register and enable non-payment AID groups in the same manner as payment AID groups. Основное отличие состоит в том, что для групп AID, не предназначенных для оплаты, категория эмуляции имеет значение "Другая", а не "Оплата".The main difference is that for non-payment AID groups the emulation category is set to "Other" as opposed to "Payment". После регистрации группы AID в системе необходимо включить группу AID для получения трафика NFC.After registering the AID group with the system, you need to enable the AID group to receive NFC traffic. При попытке включить группу AID, не предназначенную для оплаты, для получения трафика получатель не получает запрос подтверждения, если отсутствует конфликт с каким-либо AID, который уже зарегистрирован в системе другим приложением.When you try to enable a non-payment AID group to receive traffic, the user is not prompted for a confirmation unless there is a conflict with one of the AIDs already registered in the system by a different app. При наличии конфликта пользователь получит запрос со сведениями о том, какая карта и связанное с ней приложение будут отключены, если пользователь решит включить вновь зарегистрированную группу AID.If there is a conflict, the user will be prompted with information about which card and it's associated app will be disabled if the user chooses to enable the newly registered AID group.

Сосуществование с приложениями NFC основе SIM-картыCoexistence with SIM based NFC applications

В Windows 10 Mobile система настраивает таблицу маршрутизации контроллера NFC, которая используется для принятия решений относительно маршрутизации на уровне контроллера.In Windows 10 Mobile, the system sets up the NFC controller routing table that is used to make routing decisions at the controller layer. Эта таблица содержит сведения о маршрутизации для перечисленных ниже элементов.The table contains routing information for the following items.

  • Отдельные маршруты AID.Individual AID routes.
  • Маршрут на основе протокола (ISO-DEP).Protocol based route (ISO-DEP).
  • Маршрутизация на основе технологий (NFC-A/B/F).Technology based routing (NFC-A/B/F).

Если внешнее устройство считывания отправляет команду "SELECT AID", контроллер NFC сначала проверяет маршруты AID в таблице маршрутизации на наличие совпадений.When an external reader sends a "SELECT AID" command, the NFC controller first checks AID routes in the routing table for a match. При отсутствии совпадений будет использоваться маршрут на основе протокола как маршрут по умолчанию для трафика ISO-DEP (14443-4-A).If there is no match, it will use the protocol-based route as the default route for ISO-DEP (14443-4-A) traffic. Для любого другого трафика, отличного от ISO-DEP, будет использоваться маршрутизация на основе технологий.For any other non-ISO-DEP traffic it will use the technology based routing.

В Windows 10 Mobile на странице параметров NFC есть параметр меню "SIM-карта", позволяющий продолжить использование традиционных приложений для Windows Phone 8.1 на основе SIM-карты, которые не регистрируют свои AID в системе.Windows 10 Mobile provides a menu option "SIM Card" in the NFC Settings page to continue to use legacy Windows Phone 8.1 SIM-based apps, which do not register their AIDs with the system. Если пользователь выберет параметр "SIM-карта" в качестве карты для оплаты по умолчанию, маршрут ISO-DEP получит значение UICC. В случае всех остальных вариантов выбора в раскрывающемся меню маршрут ISO-DEP будет указывать на узел.If the user selects "SIM card" as their default payment card, then the ISO-DEP route is set to UICC, for all other selections in the drop-down menu the ISO-DEP route is to the host.

Маршрут ISO-DEP получает значение "SIM-карта" для устройств с SIM-картой с поддержкой SE, когда устройство загружается впервые с Windows 10 Mobile.The ISO-DEP route is set to "SIM Card" for devices that have an SE enabled SIM card when the device is booted for the first time with Windows 10 Mobile. Если пользователь установит приложение, поддерживающее HCE, и это приложение включит какие-либо регистрации группы AID с HCE, маршрут ISO-DEP будет указывать на узел.When the user installs an HCE enabled app and that app enables any HCE AID group registrations, the ISO-DEP route will be pointed to the host. Новым приложениям на основе SIM-карты необходимо зарегистрировать идентификаторы AID на SIM-карте, чтобы в таблицу маршрутизации контроллера были включены конкретные маршруты AID.New SIM-based applications need to register the AIDs in the SIM in order for the specific AID routes to be populated in the controller routing table.

Создание приложения на основе HCECreating an HCE based app

Приложение с HCE состоит из двух частей.Your HCE app has two parts.

  • Главное приложение переднего плана для взаимодействия с пользователем.The main foreground app for the user interaction.
  • Фоновая задача, которая вызывается системой для обработки APDU для данного AID.A background task that is triggered by the system to process APDUs for a given AID.

Из-за слишком строгих требований к производительности для загрузки вашей фоновой задачи в ответ на касание NFC рекомендуется, чтобы вся фоновая задача была реализована в собственном коде C++/CX (включая все зависимости, ссылки или библиотеки, от которых вы зависите), а не в C# или управляемом коде.Because of the extremely tight performance requirements for loading your background task in response to an NFC tap, we recommend that your entire background task be implementing in C++/CX native code (including any dependencies, references, or libraries you depend on) rather than C# or managed code. Хотя C# и управляемый код обычно работают хорошо, существует дополнительная нагрузка, в частности загрузка .NET CLR, которой можно избежать вписав ее в C++/CX.While C# and managed code normally performs well, there is overhead, like loading the .NET CLR, that can be avoided by writing it in C++/CX.

Создание и регистрация фоновой задачиCreate and register your background task

Вам необходимо создать фоновую задачу в своем приложении с HCE для обработки и ответа на объекты APDU, направленные системой.You need to create a background task in your HCE app for processing and responding to APDUs routed to it by the system. При первом запуске приложения передний план регистрирует фоновую задачу HCE, в которой реализован интерфейс IBackgroundTaskRegistration, как показано в следующем коде.During the first time your app is launched, the foreground registers an HCE background task that implements the IBackgroundTaskRegistration interface as shown in the following code.

var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorHostApplicationActivated));
bgTask = taskBuilder.Register();

Обратите внимание, что для триггера задачи устанавливается значение SmartCardTriggerType.Notice that the task trigger is set to SmartCardTriggerType. EmulatorHostApplicationActivated.EmulatorHostApplicationActivated. Это означает, что при получении команды SELECT AID объекта APDU операционной системой, разрешаемой в ваше приложение, будет запущена ваша фоновая задача.This means that whenever a SELECT AID command APDU is received by the OS resolving to your app, your background task will be launched.

Получение APDU и ответ на нихReceive and respond to APDUs

При наличии APDU, нацеленного на ваше приложение, система запустит вашу фоновую задачу.When there is an APDU targeted for your app, the system will launch your background task. Ваша фоновая задача получает объект APDU, проходящий через свойство CommandApdu объекта SmartCardEmulatorApduReceivedEventArgs, и отвечает на APDU с помощью метода TryRespondAsync того же объекта.Your background task receives the APDU passed through the SmartCardEmulatorApduReceivedEventArgs object’s CommandApdu property and responds to the APDU using the TryRespondAsync method of the same object. Возможно, вашу фоновую задачу следует приберечь для легких операций в целях повышения производительности.Consider keeping your background task for light operations for performance reasons. Например, чтобы отвечать на APDU немедленно и закрывать фоновую задачу после завершения обработки.For example, respond to the APDUs immediately and exit your background task when all processing is complete. Из-за характера транзакций NFC пользователи все чаще удерживают свое устройство возле устройства для считывания в течение очень короткого периода времени.Due to the nature of NFC transactions, users tend to hold their device against the reader for only a very short amount of time. Фоновая задача будет по-прежнему принимать трафик от устройства для считывания, пока ваше подключение не будет остановлено. В таком случае вы получите объект SmartCardEmulatorConnectionDeactivatedEventArgs.Your background task will continue to receive traffic from the reader until your connection is deactivated, in which case you will receive a SmartCardEmulatorConnectionDeactivatedEventArgs object. Подключение может быть остановлено по причинам, указанным в свойстве SmartCardEmulatorConnectionDeactivatedEventArgs.Reason.Your connection can be deactivated because of the following reasons as indicated in the SmartCardEmulatorConnectionDeactivatedEventArgs.Reason property.

  • Если подключение останавливается со значением ConnectionLost, это означает, что пользователь отвел свое устройство от устройства для считывания.If the connection is deactivated with the ConnectionLost value, it means that the user pulled their device away from the reader. Если вашему приложению требуется, чтобы пользователь касался терминала в течение большего времени, можно показать соответствующий запрос.If your app needs the user to tap to the terminal longer, you might want to consider prompting them with feedback. Вы должны завершить фоновую задачу быстро (завершив отсрочку), чтобы при повторном касании не было задержки из-за ожидания завершения предыдущей фоновой задачи.You should terminate your background task quickly (by completing your deferral) to ensure if they tap again it won’t be delayed waiting for the previous background task to exit.
  • Если подключение остановлено со значением ConnectionRedirected, это означает, что терминал отправил новую команду SELECT AID APDU, направленную на другой идентификатор AID.If the connection is deactivated with the ConnectionRedirected, it means that the terminal sent a new SELECT AID command APDU directed to a different AID. В таком случае приложению следует немедленно завершить фоновую задачу (завершив отсрочку), чтобы сделать возможным запуск другой фоновой задачи.In this case, your app should exit the background task immediately (by completing your deferral) to allow another background task to run.

Фоновая задача также должна регистрировать событие Canceled event в IBackgroundTaskInstance interface и быстро завершать фоновую задачу (завершив отсрочку), так как это событие запускается системой после завершения выполнения фоновой задачи.The background task should also register for the Canceled event on IBackgroundTaskInstance interface, and likewise quickly exit the background task (by completing your deferral) because this event is fired by the system when it is finished with your background task. Ниже приведен код, демонстрирующий фоновую задачу приложения с HCE.Below is code that demonstrates an HCE app background task.

void BgTask::Run(
    IBackgroundTaskInstance^ taskInstance)
{
    m_triggerDetails = static_cast<SmartCardTriggerDetails^>(taskInstance->TriggerDetails);
    if (m_triggerDetails == nullptr)
    {
        // May be not a smart card event that triggered us
        return;
    }

    m_emulator = m_triggerDetails->Emulator;
    m_taskInstance = taskInstance;

    switch (m_triggerDetails->TriggerType)
    {
    case SmartCardTriggerType::EmulatorHostApplicationActivated:
        HandleHceActivation();
        break;

    case SmartCardTriggerType::EmulatorAppletIdGroupRegistrationChanged:
        HandleRegistrationChange();
        break;

    default:
        break;
    }
}

void BgTask::HandleHceActivation()
{
 try
 {
        auto lock = m_srwLock.LockShared();
        // Take a deferral to keep this background task alive even after this "Run" method returns
        // You must complete this deferal immediately after you have done processing the current transaction
        m_deferral = m_taskInstance->GetDeferral();

        DebugLog(L"*** HCE Activation Background Task Started ***");

        // Set up a handler for if the background task is cancelled, we must immediately complete our deferral
        m_taskInstance->Canceled += ref new Windows::ApplicationModel::Background::BackgroundTaskCanceledEventHandler(
            [this](
            IBackgroundTaskInstance^ sender,
            BackgroundTaskCancellationReason reason)
        {
            DebugLog(L"Cancelled");
            DebugLog(reason.ToString()->Data());
            EndTask();
        });

        if (Windows::Phone::System::SystemProtection::ScreenLocked)
        {
            auto denyIfLocked = Windows::Storage::ApplicationData::Current->RoamingSettings->Values->Lookup("DenyIfPhoneLocked");
            if (denyIfLocked != nullptr && (bool)denyIfLocked == true)
            {
                // The phone is locked, and our current user setting is to deny transactions while locked so let the user know
                // Denied
                DoLaunch(Denied, L"Phone was locked at the time of tap");

                // We still need to respond to APDUs in a timely manner, even though we will just return failure
                m_fDenyTransactions = true;
            }
        }
        else
        {
            m_fDenyTransactions = false;
        }

        m_emulator->ApduReceived += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorApduReceivedEventArgs^>(
            this, &BgTask::ApduReceived);

        m_emulator->ConnectionDeactivated += ref new TypedEventHandler<SmartCardEmulator^, SmartCardEmulatorConnectionDeactivatedEventArgs^>(
                [this](
                SmartCardEmulator^ emulator,
                SmartCardEmulatorConnectionDeactivatedEventArgs^ eventArgs)
            {
                DebugLog(L"Connection deactivated");
                EndTask();
            });

  m_emulator->Start();
        DebugLog(L"Emulator started");
 }
 catch (Exception^ e)
 {
        DebugLog(("Exception in Run: " + e->ToString())->Data());
        EndTask();
 }
}

Создание и регистрация группы AIDCreate and register AID groups

Во время первого запуска приложения при подготовке карты вы создаете и регистрируете группы AID в системе.During the first launch of your application when the card is being provisioned, you will create and register AID groups with the system. Система определяет приложение, с которым свяжется внешнее устройство для считывания, и перенаправляет объекты APDU соответствующим образом, исходя из зарегистрированных AID и параметров пользователя.The system determines the app that an external reader would like to talk to and route APDUs accordingly based on the registered AIDs and user settings.

Большинство карт для оплаты регистрируются с одним и тем же идентификатором AID (который является идентификатором AID PPSE) вместе с конкретными идентификаторами AID дополнительной карты сети для оплаты.Most of the payment cards register for the same AID (which is PPSE AID) along with additional payment network card specific AIDs. Каждая группа AID представляет карту, и когда пользователь активирует карту, активируются все идентификаторы AID в группе.Each AID group represents a card and when the user enables the card, all AIDs in the group are enabled. Аналогично, когда пользователь отключает карту, отключаются все идентификаторы AID в группе.Similarly, when the user deactivates the card, all AIDs in the group are disabled.

Чтобы зарегистрировать группу AID, необходимо создать объект SmartCardAppletIdGroup и настроить его свойства, чтобы указать, что это — карта для оплаты на основе HCE.To register an AID group, you need to create a SmartCardAppletIdGroup object and set its properties to reflect that this is an HCE-based payment card. Отображаемое имя должно описывать вас пользователю, поскольку оно будет отображаться в меню параметров NFC, а также в запросах для пользователей.Your display name should be descriptive to the user because it will show up in the NFC settings menu as well as user prompts. В случае карт с HCE, предназначенных для оплаты, свойство SmartCardEmulationCategory должно иметь значение Payment, а свойство SmartCardEmulationType — значение Host.For HCE payment cards, the SmartCardEmulationCategory property should be set to Payment and the SmartCardEmulationType property should be set to Host.

public static byte[] AID_PPSE =
        {
            // File name "2PAY.SYS.DDF01" (14 bytes)
            (byte)'2', (byte)'P', (byte)'A', (byte)'Y',
            (byte)'.', (byte)'S', (byte)'Y', (byte)'S',
            (byte)'.', (byte)'D', (byte)'D', (byte)'F', (byte)'0', (byte)'1'
        };

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_PPSE.AsBuffer()},
                                SmartCardEmulationCategory.Payment,
                                SmartCardEmulationType.Host);

В случае карт с HCE, не предназначенных для оплаты, свойство SmartCardEmulationCategory должно иметь значение Other, а свойство SmartCardEmulationType — значение Host.For non-payment HCE cards, the SmartCardEmulationCategory property should be set to Other and the SmartCardEmulationType property should be set to Host.

public static byte[] AID_OTHER =
        {
            (byte)'1', (byte)'2', (byte)'3', (byte)'4',
            (byte)'5', (byte)'6', (byte)'7', (byte)'8',
            (byte)'O', (byte)'T', (byte)'H', (byte)'E', (byte)'R'
        };

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_OTHER.AsBuffer()},
                                SmartCardEmulationCategory.Other,
                                SmartCardEmulationType.Host);

Вы можете включить до 9 идентификаторов AID (длиной 5–16 байт каждый) в каждую группу идентификаторов AID.You can include up to 9 AIDs (of length 5-16 bytes each) per AID group.

Используйте метод RegisterAppletIdGroupAsync, чтобы зарегистрировать свою группу AID в системе. При этом будет возвращен объект SmartCardAppletIdGroupRegistration.Use the RegisterAppletIdGroupAsync method to register your AID group with the system, which will return a SmartCardAppletIdGroupRegistration object. По умолчанию для свойства ActivationPolicy объекта регистрации устанавливается значение Disabled.By default, the ActivationPolicy property of the registration object is set to Disabled. Это означает, что даже если ваши идентификаторы AID зарегистрированы в системе, они еще не включены и не будут получать трафик.This means even though your AIDs are registered with the system, they are not enabled yet and won’t receive traffic.

reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);

Вы можете включать свои зарегистрированные карты (группы AID) с помощью метода RequestActivationPolicyChangeAsync класса SmartCardAppletIdGroupRegistration, как показано ниже.You can enable your registered cards (AID groups) by using the RequestActivationPolicyChangeAsync method of theSmartCardAppletIdGroupRegistration class as shown below. Так как в системе можно одновременно активировать одну карту для оплаты, установка для параметра ActivationPolicy группы AID оплаты значения Enabled полностью соответствует настройке карты для оплаты по умолчанию.Because only a single payment card can be enabled at a time on the system, setting the ActivationPolicy of a payment AID group to Enabled is the same as setting the default payment card. Пользователю будет предложено разрешить применение этой карты в качестве карты для оплаты по умолчанию независимо от того, была ли уже выбрана карта для оплаты по умолчанию.The user will be prompted to allow this card as a default payment card, regardless of whether there is a default payment card already selected or not. Это утверждение является неверным, если приложение уже назначено приложением для оплаты по умолчанию и просто переходит между собственными группами AID.This statement is not true if your app is already the default payment application, and is merely changing between it’s own AID groups. Вы можете зарегистрировать до 10 групп AID для каждого приложения.You can register up to 10 AID groups per app.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.Enabled);

Вы можете запросить зарегистрированные группы AID в ОС и проверить их политику активации с помощью метода GetAppletIdGroupRegistrationsAsync.You can query your app’s registered AID groups with the OS and check their activation policy using the GetAppletIdGroupRegistrationsAsync method.

Пользователи получат уведомление, когда вы переведете политику активации карты для оплаты из состояния Disabled в Enabled, только если приложение уже не было назначено приложением для оплаты по умолчанию.Users will be prompted when you change the activation policy of a payment card from Disabled to Enabled, only if your app is not already the default payment app. Если же вы переведете политику активации карты, не предназначенной для оплаты, из состояния Disabled в Enabled, пользователи получат уведомление только при наличии конфликта AID.Users will only be prompted when you change the activation policy of a non-payment card from Disabled to Enabled if there is an AID conflict.

var registrations = await SmartCardEmulator.GetAppletIdGroupRegistrationsAsync();
    foreach (var registration in registrations)
    {
registration.RequestActivationPolicyChangeAsync (AppletIdGroupActivationPolicy.Enabled);
    }

Уведомление о событии при изменении политики активацииEvent notification when activation policy change

В случае фоновой задачи можно зарегистрироваться для получения событий, связанных с изменением политики активации одной из зарегистрированных групп AID, когда такое изменение происходит за пределами приложения.In your background task, you can register to receive events for when the activation policy of one of your AID group registrations changes outside of your app. Например, пользователь может изменить приложение для оплаты по умолчанию в меню параметров NFC, сменив при этом одну из ваших карт на карту, размещенную в другом приложении.For example, the user may change the default payment app through the NFC settings menu from one of your cards to another card hosted by another app. Если вашему приложению необходимо знать об этом изменении в целях внутренней настройки, например для обновления живых плиток, вы можете получать уведомления о таких событиях и выполнять соответствующие действия в приложении.If your app needs to know about this change for internal setup such as updating live tiles, you can receive event notifications for this change and take action in your app accordingly.

var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = bgTaskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger(new SmartCardTrigger(SmartCardTriggerType.EmulatorAppletIdGroupRegistrationChanged));
bgTask = taskBuilder.Register();

Переопределение переднего планаForeground override behavior

Вы можете изменить ActivationPolicy для любой из зарегистрированных групп AID на ForegroundOverride в то время, когда ваше приложение находится на переднем плане, не уведомляя при этом пользователя.You can change the ActivationPolicy of any of your AID group registrations to ForegroundOverride while your app is in the foreground without prompting the user. Когда пользователь касается устройством терминала во время работы приложения на переднем плане, трафик направляется вашему приложению, даже если ни одна из ваших карт для оплаты не была выбрана пользователем в качестве карты для оплаты по умолчанию.When the user taps their device to a terminal while your app is in the foreground, the traffic is routed to your app even if none of your payment cards were chosen by the user as their default payment card. В случае изменения политики активации карты на ForegroundOverride это изменение носит временный характер и действует до тех пор, пока ваше приложение не выйдет из переднего плана. Оно не изменит текущую карту для оплаты по умолчанию, установленную пользователем.When you change a card’s activation policy to ForegroundOverride, this change is only temporary until your app leaves the foreground and it will not change the current default payment card set by the user. Вы можете изменить параметр ActivationPolicy карт для оплаты или карт, не предназначенных для оплаты, из приложения переднего плана следующим образом.You can change the ActivationPolicy of your payment or non-payment cards from your foreground app as follows. Обратите внимание, что метод RequestActivationPolicyChangeAsync можно вызывать только из приложения переднего плана. Его невозможно вызвать из фоновой задачи.Note that the RequestActivationPolicyChangeAsync method can only be called from a foreground app and cannot be called from a background task.

reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

Кроме того, вы можете зарегистрировать группу AID, состоящую из одного AID длиной 0 байт, вследствие чего система будет перенаправлять все APDU независимо от AID, включая все команды APDU, отправленные до получения команды SELECT AID.Also, you can register an AID group consisting of a single 0-length AID which will cause the system to route all APDUs regardless of the AID and including any command APDUs sent before a SELECT AID command is received. Однако такая группа AID работает только во время работы приложения на переднем плане, так как для нее можно настроить только ForegroundOverride и ее нельзя включить на постоянной основе.However, such an AID group only works while your app is in the foreground because it can only be set to ForegroundOverride and cannot be permanently enabled. Кроме того, этот механизм работает и при значении Host, и при значении UICC перечисления SmartCardEmulationType, перенаправляя при этом весь трафик либо в фоновую задачу HCE, либо на SIM-карту.Also, this mechanism works both for Host and UICC values of the SmartCardEmulationType enumeration to either route all traffic to your HCE background task, or to the SIM card.

public static byte[] AID_Foreground =
        {};

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_Foreground.AsBuffer()},
                                SmartCardEmulationCategory.Other,
                                SmartCardEmulationType.Host);
reg = await SmartCardEmulator.RegisterAppletIdGroupAsync(appletIdGroup);
reg.RequestActivationPolicyChangeAsync(AppletIdGroupActivationPolicy.ForegroundOverride);

Проверка поддержки NFC и HCECheck for NFC and HCE support

Ваше приложение должно проверять, имеет ли устройство оборудование NFC, поддерживает ли функцию эмуляции карты и поддерживает ли эмуляцию карты узла, прежде чем предлагать эти функции пользователю.Your app should check whether a device has NFC hardware, supports the card emulation feature, and supports host card emulation prior to offering such features to the user.

Функция эмуляции смарт-карты NFC работает только в Windows 10 Mobile. Поэтому попытка использовать API эмулятора смарт-карты в любых других версиях Windows 10 приведет к ошибкам.The NFC smart card emulation feature is only enabled on Windows 10 Mobile, so trying to use the smart card emulator APIs in any other versions of Windows 10, will cause errors. Вы можете проверить поддержку API смарт-карты в следующем фрагменте кода.You can check for smart card API support in the following code snippet.

Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Devices.SmartCards.SmartCardEmulator");

Вы можете дополнительно проверить, поддерживает ли оборудование NFC некоторые формы эмуляции карты, проверив, возвращает ли метод SmartCardEmulator.GetDefaultAsync значение NULL.You can additionally check to see if the device has NFC hardware capable of some form of card emulation by checking if the SmartCardEmulator.GetDefaultAsync method returns null. Если возвращает, то устройство не поддерживает эмуляцию карты NFC.If it does, then no NFC card emulation is supported on the device.

var smartcardemulator = await SmartCardEmulator.GetDefaultAsync();<

Поддержка маршрутизации UICC на основе HCE и AID доступна только на недавно появившихся устройствах, в частности на Lumia 730, 830, 640 и 640 XL.Support for HCE and AID-based UICC routing is only available on recently launched devices such as the Lumia 730, 830, 640, and 640 XL. Все новые устройства с поддержкой NFC под управлением Windows 10 Mobile и более новых версий ОС, как правило, поддерживают HCE.Any new NFC capable devices running Windows 10 Mobile and after should support HCE. Ваше приложение может проверить наличие поддержки HCE следующим образом.Your app can check for HCE support as follows.

Smartcardemulator.IsHostCardEmulationSupported();

Экран блокировки и выключение экранаLock screen and screen off behavior

Windows 10 Mobile содержит параметры эмуляции карты на уровне устройства, которые могут настраиваться оператором мобильной связи или изготовителем устройства.Windows 10 Mobile has device-level card emulation settings, which can be set by the mobile operator or the manufacturer of the device. По умолчанию переключатель оплаты касанием отключен, а для параметра "политика включения на уровне устройства" устанавливается значение "Всегда", если оператор мобильной связи или изготовитель оборудования не перезапишут эти значения.By default, "tap to pay" toggle is disabled and the "enablement policy at device level" is set to "Always", unless the MO or OEM overwrites these values.

Приложение может запросить значение EnablementPolicy на уровне устройства и предпринять действие для каждого случая в зависимости от требуемого поведения приложения в каждом состоянии.Your application can query the value of the EnablementPolicy at device level and take action for each case depending on the desired behavior of your app in each state.

SmartCardEmulator emulator = await SmartCardEmulator.GetDefaultAsync();

switch (emulator.EnablementPolicy)
{
case Never:
// you can take the user to the NFC settings to turn "tap and pay" on
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-nfctransactions:"));
break;

 case Always:
return "Card emulation always on";

 case ScreenOn:
 return "Card emulation on only when screen is on";

 case ScreenUnlocked:
 return "Card emulation on only when screen unlocked";
}

Фоновая задача приложения будет запущена, даже когда телефон заблокирован и (или) экран выключен, но только если внешнее устройство для считывания выберет AID, который разрешается в ваше приложение.Your app's background task will be launched even if the phone is locked and/or the screen is off only if the external reader selects an AID that resolves to your app. Вы можете реагировать на команды от устройства для считывания в фоновой задаче, но если вам необходим ввод каких-либо данных от пользователя или если вы хотите показать сообщение пользователю, можно запустить приложение переднего плана с некоторыми аргументами.You can respond to the commands from the reader in your background task, but if you need any input from the user or if you want to show a message to the user, you can launch your foreground app with some arguments. Фоновая задача может запустить приложение переднего плана со следующим поведением.Your background task can launch your foreground app with the following behavior.

  • Под экраном блокировки устройства (пользователь будет видеть ваше приложение переднего плана только после того, как разблокирует устройство)Under the device lock screen (the user will see your foreground app only after she unlocks the device)
  • Над экраном блокировки устройства (после закрытия приложения пользователем устройство по-прежнему находится в заблокированном состоянии)Above the device lock screen (after the user dismisses your app, the device is still in locked state)
        if (Windows::Phone::System::SystemProtection::ScreenLocked)
        {
            // Launch above the lock with some arguments
            var result = await eventDetails.TryLaunchSelfAsync("app-specific arguments", SmartCardLaunchBehavior.AboveLock);
        }

Регистрация AID и другие обновления для приложений на основе SIM-картыAID registration and other updates for SIM based apps

Приложения эмуляции карты, использующие SIM-карту в качестве защищенного элемента, могут регистрироваться в службе Windows для декларирования AID, поддерживаемых на SIM-карте.Card emulation apps that use the SIM as the secure element can register with the Windows service to declare the AIDs supported on the SIM. Эта регистрация очень похожа на регистрацию приложения на основе HCE.This registration is very similar to an HCE-based app registration. Единственным различием является параметр SmartCardEmulationType, для которого необходимо задать значение UICC для приложений на основе SIM-карты.The only difference is the SmartCardEmulationType, which should be set to Uicc for SIM-based apps. В результате регистрации карты для оплаты отображаемое имя карты также будет внесено в меню настройки NFC.As the result of the payment card registration, the display name of the card will also be populated in the NFC setting menu.

var appletIdGroup = new SmartCardAppletIdGroup(
                        "Example DisplayName",
                                new List<IBuffer> {AID_PPSE.AsBuffer()},
                                SmartCardEmulationCategory.Payment,
                                SmartCardEmulationType.Uicc);

Важно!

Поддержка традиционного двоичного перехвата SMS в Windows Phone 8.1 была удалена и заменена новой, более широкой поддержкой SMS в Windows 10 Mobile, но любые традиционные приложения для Windows Phone 8.1, основанные на этом, необходимо обновить для использования новых API SMS Windows 10 Mobile.The legacy binary SMS intercept support in Windows Phone 8.1 has been removed and replaced with new broader SMS support in Windows 10 Mobile, but any legacy Windows Phone 8.1 apps relying on that must update to use the new Windows 10 Mobile SMS APIs.