NFC считать карту


HCE (Host-based Card Emulation) – это технология, которая дает возможность писать софт, не требующий для исполнения выделенного криптопроцессора, чтобы обеспечить сеанс связи с платежным терминалом. Приложение исполняется на основном процессоре мобильного устройства, в окружении операционной системы телефона.
HCE для NFC имеет открытую архитектуру, что позволяет эмулировать не только банковские карты, но и карты программ лояльности, транспортные карты, пропуска и так далее. Технология позволяет заметно ускорить процесс внедрения платежных NFC-сервисов, потому что не нужно координировать и согласовывать действия с производителями телефонов, кроме того, решаются многие проблемы совместимости.
Мы сделали такой HC-эмулятор в своём приложении. До появления технологии HCE информацию для осуществления NFC-транзакций в мобильных устройствах можно было хранить тремя способами: либо на SIM-карте (принцип SIM centric NFC), либо в специальном элементе на телефоне (Embeded Secure Elements, eSE), либо на специальной MicroSD.

Как обстояли дела ранее?

У классических способов до HCE имеются существенные недостатки. При подходе SIM centric требуются специальные SIM-карты, которые значительно дороже стандартных карт, обязательна процедура посещения пользователем точки продаж для замены SIM-карты и т.д.
При eSE-подходе сложностей и ограничений ещё больше – моделей телефонов, имеющих специальный блок для хранения информации о карте, на рынке крайне мало, стоимость персонализации элемента в телефоне весьма высокая, появляется зависимость от производителя телефона и провайдера услуг персонализации «по воздуху» (Over-The-Air Service Provider). Эти ограничения, аппаратные и организационные барьеры до последнего времени не давали возможности сделать сервис бесконтактных платежей при помощи мобильных устройств массовым.
Раньше, чтобы запустить сервис NFC-платежей, его провайдеру нужно было договариваться с вендором о получении ключей для записи на телефон платежных данных. Некоторые производители телефонов предоставляли собственный облачный сервис, с которым провайдеру платежного сервиса необходимо было интегрироваться, передавать ему платежные данные для дальнейшей заливки этих данных в телефон. По пути «закрытой» технологии сейчас пошел и Apple – для работы платежного приложения используется криптопроцессор, ключи есть только у производителя аппарата, и только он может загружать платежные данные.
Для пользователей основным неудобством этих hard подходов является привязка системы безопасности к аппаратным средствам а, следовательно, неизбежная необходимость смены SIM-карты или даже телефона для подключения сервиса NFC-платежей.

Google: мы пойдем другим путем

Другой подход избрали в Google, рассудив, что зависимость от вендоров (производителей телефонов и Secure Elements) радикально снижает адаптивность технологии и препятствует массовому тиражированию платежных сервисов. Рассудив так, Google реализовала подход, при котором NFC-контроллер напрямую связан с основным процессором, непосредственно обеспечивающим работу платежного приложения, хранение данных, подпись транзакций и т.д. А информационная безопасность обеспечивается программными средствами.

В декабре 2013 года Google выпустила версию Android 4.4 KitKat, в которой была реализована возможность взаимодействия NFC-контроллера не только с SE, но и с обычным приложением в телефоне. Проще говоря, отпала необходимость промышленной прогрузки информации в специальные устройства, стало достаточно просто установить на смартфон платежное приложение, работающее по технологии HCE.

Как это работает?

У нас есть карта «Билайн» — обычная дебетовая MasterCard, которую можно получить бесплатно в любом салоне «Билайн». Ежегодная абонентская плата за обслуживание нашей карты не взимается. Карта работает как обычный MC по всему миру, только при совершении покупок возвращается от 1,5% потраченной суммы на счет в виде бонусов. Накопленные бонусы могут быть использованы при оплате услуг мобильной связи, нашего проводного интернета, разных товаров в наших и партнёрских магазинах.
Карта эмулируется на телефоне.
По сути, технология HCE дает возможность эмулировать в телефоне бесконтактные smart-карты. В нашем случае виртуальная карта является дополнительной функцией физического носителя – пластиковой карты «Билайн». Владелец такой карты, являющийся одновременно владельцем телефона на платформе Android KitKat, оснащенного NFC-модулем, устанавливает на него мобильное приложение карты «Билайн». При входе в мобильное приложение для активации функции бесконтактных платежей достаточно ввести ЕАN карты и свой пароль. Приложение проверяет наличие/доступность HCE на устройстве, и если все ок, пользователю предлагается подключить функционал.
Если пользователь подтверждает свое согласие на подключение сервиса, ответив на полученную sms вводом одноразового пароля, то производится эмиссия виртуальной карты – в мобильное приложение из процессингового центра загружаются данные, необходимые для совершения NFC-платежей. Собственно, на этом всё – телефон стал инструментом бесконтактной оплаты.


