Разработка NFC-приложений под Android Михаил Дударев Licel, 2014 О нас • Михаил Дударев, работает с Java Security более 15 лет, основатель проекта jCardSim, Java Card симулятора, завоевавшего награду Duke's Choice Award 2013, со-основатель компании Licel. • Licel занимается созданием решений для защиты программного от нелегального использования и модификации третьими лицами для Java и Android платформ Краткое содержание • Немного о стандартах • NFC API Android • Пишем приложение BlackTag Близкие контакты третьей степени Что такое NFC ? • Near Field Communication – технология беспроводного высокочастотного взаимодействия малого радиуса действия • Основана на индукции магнитного поля • Поддерживаются устройства как с источником питания так и без него • Взаимодействие устанавливается в радиусе 10 см или при непосредственном контакте устройств Особенности NFC • Расширение стандарта RFID, позволяющее двухстороннее взаимодействие между устройствами • Обратная совместимость с ISO 14443 (бесконтактные смарткарты) • Работает на свободной по всему миру частоте 13.56 Mhz • Рабочая дистанция со стандартной компактной антенной до 10 см. • Скорость передачи данных 106,212 и 424 Кбит/с NFC Reader + NFC Tag Источник питания Радиомодуль Контроллер Контроллер Антенна NFC Reader (Смартфон) Память NFC Tag Схема взаимодействия Чтение/Запись Чтение/Запись Чтение/Запись Пассивный режим Активный режим Инициатор генерирует несущее электромагнитное поле, а отвечающее устройство отвечает модуляцией поля Оба устройства генерируют свои несущие поля, взаимодействие осуществляется путем наложения полей. При ожидании данных, устройство выключает свое поле Режимы работы Cчитывание/запись Устройство с поддержкой NFC может считывать/записывать данные на NFC-метку. Режимы работы P2P NFC-устройства могут обмениваться данными друг с другом Режимы работы Эмуляция карты NFC-устройство выступает в роли бесконтактной микропроцессорной карты Спецификации NFC NDEF Формат данных передаваемых между NFC устройствами и метками RTP Типы записей (Text, URI, Smart Poster, Generic Control, Signature) LLCP Протокол для P2P-взаимодействия Connection Handover Способ установления соединения через другие беспроводные технологии Tag Types (1/2/3/4) Типы NFC-меток NDEF NDEF-сообщение Запись 1 Запись 2 Заголовок Данные Идентификатор Длина Запись 3 Тип NDEF-сообщение с URI D1 01 0B 55 03 64 65 76 63 6F 6E 66 2E 72 75 Данные – http://devconf.ru ID сообщения Размер поля длины Длина данных – 11 байт Тип Данных – URI, 0x55 – ASCII код для ‘U’ NFC-метки Type I • Самые дешевые по цене – – – – – Основаны на стандарте ISO-14443A Поддерживают чтение/запись, пользователь может установить режим только чтение 96 байт памяти, расширяемой до 2Кб Скорость обмена данными 106Кбит/с Нет защиты от коллизии данных Type 2 • Аналогичны типу I и произошли от NXP/Phillips MIFARE Ultralight – – – – – Основаны на стандарте ISO-14443A Поддерживают чтение/запись, пользователь может установить режим только чтение 96 байт памяти, расширяемой до 2Кб Скорость обмена данными 106Кбит/с Защита от коллизии данных Type 3 • Произошли от Sony FeliCa меток, ГОРАЗДО дороже типов I и 2 – – – – – Основаны на японском стандарте JIS X 6319-5 При производстве задается режим доступа – только чтение/чтение-запись Объем памяти до 1Мб на сервис Скорость обмена 212 или 424 Кбит/с Защита от коллизии данных Type 4 • Аналогичны Type I и произошли от NXP DESFire – – – – – Основаны на стандарте ISO-14443A При производстве задается режим доступа – только чтение/чтение-запись Объем памяти до 32Кб на сервис Скорость обмена 106, 212 или 424 Кбит/с Защита от коллизии данных NFC API Android NFC на Android • При обнаружении другого NFC-устройства запускается служба маршрутизации меток • Служба маршрутизации меток получает данные от другого NFC устройства и выполняет необходимые действия для его обработки • Служба маршрутизации меток работает с Intent и Intent Filter NFC Чтение/Запись Activity I <Intent Filter> Служба маршрутизации Создание меток Intent NDEF Activity N <Intent Filter> Служба маршрутизации меток • ACTION_NDEF_DISCOVERED – используется для старта Activity в случае если метка содержащая NDEF-сообщение прочитано и содержит поддерживаемый тип данных, имеет приоритет перед другими intent • ACTION_TECH_DISCOVERED – если нет Activity с ACTION_NDEF_DISCOVERED запускается приложение с этим intent. Так же intent запускается если в NDEF-сообщении содержится незнакомый тип данных • ACTION_TAG_DISCOVERED – запускается, если нет Activity c ACTION_NDEF_DISCOVERED или ACTION_TECH_DISCOVERED Служба маршрутизации меток Служба маршрутизации меток Служба маршрутизации меток Чтение NDEF-сообщений <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="http" android:host=“devconf.ru” /> </intent-filter> Чтение NDEF-сообщений public void onResume() { super.onResume(); ... if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } } } Формирование NDEF-сообщений NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , "http://devconf.ru".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]); BlackTag • Вам надоело то, что ваши друзья во время вечеринок уделяют больше времени своему смартфону чем общению ? BlackTag (Идея) • Компания друзей собирается в кафе • На столе есть наклейки в виде NFC-меток для игры BlackTag • Когда смартфон кладется на NFC-метку, активируется приложение, которое отслеживает факт использования телефона или его удаление от метки • Если в течении заданного времени условие нарушается, проигравший выполняет штрафное задание, например покупает всем … КОФЕ BlackTag (Реализация) • • • • • Добавляем Intent на событие появления/удаления NFC-метки Обрабатываем содержимое NDEF-сообщения Авторизация через Facebook Таймер и наказания Прикручиваем BackEnd Вместо заключения