previous up next index search
Previous: 4.1.8.7 Беспроводные сети ZigBee и IEEE 802.15.4    UP: 4.1.8 Сети IEEE 802.11
    Next: 4.1.8.9 Широкополосные сети BGAN на основе спутников Inmarsat

4.1.8.8 NFC и беспроводные интерфейсы приложений

Семенов Ю.А. (ИТЭФ-МФТИ)
Yu. Semenov (ITEP-MIPT)

API бесконтактных коммуникаций
Анатомия бесконтактных коммуникаций API MIDlet
Использование API бесконтактных коммуникаций
API бесконтактных коммуникаций и обобщенная схема соединения
Выявление и прослушивание поддерживаемых объектов
Прослушивание специфических NDEF-объектов
Обработка NDEFMessages
Регистрация и обработка активности, сопряженной с эмуляцией карты
Использование PushRegistry для запуска NFC-приложений
Соображения безопасности
Ссылки

Технология NFC (Near-field Communication) предоставляет коротко диапазонные коммуникации с различными устройствами, в частности с мобильными телефонами. NFC может использоваться в качестве платежного средства.

NFC представляет собой стандарт, принятый NFC-форумом (2004 год), всемирным консорциумом разработчиков оборудования, программ/приложений, компаний - эмитентов кредитных карт, сервис-провайдеров и банковских работников (всего более 80 компаний и организаций). Смотри Near Field Communication), а также An Introduction to Near-Field Communication and the Бесконтактные коммуникации API, C. Enrique Ortiz, June 2008.

NFC — простое расширение стандарта ISO 14443, которое объединяет интерфейс и считыватель в одно устройство. NFC может поддерживать связь с существующими смарт-картами, считывающими устройствами стандарта ISO 14443, и другими устройствами NFC. Эта техника совместима с существующей инфраструктурой бесконтактных карт, уже использующейся в общественном транспорте и платежных системах. По сравнению с bluetooth стандарт NFC имеет существенно меньшее время установление соединения.