На телефоне HCE функционирует как фоновый сервис, что позволяет использовать HCE, не запуская приложение для этого взаимодействия. При взаимодействии с терминалом Android’у необходимо выбрать приложение, которому отправить данные для обработки. Такой выбор делается на базе Application ID (AID), который содержит до 16 байт информации, и известен для популярных платежных систем, таких как Visa или MasterCard. Приложение может обрабатывать несколько различных AID, которые объединяются в группу. Каждая группа может быть связана с определенной категорией. В настоящий момент определено две категории: CATEGORY_PAYMENT (для приложений оплаты) и CATEGORY_OTHER (для остальных). В телефоне может быть установлено несколько приложений для одного и того же AID, для разных категорий может быть применена разная политика выбора приложения, для платежных приложений определяется одно активное приложение по умолчанию.
Для реализации HCE нам было необходимо расширить сервис HostApduService и реализовать методы: processCommandApdu() – вызывается, когда приложение взаимодействует с терминалом и onDeactivated() – если связь с терминалом потеряна, или другой NFC-ридер пытается установить соединение. Данный сервис декларируется в манифесте приложения и должен содержать intent-фильтр для SERVICE_INTERFACE, доступ android.permission.BIND_NFC_SERVICE и метаданные, определяющие, какие AID обрабатывают наш сервис. Также тут мы можем определить, требуется ли разблокировка устройства для совершения оплаты с его помощью. Разрешение BIND_NFC_SERVICE гарантирует, что все взаимодействия с NFC-модулем будут осуществляться через операционную систему Android. А безопасность хранимых данных базируется на стандартной системе «песочницы» для приложения.
Схема взаимодействия элементов в процессе бесконтактной оплаты по технологии HCE

Элементами системы являются:
NFC-контроллер – передает команды от терминала платежному приложению.
Мобильная платформа – серверная часть мобильного банка, включающая функции управления платежным приложением.
Хост эмитента – процессинговый центр эмитента, который для обслуживания мобильного приложения умеет взаимодействовать с мобильной платформой.
Хост эквайера – процессинговый центр эквайера.
При совершении бесконтактной оплаты терминал взаимодействует с NFC-контроллером телефона по протоколу ISO 14443 (APDU T=CL).
NFC-контроллер взаимодействует с Платежным приложением по внутреннему протоколу, специфицированному в Android 4.4 и выше.
Платежное приложение получает от терминала ключевые данные транзакции (сумма, валюта, время операции, свойства терминала и т.д.), проводит проверку возможности совершения операции и в случае успеха генерирует уникальную криптограмму (ARQC) на уникальном секретном ключе Платежного приложения. Данные, на которых рассчитывается криптограмма, включают случайное число.
В зависимости от суммы и свойств терминала у клиента может быть запрошен пин-код, который вводится клиентом на терминале (или пин-паде).
Терминал на хост эквайра формирует авторизационный запрос, который включает ARQC и шифрованный пин-код, если он был введен клиентом.
Далее с хоста эквайера авторизационный запрос через платежную систему маршрутизируется на хост эмитента, где принимается решение об одобрении или отказе авторизации.
Проверки на хосте эмитента включают:
1. Проверку криптограммы (ARQC).
2. Проверку пин-кода (если он был введен клиентом).
3. Проверку правил обслуживания карты.
4. Проверку лимитов карты и счета.
5. Проверку анти-фродовых правил, включая специфические правила для бесконтактной оплаты телефоном.
В результате обработки авторизации на хосте эмитента формируется ответ, который по обратной цепочке доставляется в терминал.

Что нужно для использования сервиса в России

Для того чтобы пользоваться сервисом бесконтактной оплаты, необходимо в любом офисе «Билайн» бесплатно получить предоплаченную карту «Билайн». Далее – скачать на Google Play мобильное приложение карты «Билайн» и активировать функцию бесконтактной оплаты. Аппаратные и программные ограничения: операционная система Android, версия не ниже 4.4, наличие в телефоне NFC-модуля.

Какие еще есть особенности?

Например, если у пользователя не один, а несколько телефонов на Android 4.4, то сервис бесконтактной оплаты, привязанный к его основной карте, может быть установлен на все устройства владельца этой карты. Это удобно, например, для использования сервиса семьей. При этом на одном телефоне может существовать только одна виртуальная карточка.
При оплате, когда телефон подносится к терминалу, на экране отображается сумма покупки и информация об успешности проведения платежа.
Оплата производится только при разблокированном экране, поэтому важно, чтобы телефон был защищен паролем. При этом само приложение может быть закрытым. При удалении приложения с телефона виртуальная карта блокируется. При восстановлении приложения происходит повторная эмуляция карты, поэтому придется проходить процесс настройки бесконтактной оплаты с нуля. Повторная активация услуги потребуется также, если в приложении отключить сервис бесконтактной оплаты. Однако удалять приложение или отключать сервис вовсе не обязательно – для временной блокировки можно использовать функцию «Приостановить бесконтактную оплату».

Активность сервиса бесконтактной оплаты подтверждается оранжевым цветом соответствующей иконки

В чем профит?

Итак, что нам дает сервис бесконтактной оплаты с помощью мобильного телефона? Можно забыть дома кошелек, оставить в квартире паспорт или даже водительское удостоверение, но почти со 100% вероятностью сотовый телефон будет при вас. А если на этом телефоне инсталлировано приложение для бесконтактной оплаты, значит, вы всегда «при деньгах».
Далее. NFC-транзакция – это мгновенная оплата. Даже для того чтобы расплатиться пластиковой карточкой, её для начала нужно извлечь из бумажника, а перед этим – бумажник из кармана или сумки. При расчете наличными добавляется момент пересчета, передачи денег, получения и проверки сдачи и т.д. Транзакции до 1000 рублей, совершенные при помощи NFC и HCE, даже не требуют ввода ПИН-кода, и расчет без всякого преувеличения происходит в один момент и в одно касание.
После совершения транзакции на телефон приходит sms-сообщение о прошедшей операции и об остатке на счете, т.е. вы всегда в курсе состояния своего электронного кошелька.
Кстати, интересная деталь – в приложении карты «Билайн» реализована технология единого ПИНа для нескольких карт, в данном случае – для основной карты «Билайн» и карты, эмулированной мобильным приложением. То есть и при расчете по пластиковой картой, и используя сервис бесконтактных платежей, вы вводите один и тот же пароль.
Сервис бесплатный, никаких комиссий за NFC-транзакции не взимаются.

Где можно платить?

Конечно, развитость инфраструктуры приема бесконтактных платежей зависит от конкретного региона, однако сегодня уже порядка 5% платежных терминалов уже оснащены функцией NFC. В масштабах всей России это, по экспертным оценкам, около 30 тысяч устройств. Лидеры рынка производства POS-терминалов – VenFone и Ingenico – уже не первый год оснащают свои устройства поддержкой NFC в качестве базовой стандартной функции.
При оплате следует ориентироваться на наличие на POS-терминале значка, обозначающего, что аппарат оснащен бесконтактным функционалом.
Если говорить о конкретных точках, то это сети, крупные магазины, фаст-фуды, заправки. McDonald’s, Starbucks, Subway, гипермаркеты «Ашан», О’КЕЙ, «Магнит», «Аэроэкспресс», крупные сети сотового ритиейла, магазины глобальных производителей косметики и парфюмерии, модные места проведения досуга.

Безопасность

Наиболее очевидное на сегодняшний день тонкое место технологии HCE – безопасность. Данные, необходимые и достаточные для осуществления NFC-платежей, хранятся непосредственно в памяти смартфона. Однако для мобильного приложения карты «Билайн» используется комплекс мер, которые сводят к минимуму вероятность взлома. Мы делали внутренний конкурс на взлом системы, с очень хорошим вознаграждением, анализ кода.
Разберем некоторые аспекты информационной безопасности технологии HCE, реализованные для мобильного приложения карты «Билайн».
Операции по заблокированному телефону невозможны. В этом смысле HCE-решение защищено лучше, чем обычная пластиковая карта с бесконтактным интерфейсом – чтобы совершить платежную операцию злоумышленник должен разблокировать телефон. В случае обычной карты – достаточно получить саму карту. При использовании мобильного приложения карты «Билайн» невозможен, например, сценарий, когда в метро в плотном потоке людей с виртуальной карты незаметно списывают деньги, прикладывая к карману ридер.

Продукт защищен от взлома и клонирования как на уровне самого приложения, так и на уровне процессинга. Все данные шифрованы, приложение само отслеживает попытки взлома и при обнаружении такой попытки зачищает все критичные данные. При этом приложение периодически сообщает процессингу свое состояние, при всех операциях хост проверяет ожидаемое состояние и сравнивает с фактически полученным. При несовпадении, что может быть вызвано попыткой клонирования, карта блокируется. Кроме того, в процессинговом центре настроены специальные правила эмитентского фрод-мониторинга, которые контролируют количество беспиновых операций и блокируют карту при обнаружении подозрительной активности.
Операции на сумму свыше 1000 рублей защищены онлайн пин-кодом, который вводится в пинпад терминала. Перехват пин-кода через взлом приложения невозможен – просто потому, что пин-код на телефоне никогда не вводится.
При утере телефона порядок действий практически ничем не отличается от стандартных мероприятий, выполняемых при утере обычной банковской карты: звонок в контакт-центр, блокировка карты «Билайн» по EAN, получение в салоне связи новой карты. На новую карту будут перенесены все остатки денежных средств, бонусы и так далее. При этом, естественно, номер карты поменяется, а у злоумышленника будет на руках телефон, в котором будет эмулирована старая карта, операции по которой совершить уже невозможно, поскольку она заблокирована.
Кстати, следует обратить еще на один нюанс, связанный с безопасностью технологии NFC в целом. Существует представление, что уязвимым является сам сеанс передачи данных от смартфона к POS-терминалу. На самом деле каждая транзакция защищена уникальной криптограммой, без которой авторизация невозможна. Из тех данных, которые передаются по радиоканалу, практически невозможно извлечь никакой информации, которая помогла бы злоумышленникам похитить средства со счета, подписав другие транзакции.

Будет ли работать этот сервис на платформе iOS?

Apple пошли по пути phone-based и используют встроенный Secure Element, куда никто, кроме Apple, карточные ключи загрузить не может. Поэтому единственный реалистичный в настоящее время вариант – это интеграция с новой технологией Visa Token Service (генерация временных ключей для оплаты), на основе которой Apple Pay, собственно, и работает.

Прогнозы

Можно прогнозировать, что рынок NFC-платежей в России переходит из стадии становления в фазу активного роста. Растет число телефонов, поддерживающих технологию NFC, появляются интеграционные проекты, реализуемые совместно вендорами, платежными системами и ритейлерами.
В I полугодии 2014 г. в России было реализовано 1,2 млн. смартфонов, поддерживающих технологию NFC. Это на 21% больше, чем за аналогичный период прошлого года. NFC-смартфоны составили 14% от всех продаж смартфонов в стране. Понятно, что бурный рост может быть обусловлен только удобством применения бесконтактных технологий, а массовость сервису может придать мощный драйвер. Такой, например, как бесконтактная оплата проезда в общественном транспорте, прежде всего в метрополитене.
Если же говорить о емкости рынка NFC-платежей в России, то эксперты называют цифру порядка 15 млрд. рублей (оценка агентства J’son & Partners).