NFC работает на частоте 13.56 MHz (диапазон ISM (Industrial, Scientific and Medical radio Bands — Промышленные, научные и медицинские частоты) обеспечивает скорость передачи до 424 кбит/c. NFC-коммуникации запускаются, когда NFC-совместимые устройства оказываются на расстоянии около 4 см друг от друга. Так как расстояние минимально, утечка данных практически исключена. В NFC связь поддерживается за счет взаимной индукции рамочных антенн. Радио интерфейс для NFC стандартизирован в:

Максимальное рабочее расстояние для стандартных антенн не превышает 20 см, а скорость передачи данных может принимать значения 106, 212 или 424 кбит/сек.

Ниже в таблице проведено сравнение характеристик известных короткодиапазонных технологий:

Рис. 1. Сравнение NFC с другими корокодиапазонными коммуникационными технологиями (источник: NFC Forum)

RFID (Radio Frequency Identification) – радиочастотная идентификация

IrDa (Infrared Data Association) - инфракрасный порт передачи данных.

Сравнение NFC с другими технологиями показывает, что это самая короткодиапазонная техника, ориентированная на человека. Некоторые другие технологии имеют сходные параметры, например, RFID (Radio Frequency IDentification), но другие скорее являются дополняющими по отношению к NFC; к таким технологиям можно отнести Bluetooth и Infrared.

NFC стандарты/Стандарты ISO 14443 тип A и тип B + FeliCa представляют собой четыре части международного стандарта для бесконтактных платежных карт. Стандарт ISO 18092 определяет режимы работы интерфейса NFC и протокол.

Режимы NFC. NFC-форум определил три коммуникационных режима, как это показано ниже:

Рис. 2. Режимы работы NFC-коммуникаций (источник: NFC Forum)

где:

API бесконтактных коммуникаций

Java-спецификация API бесконтактных коммуникаций (Nokia) определена документами Java-сообщества JSR-257, которые фиксируют базовые функции бесконтактных коммуникаций. API состоит из пяти Java-пакетов:

Таблица 1 - Java-пакеты JSR 257

Java-пакетИнтерфейсыКлассыИсключения
javax.microedition.contactless
Обязательная часть пакета, которая содержит все общие функции и классы
TagConnection
TargetListener
TargetProperties
TransactionListener
DiscoveryManager
TargetType
ContactlessException
javax.microedition.contactless.ndef
Опциональный пакет для коммуникаций с форматами NDEF
NDEFRecordListener
NDEFTagConnection
NDEFMessage
NDEFRecord
NDEFRecordType
 
javax.microedition.contactless.rf
Опциональный пакет для коммуникаций с RFID (а не с форматами NDEF)
PlainTagConnection  
javax.microedition.contactless.sc
Опциональный пакет для коммуникаций с внешними смарт-картами
ISO14443Connection  
javax.microedition.contactless.visual
Опциональный пакет для чтения и генерации визуальных меток
ImageProperties
VisualTagConnection
SymbologyManagerVisualTagCodingException

* Note that the only mandatory package is javax.microedition.contactless.

API бесконтактных коммуникаций позволяет вам осуществлять выявление и обмен данными с бесконтактными объектами, такими как метки NDEF, RFID и внешние смарт-карты. API осуществляет также поддержку визуальных меток. На диаграмме ниже проиллюстрированы взаимоотношения между различными классами и интерфейсами API:

Рис. 3. Взаимодействие API бесконтактных коммуникаций (источник: спецификация JSR-257)

Анатомия бесконтактных коммуникаций API MIDlet

Рассмотрим элементы типового мобильного Java-приложения (MIDlet), которое использует принципы API беспроводных коммуникаций. Ниже представлена иллюстрация этого:

Рис. 4. Анатомия API бесконтактных коммуникаций, базирующихся на Java MIDlet (Источник: CEnriqueOrtiz.com)

Где мы имеем следующие типовые элементы:

Внешние читающие средстваЭлементы безопасности
В число внешних читающих устройств входят бесконтактные платежные считыватели торговых автоматов, билетные системы на транспорте, визуальные метки, такие как NFC, RFID и штриховые коды или смарт-картыЭлементы безопасности (SE) могут быть внутренними или внешними; примером элемента безопасности является смарт-карта, базирующаяся на Java. MIDlets может воспринимать элементы безопасности посредством служб безопасности и доверия API (SATSA), и/или бесконтактных коммуникаций API (JSR 257). Внешние системы считывания осуществляют доступ к внутренним элементам безопасности непосредственно через схему RFID (используя режим эмуляции карты).

Использование API бесконтактных коммуникаций

API бесконтактных коммуникаций позволяет вам выявлять и обмениваться данными через поддерживаемые бесконтактное радио и визуальные метки. Приложения, использующие API бесконтактных коммуникаций обычно следуют схеме, представленной ниже:

Рис. 5. Типовая блок-схема реализации приложения бесконтактных коммуникаций

где

  1. На первом этапе для приложения выясняется, какие типы объектов поддерживаются телефонной гарнитурой,
  2. Для каждого поддерживаемого типа приложение может регистрировать прослушивающее устройство, чтобы получить уведомление об активности. В качестве альтернативы, приложение может с помощью PushRegistry зарегистрировать активность объекта; поддерживаемыми активностями объекта является NDEF и элемент безопасности в режиме эмуляции карты,
  3. При приближении объектов они детектируются (выявляются), после чего активируются соответствующие считывающие средства. Альтернативой является активация MIDlet со стороны PushRegistry,
  4. Для каждого выявленного объекта приложение может выяснить его свойства,
  5. Приложение может установить соединение, читать, записывать и осуществлять информационный обмен с выявленным объектом,
  6. По завершении, с целью освобождения ресурсов, приложение закрывает любые установленные ранее соединения.

API бесконтактных коммуникаций и обобщенная схема соединения

API бесконтактных коммуникаций следующим образом расширяет общую схему соединения (GCF):

Рис. 6. API бесконтактных коммуникаций и общая схема соединения

API бесконтактных коммуникаций определяет следующие интерфейсы:

Выявление и прослушивание поддерживаемых объектов

Для выявления объектов, которые поддерживаются платформой, использовавшей метод DiscoveryManager.getSupportedTargetTypes(), который возвращает массив TargetTypes. Затем для каждого типа объекта регистрируется прослушивающее устройство объекта. Следующий фрагмент кода демонстрирует метод registerTargetListener(), который запрашивает платформу о поддерживаемых объектах, затем об объектах типа ISO 14443-4 (совместимых с бесконтактными смарт-картами), он регистрирует устройство прослушивания объекта:

Листинг 1 – Выявление объектов и их регистрация

import javax.microedition.contactless.TargetListener;
:
DiscoveryManager dm = DiscoveryManager.getInstance();
:
/**
 * Discover supported targets, registers listeners
 *
 * @param targetListener the target listener
 */
public void registerTargetListeners(TargetListener targetListener) {
    // Discover supported types
    TargetType[] tp = DiscoveryManager.getSupportedTargetTypes();
    try {
        // Register listener for each of the supported types
        for (int i=0; i<tp.length; i++) {
            if (tp[i].equals((TargetType.ISO14443_CARD))) {
                dm.addTargetListener(
                    targetListener, TargetType.ISO14443_CARD);
            } else...
               :
               :
            }
        }
    } catch (Exception e) {
        // ...
    }        
}