Для жителей и гостей Подмосковья в начале 2020 года станет доступна возможность выпуска транспортной карты «Стрелка» в смартфонах с технологией NFC. Об этом сообщил Сбербанк, подчеркнув, что технологию виртуальной транспортной карты он представил первым в России.

Как уточняется, виртуальной картой из приложения «Стрелка» можно будет оплатить проезд на любом виде общественного транспорта Московской области, а также вход в ряд музеев Подмосковья со всеми скидками обычной карты «Стрелка».

Использовать карту можно будет сразу после пополнения баланса. Пополнить баланс можно будет в мобильном приложении ЕТК «Стрелка» или через «Сбербанк Онлайн».

Для оплаты проезда пользователю необходимо будет зайти в приложение, авторизоваться, а после поднести устройство к валидатору и дождаться сигнала об успешном списании электронных денежных средств.

«Ключевыми преимуществами виртуальной транспортной карты «Стрелка» являются доступность и безопасность. Разработка соответствует международным стандартам безопасности и сохранности передачи данных», — говорится в сообщении Сбербанка.

Проект реализован совместно с оператором единой транспортной карты «Стрелка» — АО «Расчетные решения» (компания входит в экосистему Сбербанка).

Сегодня функционал доступен в тестовом режиме на устройствах с операционной системой Android с поддержкой технологии NFC. Пассажирам Московской области функционал виртуальной карты станет доступен в январе 2020 года.

Что такое NFC Card Emulator? Это мощный эмулятор, который эмулирует разные виды карт.
Карты метро, пропуска, карты школьника, карты отелей — везде мы экономим вам время и спасаем от ситуации, когда вы забыли пропуск.
Важно!
1. На телефоне должен быть NFC.
2. Телефон должен иметь root-доступ (для изменения настроек NFC нам необходим доступ к системному разделу)
Инструкции:
1. Включите NFC
2. Откройте NFC Card Emulator
3. Приложите карту к «спинке» телефона и после успешного обнаружения сохраните карту на телефон
4. Нажмите на карту в приложении, и после успешного запуска эмуляции, используйте телефон как вашу карту
5. При использовании убедитесь, что NFC и экран телефона включены
Поддерживаемые телефоны:
Xiaomi, HUAWEI, ONEPLUS, SONY, Samsung(s4, s5, note3, Google phone (Nexus and Pixel), Meizu, LG, HTC, Nubia, Letv, Moto, Lenovo and more…
Неподдерживаемые телефоны:
Samsung s6, s6e, s7, s7e, s8, s8 + and so on
Поддерживаемые часы
Huawei…
Поддерживаемые карты
Попробуйте все, но если быть технически точными NFC Card Emulator может работать с картами с 4 bytes, 7 bytes and 10 bytes uid.
Поддерживаемые NFC-чипы
NXP и Broadcom

Варвара Николаева

Сейчас почти у каждого есть карты с поддержкой NFC, которыми можно оплатить покупку в одно касание, а ещё лучше это сделать смартфоном или даже умными часами 😉 Есть карты, которыми можно оплатить проезд, а также пополнить баланс с телефона (жаль вот только ввели такую систему не во всех городах, а в некоторых предпочли «изобрести велосипед» и использовали карты, которые несовместимы с NFC). А ещё можно просто прикоснуться телефоном к наушникам, и они сами образуют пару с вашим телефоном и в некоторых случаях даже включают Bluetooth.

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

О чём точно стоит знать: NFC базируется на RFID. Зачастую эти две технологии ошибочно объединяют в одну, но они не являются одним и тем же. Хотя NFC-считыватели могут распознавать и перезаписывать некоторые RFID-метки, технология NFC даёт гораздо больше возможностей, чем RFID. NFC можно считать надстройкой над RFID, созданной для расширения платформы обмена данными.

Итак, разберёмся в механике работы RFID и NFC и в том, чем они отличаются.

RFID

Представьте, что Иван сидит ночью на крылечке своего дома. Иван включил светильник на крыльце и теперь может увидеть своего соседа, когда тот проходит мимо, потому что свет отражается от него и попадает Ивану на сетчатку глаза. Это пассивный RFID. Радиосигнал от пассивного RFID-считывателя достигает метки, которая поглощает его и отражает обратно свой идентификатор.

Теперь представьте, что Иван включил светильник, а его сосед, который сидит у себя дома, видит это и кратковременно включает светильник на своём крыльце, как будто передаёт Ивану «привет» со своего крыльца. Это активный RFID, он может работать на более длинные дистанции, так как приёмник имеет свой собственный источник питания и, более того, может генерировать собственный радиосигнал, не полагаясь на энергию, которую он поглотил от источника.

RFID — это два таких крылечка. Иван и его сосед знают друг друга в лицо, но больше ничего не могут узнать друг о друге. Они не обмениваются какой-либо весомой информацией. RFID был создан для идентификации, а не коммуникации, поэтому RFID-метки содержат небольшой объём информации, порядка тысячи байт или меньше, которые можно считывать или перезаписывать с RFID-считывателей.

NFC

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

NFC разработали, основываясь на RFID, но для более сложного обмена данными между участниками. По-прежнему можно считывать пассивные RFID-метки с помощью NFC-считывателя и записать новые данные в их ограниченную память. Также NFC позволяет записывать информацию в определённый тип RFID-меток, используя стандартный формат, независимый от типа меток. Ещё можно взаимодействовать с другими NFC-устройствами дуплексным или двусторонним обменом. NFC-устройства могут обмениваться информацией о своих возможностях, делиться записями или устанавливать более длительное взаимодействие посредством других технологий.

Например, можно прикоснуться телефоном с NFC к стереоустройству, у которого тоже есть NFC, и они опознают друг друга, узнают, что у обоих есть Wi-Fi модуль, и обменяются данными для последующего взаимодействия через Wi-Fi. После этого телефон начнёт трансляцию музыки на стереоустройство с помощью Wi-Fi. Телефон не будет транслировать музыку с помощью NFC по двум причинам:

  • Во-первых, потому что у NFC малый радиус действия, порядка десяти сантиметров, что позволяет уменьшить энергопотребление и избежать установления связи с другими устройствами, использующими ту же технологию передачи данных.
  • Во-вторых, скорость передачи данных с помощью NFC ощутимо меньше в сравнении с другими технологиями (Wi-Fi, Bluetooth и т.д.). NFC не был создан для длительных высокоскоростных коммуникаций, а для обмена короткими сообщениями, мандатами (учётными записями с параметрами доступа пользователя, сформированными после его успешной аутентификации) и инициирования связи. Если вернуться к аналогии с крылечком, то NFC позволит вам начать общение с соседом или обменяться мнениями о погоде, но для более длительного разговора вы пригласите соседа на чай — это уже Wi-Fi, Bluetooth и другие расширенные протоколы обмена данными.

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

Устройство не позволяет считать абсолютно всю свою память при использовании NFC, оно лишь даёт доступ к небольшому кусочку информации, необходимому для обмена. Пользователь может проконтролировать, какую информацию он передаёт и кому.

Типы NFC-меток

Существует четыре типа меток, описанных NFC-форумом, все они базируются на RFID-протоколах. Это делает NFC метки частично совместимыми со многими уже существующими RFID системами (например, Mifare и FeliCa). Хотя эти более старые системы не поддерживают NDEF, они, однако, могут опознавать NFC метки, которые совместимы с ними. Например, считыватель RFID, который предназначен для работы с метками Mifare Ultralight, может считать идентификационный номер метки NFC 2 типа, хоть и не может прочитать закодированную NDEF информацию. Есть также пятый тип, который совместим с технологией, но при этом не является частью NFC-спецификации.

Типы 1, 2 и 4 основаны на ГОСТ Р ИСО/МЭК 14443A (состоит из четырёх частей: 1, 2, 3, 4), тип 3 — на ГОСТ Р ИСО/МЭК 18092. Более подробно про каждый из типов можно прочитать под спойлером.

Тип 1:

  • Основан на ГОСТ Р ИСО/МЭК 14443A;
  • Может быть как только для чтения, так и для чтения/записи;
  • Содержит от 96 байт до 2 кбайт памяти;
  • Нет защиты данных от коллизий (прим. — коллизии могут возникнуть; когда два активных источника передают данные одновременно);
  • Примеры: Innovision Topaz, Broadcom BCM20203.

Тип 2:

  • Аналогично типу 1 основан на NXP/PhilipsMifareUltralight метках (ГОСТ Р ИСО/МЭК 14443A);
  • Может быть как только для чтения, так и для чтения/записи;
  • Содержит от 96 байт до 2 кбайт памяти;
  • Скорость взаимодействия 106 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: NXP Mifare Ultralight.

Тип 3:

  • Основан на метках SonyFeliCa (ГОСТ Р ИСО/МЭК 18092 и JIS-X-6319-4) без поддержки шифрования и аутентификации, которая предоставлена спецификацией FeliCa;
  • Может быть либо только для чтения, либо для чтения/записи;
  • Скорость взаимодействия 212 или 424 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: Sony FeliCa.

Тип 4:

  • Аналогично типу 1, тип 4 основан на ГОСТ Р ИСО/МЭК 14443A;
  • Может быть либо только для чтения, либо для чтения/записи;
  • 2, 4 или 8 кбайт памяти;
  • Скорость взаимодействия 106, 212 или 424 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: NXP DESFire, SmartMX-JCOP.

Пятый тип является собственностью NXPSemiconductors и, вероятно, самым распространённым на сегодняшний день MifareClassictag (ГОСТ Р ИСО/МЭК 14443A):

  • Память: 192, 768 или 3584 байта;
  • Скорость взаимодействия 106 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: NXP Mifare Classic 1K, Mifare Classic 4K, Mifare Classic Mini.

Алгоритм работы NFC

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

У NFC устройств есть два режима взаимодействия. Если инициатор излучает радиочастотные волны, а цель за счёт инициатора получает питание, то такой режим взаимодействия называют пассивным. При активном режиме у инициатора и цели свои собственные источники питания, и они независимы друг от друга. Данные режимы совпадают с режимами RFID.

NFC устройства также имеют три способа работы. Они могут работать в режиме чтения информации с цели или записи на неё. Они могут эмулировать карты, ведя себя как RFID-метки, когда они в поле другого NFC или RFID устройства. Или они могут работать в режиме peer-to-peer (P2P), в котором они обмениваются данными сразу в обоих направлениях.

Первым главным отличием NFC от RFID является способ взаимодействия peer-to-peer, который реализован с помощью ГОСТ Р ИСО/МЭК 18092. Обмен данными P2P реализуется двумя протоколами — протоколом подуровня управления логической связью (LLCP — logical link control protocol) и простым протоколом обмена данными NDEF (SNEP — simple NDEF exchange format).

Архитектура NFC

В архитектуре NFC есть несколько уровней. Самый низкий из них — физический, который реализован ЦПУ и другим аппаратным комплексом, через который происходит взаимодействие. В середине находятся данные о пакетах и транспортный уровень, затем формат данных уровней, и в конце программное обеспечение.

На физическом уровне NFC работает по алгоритму, описанному в ГОСТ для RFID (ГОСТ Р ИСО/МЭК 14443-2-2014), где говорится о маломощных радиосигналах частотой 13,56 МГц. Затем идёт уровень, который описывает разбивку потока данных на фреймы (ГОСТ Р ИСО/МЭК 14443-3-2014). Любые радиоконтроллеры, которые используются в телефоне, планшете или подсоединяются к компьютеру или микроконтроллеру, являются отдельными аппаратными компонентами. Они взаимодействуют с главным процессором посредством одного или нескольких стандартных последовательных протоколов между устройствами: универсальный асинхронный приёмопередатчик (UART), последовательный периферийный интерфейс (SPI), последовательная шина данных для связи интегральных схем (I2C) или универсальная последовательная шина (USB).

Над этим находится несколько протоколов команд RFID, базирующихся на двух спецификациях. NFC чтение и запись меток базируется на оригинальном RFID ГОСТ Р ИСО/МЭК 14443A. Протоколы Philips/NXP Semiconductors Mifare Classic и Mifare Ultralight и NXP DESFire совместимы с ГОСТ Р ИСО/МЭК 14443A. Обмен данными P2P NFC базируется на ГОСТ Р ИСО/МЭК 18092. Также на этом же стандарте базируются RFID-карты и метки Sony FeliCa, которые доступны в основном в Японии. Можно читать и записывать метки, основанные на этих стандартах, и не использовать NFC.

Они изображены на рисунке выше на уровне с другими управляющими протоколами, так как они используют одинаковый стандарт.

NDEF

NDEF используется для форматирования данных обмена между устройствами и метками. Данный формат типизирует все сообщения, которые используются в NFC, причём не важно для карты это или для устройства. Каждое NDEF-сообщение содержит одну или несколько NDEF-записей. Каждая из них содержит уникальный тип записи, идентификатор, длину и поле для информации, которую нужно сообщить.

Есть несколько распространённых типов NDEF-записей:

  1. Обычные текстовые записи. В них можно отправить любую строку, они не содержат инструкций для цели, но содержат метаданные об языке текста и кодировке.
  2. URI. Такие записи содержат данные об интернет-ссылках. Цель, получившая такую запись, откроет её в том приложении, которое сможет её отобразить. Например, веб-браузере.
  3. Умная запись. Содержит не только веб-ссылки, но и текстовое описание к ним, чтобы было понятно, что находится по этой ссылке. В зависимости от данных записи телефон может открыть информацию в нужном приложении, будь то SMS или e-mail, либо сменить настройки телефона (громкость звука, яркость экрана и т.д.).
  4. Подпись. Она позволяет доказать, что информация, которая была передана или передаётся, достоверна.

Можно использовать несколько видов записей в одном NDEF-сообщении.

Можно представить сообщение как параграф, а записи — как предложения. Параграф — определённая единица информации, которая содержит одно или несколько предложений. Тогда как предложение — меньшая единица информации, которая содержит всего одну идею. Например, можно в виде абзаца сделать приглашения на день рождения и написать в отдельных предложениях данные о дате, времени и месте проведения, а с помощью NDEF-сообщений передать друзьям напоминание об этом событии, где будет текстовое сообщение с описанием события, умную запись с местом и веб-ссылку с тем, как добраться до этого места.

Второе главное различие между NFC и RFID — формат обмена данными NFC (NDEF — NFC data exchange format). NDEF определяет формат данных в сообщениях, которые в свою очередь состоят из NDEF записей. Есть несколько видов записей, о которых будет рассказано более подробно чуть ниже. NDEF делает возможным с помощью программного кода управлять процессом чтения и записи NFC-меток, обмена данными при помощи peer-to-peer и эмулирования карт.

Структура NDEF

NDEF содержит информацию о байтовом представлении сообщений, которые могут содержать несколько записей. У каждой записи есть заголовок, в котором находятся метаданные (тип, длина и т.д.), и информацию для отправки. Если вернуться к аналогии с параграфом, то параграф формируется из предложений, относящихся к одной теме, так и в NDEF-сообщениях — хорошо, когда все записи относятся к одной тематике.

NDEF-сообщения в основном короткие, каждый обмен состоит из одного сообщения, каждая метка также содержит одно сообщение. Так как обмен NFC данными происходит при касании одного устройства другим или меткой, то будет неудобно передавать в одном сообщении текст целой книги, поэтому длина NDEF-сообщения сопоставима с длиной абзаца, но не целой книги.

NDEF-запись содержит информацию для пересылки и метаданные, как эту информацию интерпретировать. Каждая запись может быть разного типа, о чем объявляется в заголовке этой записи. Также в заголовке описывается какое место занимает запись в сообщении, после заголовка следует информация. На рисунке ниже представлена полная информация о расположении бит и байт информации в NDEF-записи. Информация для пересылки занимает большую часть записи. Тип информации уточняет, как её интерпретировать, идентификатор информации опционален и используется для пересылки большого количества записей или перекрёстного обмена данными.

Какой длины может быть NDEF-сообщение?

Место на информацию в NDEF-записи ограниченно по размерам 2^32-1 байтами, однако можно делать цепочки записей внутри сообщения, чтобы переслать информацию большего размера. В теории нет ограничений на NDEF-сообщения, но на практике размер сообщения ограничивается возможностями устройств или меток, участвующих в обмене информацией. Если в обмене участвуют только устройства, то длина сообщения будет ограничена вычислительной мощностью самого слабого из устройств, но стоит учесть, что устройства придётся долго держать рядом для пересылки всех данных. При взаимодействии смартфона и карты длина сообщения будет ограничена размером памяти карты.

В общем, обмен данными через NFC достаточно быстрый. Человек подносит мобильное устройство к метке, происходит краткий обмен информацией, и человек идёт дальше. Данная технология не была спроектирована для длительных обменов информацией, потому что устройства в буквальном смысле должны находится в паре сантиметров друг от друга. Для того чтобы передать большой объем информации, устройства придётся держать друг рядом с другом длительное время, это может быть неудобным. Если нужно длительное взаимодействие между устройствами, то можно воспользоваться NFC для быстрого обмена данными о возможностях устройств и последующего включения одного из более подходящих способов передачи данных (Bluetooth, Wi-Fi и т.д.).

Читаем NDEF-сообщение

Когда телефон на Android считывает NFC-метку, он сначала её обрабатывает и распознает, а затем передаёт данные о ней в соответствующее приложение для последующего создания intent. Если с NFC может работать больше одного приложения, то появится меню выбора приложения. Система распознавания определяется тремя intent, которые перечислены в порядке важности от самой высокой до низкой:

  1. ACTION_NDEF_DISCOVERED: Этот intent используется для запуска аctivity, если в метке содержится NDEF-сообщение. Он имеет самый высокий приоритет, и система будет запускать его в первую очередь.
  2. ACTION_TECH_DISCOVERED: Если никаких activity для intent ACTION_NDEF_DISCOVERED не зарегистрировано, то система распознавания попробует запустить приложение с этим intent. Также этот intent будет сразу запущен, если найденное NDEF-сообщение не подходит под MIME-тип или URI, или метка совсем не содержит сообщения.
  3. ACTION_TAG_DISCOVERED: Этот intent будет запущен, если два предыдущих intent не сработали.

В общем случае система распознавания работает, как представлено на рисунке ниже.

Когда это возможно, запускается intent ACTION_NDEF_DISCOVERED, потому что он наиболее специфичный из трёх. Более того, с его помощью можно будет запустить ваше приложение.

Если activity запускается из-за NFC intent, то можно получить информацию с отсканированной NFC-метки из этого intent. Intent может содержать следующие дополнительные поля (зависит от типа отсканированной метки):

  • EXTRA_TAG (обязательное): объект Tag, описывающий отсканированную метку.
  • EXTRA_NDEF_MESSAGES (опциональное): Массив NDEF-сообщений, просчитанный с метки. Это дополнительное поле присуще только intent ACTION_NDEF_DISCOVERED.
  • EXTRA_ID (опциональное): Низкоуровневый идентификатор метки.

Ниже представлен пример, проверяющий intent ACTION_NDEF_DISCOVERED и получающий NDEF-сообщения из дополнительного поля.

override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) … if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages -> val messages: List = rawMessages.map { it as NdefMessage } // Обработка массива сообщений. … } } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); … if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMessages != null) { NdefMessage messages = new NdefMessage; for (int i = 0; i < rawMessages.length; i++) { messages = (NdefMessage) rawMessages; } // Обработка массива сообщений. … } } }