Заметим, что API бесконтактных коммуникаций определяют следующие типы объектов: ISO14443_CARD, NDEF_TAG, RFID_TAG и VISUAL_TAG.

Когда нужные объекты выявлены и соответствующие приемные устройства зарегистрированы, как это показано выше, программная реализация будет использовать метод TargetListener.targetDetected(TargetProperties[]), если детектирован новый объект:

Листинг 2 – Прослушивание приемных устройств зарегистрированных объектов

import javax.microedition.contactless.TargetListener;
:
/**
 * A new target has been detected. This method is invoked by
 * the platform.
 *
 * @param prop the properties for the detected target
 */
public void targetDetected(TargetProperties[] prop) {
    for (int i = 0; i < prop.length; i++) {
        // Get UID 
        String uid = prop[i].getUid();
        // Get Connection Classes
        Class[] classes = prop[i].getConnectionNames();
        // Get Target Types
        TargetType[] types = prop[i].getTargetTypes();
        // Connect to each Target
        String url = prop[i].getUrl();
        try {
            // Open NDEFTagConnection to the target
            NDEFTagConnection conn = 
                   (NDEFTagConnection) Connector.open(url);
            :
            :
        } catch (IOException e) {
            // ...
        }
    }
}

Метод targetDetected() обычно выполняет следующее:

Следует заметить, что чтение меток RFID требует понимания того, как работают команды ISO14443 I/O и ADPU.

Прослушивание специфических NDEF-объектов

API бесконтактных коммуникаций обеспечивает также распознавание специфических NDEF-объектов без детального знания каких-либо подробностей; единственно, что нужно знать, это тип записи (сообщения) и процедуру их обработки, это существенно упрощает логику коммуникаций информационного обмена. Чтобы прослушивать NDEF-объекты, используется интерфейс NDEFRecordListener и его метод recordDetected(NDEFMessage ndefMessage). Регистрация слушателя NDEF-записей осуществляется с привлечением метода addNDEFRecordListener(listener, recordType). Следующий фрагмент кода иллюстрирует это:

Листинг 3 – Листинг для объектов NDEF

import javax.microedition.contactless.ndef.NDEFRecordListener;
:
DiscoveryManager dm = DiscoveryManager.getInstance();
:
// Register NDEF_TAG target (smart poster) to discover
try {
    NDEFRecordType rt = new NDEFRecordType(
        NDEFRecordType.NFC_FORUM_RTD, "urn:nfc:wkt:Sp");             
    dm.addNDEFRecordListener(this, rt);
} catch (IllegalStateException e) {
    :
} catch (Exception e) {
    :
}

Ниже определены типы NDEF-записей:

Из спецификации JSR 257. Если формат имеет тип EMPTY или UNKNOWN имя должно иметь значение нуль. Типы имен записей NFC_FORUM_RTD и EXTERNAL_RTD должны следовать правилам, определенным в RTD- спецификации NFC-форума. Имя типа рекорда должно содержать только символы из набора US_ASCII.

Обработка NDEFMessages

Если NDEF-приемник зарегистрирован, платформа воспользуется методом recordDetected(NDEFMessage ndefMessage) для запрошенного NDEF, передавая в качестве аргумента сообщение NDEF для объекта NDEF, который становится активным и видимым. Метод recordDetected() получает запись, тип записи и другую информацию из NDEF-сообщения, и обрабатывает сообщение согласно его атрибутам.

Листинг 4 – Обработка сообщений NDEF-объектов

/**
 * Вызывается платформой, когда устройство бесконтактного объекта выявляет 
 * запрошенный тип рекорда NDEF.
 *
 * @param ndefMessage the NDEF message to process
 */