Также объект Tag можно получить из intent, который будет содержать полезную информацию и позволит перечислить технологии метки:

val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

Создаём распространённые NDEF-записи

Существует несколько методов для создания NDEF-записи: createUri(), createExternal() и createMime(). Лучше использовать один из них во избежание ошибок, которые могут возникнуть при создании записи вручную. Все примеры, представленные ниже, следует отправлять первым сообщением при записи метки, либо сопряжением с другим устройством.

TNF_ABSOLUTE_URI (тип URI, зависит от типа)

Создать NDEF-запись TNF_ABSOLUTE_URI можно следующим образом:

val uriRecord = ByteArray(0).let { emptyByteArray -> NdefRecord( TNF_ABSOLUTE_URI, «https://tproger.ru/category/news/».toByteArray(Charset.forName(«US-ASCII»)), emptyByteArray, emptyByteArray ) } NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , «https://tproger.ru/category/news/».getBytes(Charset.forName(«US-ASCII»)), new byte, new byte);

Intent-фильтр для такой NDEF-записи будет таким:

<intent-filter> <action android:name=»android.nfc.action.NDEF_DISCOVERED» /> <category android:name=»android.intent.category.DEFAULT» /> <data android:scheme=»https» android:host=»tproger.ru» android:pathPrefix=»/category/news/» /> </intent-filter>

TNF_MIME_MEDIA (MIME-тип, зависит от типа записи)

Создать NDEF-запись TNF_MIME_MEDIA можно следующим образом:

1. Используя метод createMime():

val mimeRecord = NdefRecord.createMime( «application/vnd.com.example.android.beam», «Beam me up, Android».toByteArray(Charset.forName(«US-ASCII»)) ) NdefRecord mimeRecord = NdefRecord.createMime(«application/vnd.com.example.android.beam», «Beam me up, Android».getBytes(Charset.forName(«US-ASCII»)));

2. Создав NdefRecord вручную:

val mimeRecord = Charset.forName(«US-ASCII»).let { usAscii -> NdefRecord( NdefRecord.TNF_MIME_MEDIA, «application/vnd.com.example.android.beam».toByteArray(usAscii), ByteArray(0), «Beam me up, Android!».toByteArray(usAscii) ) } NdefRecord mimeRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , «application/vnd.com.example.android.beam».getBytes(Charset.forName(«US-ASCII»)), new byte, «Beam me up, Android!».getBytes(Charset.forName(«US-ASCII»)));

Intent-фильтр для такой NDEF-записи будет таким:

<intent-filter> <action android:name=»android.nfc.action.NDEF_DISCOVERED» /> <category android:name=»android.intent.category.DEFAULT» /> <data android:mimeType=»application/vnd.com.example.android.beam» /> </intent-filter>

TNF_WELL_KNOWN с RTD_TEXT (MIME-тип с записью простого текста)

Создать NDEF-запись TNF_WELL_KNOWN можно следующим образом:

fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord { val langBytes = locale.language.toByteArray(Charset.forName(«US-ASCII»)) val utfEncoding = if (encodeInUtf8) Charset.forName(«UTF-8») else Charset.forName(«UTF-16») val textBytes = payload.toByteArray(utfEncoding) val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7 val status = (utfBit + langBytes.size).toChar() val data = ByteArray(1 + langBytes.size + textBytes.size) data = status.toByte() System.arraycopy(langBytes, 0, data, 1, langBytes.size) System.arraycopy(textBytes, 0, data, 1 + langBytes.size, textBytes.size) return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data) } public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) { byte langBytes = locale.getLanguage().getBytes(Charset.forName(«US-ASCII»)); Charset utfEncoding = encodeInUtf8 ? Charset.forName(«UTF-8») : Charset.forName(«UTF-16»); byte textBytes = payload.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte data = new byte; data = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte, data); return record; }

Intent-фильтр для такой NDEF-записи будет таким:

<intent-filter> <action android:name=»android.nfc.action.NDEF_DISCOVERED» /> <category android:name=»android.intent.category.DEFAULT» /> <data android:mimeType=»text/plain» /> </intent-filter>

TNF_WELL_KNOWN с RTD_URI (тип URI, базирующийся на полезной информации)

Создать NDEF-запись TNF_WELL_KNOWN можно следующим образом:

1. Используя метод createUri(String):

val rtdUriRecord1 = NdefRecord.createUri(«http://example.com»)

NdefRecord rtdUriRecord1 = NdefRecord.createUri(«http://example.com»);

2. Используя метод createUri(Uri):

val rtdUriRecord2 = Uri.parse(«http://example.com»).let { uri -> NdefRecord.createUri(uri) } Uri uri = Uri.parse(«http://example.com»); NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);

3. Создав NdefRecord вручную:

val uriField = «example.com».toByteArray(Charset.forName(«US-ASCII»)) val payload = ByteArray(uriField.size + 1) //добавление 1 для префикса URI payload = 0x01 //префикс http://www. к URI System.arraycopy(uriField, 0, payload, 1, uriField.size) //добавление URI к полезной информации val rtdUriRecord = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, ByteArray(0), payload) byte uriField = «example.com».getBytes(Charset.forName(«US-ASCII»)); byte payload = new byte; //добавление 1 для префикса URI payload = 0x01; //префикс http://www. к URI System.arraycopy(uriField, 0, payload, 1, uriField.length); //добавление URI к полезной информации NdefRecord rtdUriRecord = new NdefRecord( NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte, payload);

Intent-фильтр для такой NDEF-записи будет таким:

<intent-filter> <action android:name=»android.nfc.action.NDEF_DISCOVERED» /> <category android:name=»android.intent.category.DEFAULT» /> <data android:scheme=»http» android:host=»example.com» android:pathPrefix=»» /> </intent-filter>

Более подробно про работу с NDEF-записями на Android можно почитать .

Использование NFC

Есть множество возможностей использования NFC:

  • Режим эмуляции карты позволяет использовать данную технологию для бесконтактных платежей, например Google Wallet, или для оплаты или получения билетов в общественном транспорте.
  • Есть несколько мобильных приложений, которые позволяют сохранить настройки для мобильного устройства на метках и в дальнейшем использовать их для быстрого изменения каких-либо настроек мобильного устройства (переход в режим виброзвонка, включения или выключения Wi-Fi на мобильном устройстве).
  • На рынке постепенно появляются устройства, поддерживающие NFC, — стереосистемы, телевизоры, которые позволяют создавать пару с телефоном или планшетом для удалённого управления.
  • NFC используется в системе здравоохранения для хранения идентификатора пациента и личных записей.
  • В сфере управления материально-техническими ресурсами можно использовать NDEF записи для хранения информации о месте отправления товаров, об их прохождении различных промежуточных пунктов и тому подобном.

Технология NFC добавляет многообещающую функциональность к технологии RFID. Наиболее значимое нововведение — формат обмена данными NFC (NDEF), который предоставляет возможность форматировать обычные данные в одну из четырёх технологий меток NFC. NDEF может быть использован как для обмена данными между устройством и меткой, так и для обмена между устройствами. Это делает NFC пригодным не только как способ идентификации, но и как средство обмена короткими блоками данных.

Более подробно об NFC или NDEF можно почитать в книге Tom Igoe, Don Coleman, and Brian Jepson «Beginning NFC. Near Field Communication with Arduino, Android, and PhoneGap».

Смотрите также: 30 шикарных инструментов, чтобы писать под Android как профи

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Honor Cup, бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.