public void recordDetected(NDEFMessage ndefMessage) {
    // Get records and record types from NDEF Message
    NDEFRecordType[] rTypes = ndefMessage.getRecordTypes();
    NDEFRecord[] records = ndefMessage.getRecords();
    for (int i=0; i<records.length; i++) {
        // Handle data, based on type of NDEFMessage
        NDEFRecordType t = recordTypes[i];
        NDEFRecord r = records[i];
        byte[] id = r.getId();
        long len = r.getPayloadLength();
        byte[] p = r.getPayload();
        // Process the record
        // ...
    }    
}

Обработка тела сообщения будет зависеть от вашего приложения; например, после чтения URL, приложение может послать некоторую информацию этому URL, или возможно откроет этот URL на web-браузере.

Использование уведомлений об активности эмуляции карты

В режиме эмуляции карты, элемент безопасности прибора взаимодействует с внешним устройством чтения RFID. Приложения уведомляются о таких транзакциях, но не участвуют в них. Это проиллюстрировано ниже:

Рис. 7. Уведомления активности эмуляции карты

где

  1. Внутренний элемент безопасности взаимодействует с внешним устройством чтения,
  2. Приложение (MIDlet) уведомляется, когда детектировано внешнее устройство чтения,
  3. Если необходимо, приложение взаимодействует с элементом безопасности, используя API бесконтактных коммуникаций интерфейса ISO14443, или SATSA, если такое имеется.

Обмены между элементом безопасности и внешним считывателем открыты для приложения, и происходят с использованием APDU-команд, точно также как Java-карты взаимодействуют с внешними читающими устройствами. Более подробную информацию можно найти в “An Introduction to Java Card Technology - Part 1” (ниже в разделе «Источники”). Заметим, что коммуникации между приложением и безопасным элементом требуют знания специальных безопасных апплетов, используемых в безопасном элементе. APDU-команды определены в спецификации ISO7816-4.

На следующей диаграмме, взятой из статьи “An Introduction to Java Card Technology - Part 1”, иллюстрирует типовое взаимодействие приложения Java-карты (в этом случае MIDlet играет роль считывателя), и элементов безопасности (играющих роль "стороны карты"):

Рис. 8. Типовые элементы приложения для Java-карты. Прикладные сценарии бесконтактных коммуникаций (Источник: CEnriqueOrtiz.com)

где:

Регистрация и обработка активности, сопряженной с эмуляцией карты

Как было отмечено выше, в случае режима эмуляции карты, приложения могут уведомляться о том, что детектировано внешний считыватель, но само приложение не участвует в транзакциях. Кроме того, если необходимо, приложение осуществляет обмены с элементом безопасности, используя команды APDU, и для этой цели приложение должно знать об апплетах, работающих в элементе безопасности. Чтобы регистрировать уведомления активности эмуляции карты используются интерфейс javax.microedition.contactless.TransactionListener и его метод externalReaderDetected(byte slot). Регистрация транзакции прослушивателя выполняется путем вызова метода dm.addTransactionListener(...). Ниже приведенный фрагмент кода иллюстрирует это:

Листинг 5 – Регистрация и обработка активности, сопряженной с эмуляцией карты

import javax.microedition.contactless.TransactionListener;
:
:
// Register Transaction Listener
try {
    dm.addTransactionListener(this);
} catch (IllegalStateException e) {
    ...
} catch (Exception e) {
    ...
}
:
:
/**
 * Called by the platform, when a card emulation event 
 * has happened on the RFID hardware.
 *
 * @param slot is the slot needed to open the APDUConnection defined 
 *             in JSR 177 to the external secure element, may be 
 *             UNKNOWN_SLOT constant defined in this interface, if the 
 *             slot can not be identified.
 */
public void externalReaderDetected(byte slot) {

    // Based on slot number above, using ISO14443Connection or SATSA 
    // connect to applet, query applet, update screen, etc.
    ...
}

Для получения более детальной информации о Java-карте и SATSA, смотри раздел Ресурсы в конце данной статьи.

Использование PushRegistry для запуска NFC-приложений

Автоматическая активация приложения является важным моментом реализации доступа для приложений, базирующихся на NFC, в случае приближения или прикосновения к считывающему NFC-устройству. Система PushRegistry, которая является частью MIDP (Mobile Information Device Profile), осуществляет автоматический запуск приложения. Заметим, что API бесконтактных коммуникаций расширяет возможности PushRegistry для запуска приложения только для 1) типов рекордов NDEF и 2) для элементов безопасности (активности) коммуникаций режима эмуляции карты.

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