Интерфейс контроллера NFC (NCI) используется для взаимодействия с контроллером NFC (NFCC). На этой странице описаны спецификации проприетарных команд NCI для Android.
Определения NCI
В собственных командах NCI для Android используется собственный идентификатор группы (GID) 0xF
и пространство кода идентификатора кода операции (OID) Android 0xC.
Общий формат пакета
Формат пакетов Android NCI соответствует спецификации NCI для пакетов управления, в которых используются проприетарные Group_ID 0xF и Opcode_ID 0x0C. Для каждого проприетарного сообщения Android первый байт полезной нагрузки пакета должен быть установлен в операционный код Android (0x0C). Пакеты управления Android используют Message_Type и PBF для идентификации команд, ответов и уведомлений аналогично стандартным командам.
Формат пакета Android приведен в таблице ниже.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Message_Type
|
PBF
|
Group_ID = 0xF (PROPRIETARY)
|
|||||
| зарезервировано для будущего использования (RFU); | Opcode_ID = 0x0C (ANDROID)
|
||||||
Payload_Length
|
|||||||
Android_Opcode_ID
|
|||||||
Android_Payload
|
|||||||
Назначенные идентификаторы кодов операций Android перечислены в таблице ниже. Спецификации для каждого пакета приведены в следующих разделах.
Команда Get capabilities
Хост использует NCI_ANDROID_GET_CAPS_CMD, чтобы запросить список функций Android, поддерживаемых NFCC. Команда NCI_ANDROID_GET_CAPS_CMD не принимает никаких параметров.
Контроллер NFC должен ответить сообщением NCI_ANDROID_GET_CAPS_RSP со статусом STATUS_OK и списком поддерживаемых возможностей и функций.
Если NFCC не поддерживает NCI_ANDROID_GET_CAPS_CMD, хост должен считать, что возможности принимают значение по умолчанию. Если в ответе NFCC нет определенной функции, хост должен считать, что у нее значение по умолчанию.
NCI_ANDROID_GET_CAPS_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Н/Д | 0 октетов | ||||||
NCI_ANDROID_GET_CAPS_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Статус | 1 октет | Коды статусов приведены в таблице 140 спецификации NCI. | |||||
Android_Version
|
2 октета | Определяет версию требований Android, реализованную NFCC. | |||||
| 0x0000 | Android 15 | ||||||
| Количество функций | 1 октет | Количество поддерживаемых функций (n). | |||||
| Capabilities[0..n] | (m + 2) * n октетов | Поддерживаемые функции | |||||
| Тип | 1 октет | Идентификатор функции. | |||||
| Лен | 1 октет | Длина значения (м) | |||||
| Значение | m октетов | Значение возможности | |||||
Собственные возможности Android
| Название возможности | ID | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|---|
| Режим наблюдения | 0x00 | 1 октет | Поддержка режима наблюдения.
0x00 (по умолчанию) – функция не поддерживается. 0x01 – поддерживает функцию с деактивацией радиочастот от хоста (требуется для Android 15). 0x02 – поддерживает функцию без деактивации радиочастоты со стороны хоста (требуется для Android 16 и более поздних версий). Все остальные значения зарезервированы для использования в будущем. |
|||||
| Уведомление о фрейме опроса | 0x01 | 1 октет | Поддержка уведомлений о фреймах опроса. 0x01, если поддерживается, 0x00 (по умолчанию), если не поддерживается. Все остальные значения зарезервированы для будущего использования. | |||||
| Режим энергосбережения | 0x02 | 1 октет | Поддержка режима энергосбережения. 0x01, если поддерживается, 0x00 (по умолчанию), если не поддерживается. Все остальные значения зарезервированы для будущего использования. | |||||
| Фильтр цикла опроса Auotransact | 0x03 | 1 октет | Поддержка фильтров цикла опроса во встроенном ПО, чтобы обходить режим наблюдения для определенных шаблонов, когда он включен глобально.
0x00 (по умолчанию) – функция не поддерживается. 0x01 – поддерживаются фильтры цикла опроса. Все остальные значения зарезервированы для будущего использования. |
|||||
| Количество поддерживаемых записей о кадрах выхода | 0x04 | 1 октет | Количество поддерживаемых записей фреймов выхода. Требуется не менее пяти записей для конечного кадра. | |||||
| Аннотация в режиме чтения | 0x05 | 1 октет | Поддержка аннотаций в режиме чтения.
0x00 (по умолчанию) – функция не поддерживается. 0x01 – поддерживает эту функцию. Все остальные значения зарезервированы для использования в будущем. |
|||||
| 0x06..0xFF | 0 октетов | Зарезервировано для будущего использования | ||||||
Команда энергосбережения
Чтобы перевести NFCC в режим энергосбережения, хост может использовать команду NCI_ANDROID_POWER_SAVING_CMD. NFCC должен ответить кодом NCI_ANDROID_POWER_SAVING_RSP со статусом, указывающим на успех или неудачу.
В режиме энергосбережения хост не должен отправлять NFCC никаких команд, а NFCC не должен отправлять хосту никаких уведомлений или ответов. NFCC или встроенный защищенный элемент (eSE) могут автоматически принимать входящие запросы на оплату в соответствии с конфигурацией маршрутизации, заданной до включения режима энергосбережения.
Чтобы вернуться в режим полной мощности, хост может сбросить или повторно инициализировать NFCC.
NCI_ANDROID_POWER_SAVING_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Режим энергосбережения | 1 октет | 0x00 | Как отключить режим энергосбережения |
| 0x01 | Включить режим энергосбережения |
NCI_ANDROID_POWER_SAVING_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |||||
Команда для настройки режима наблюдения
Чтобы включить или отключить режим наблюдателя, организатор может использовать команду NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD. NFCC должен ответить NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP с кодом статуса, указывающим на успех или неудачу.
Если режим наблюдения отключен, NFCC должен реализовать стандартный режим прослушивания в соответствии с техническими спецификациями действий.
Когда режим наблюдения активен, NFCC не должен отвечать на запросы опроса во время цикла опроса в режиме прослушивания, пока не получит явное разрешение от хоста.
При обнаружении активации поля контроллер NFCC должен отправить уведомление RF_FIELD_INFO_NTF (как определено в разделе 5.3 спецификации NCI). Если обнаружение в режиме опроса активно, NFCC должен реализовать активность в режиме опроса в соответствии с технической спецификацией активности.
Контроллер NFC может кэшировать информацию опроса, чтобы сразу же активировать устройство после отключения режима наблюдения.
Контроллер NFCC должен отключить режим наблюдения, если хост по какой-либо причине выключается (например, из-за разряженной батареи или по инициативе пользователя), чтобы транзакции SE могли продолжаться.
NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| режим наблюдения | 1 октет | 0x00 | Отключить режим наблюдателя (по умолчанию) |
| 0x01 | Включить режим наблюдения |
NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |||||
Уведомление о цикле опроса
NFCC должен отправлять уведомление NCI_ANDROID_POLLING_FRAME_NTF хосту после каждого кадра цикла опроса. Если генерируются уведомления RF_FIELD_INFO_NTF и NCI_ANDROID_POLLING_FRAME_NTF, NFCC должен отправить NCI_ANDROID_POLLING_FRAME_NTF после RF_FIELD_INFO_NTF.
Уведомление NCI_ANDROID_POLLING_FRAME_NTF должно появляться только в режиме наблюдения. Когда активен режим наблюдения, NFCC всегда должен отправлять уведомление NCI_ANDROID_POLLING_FRAME_NTF, прежде чем продолжить транзакцию.
NCI_ANDROID_POLLING_FRAME_NTF
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Polling Data[0..n] | (m + 3) * n октетов | Список запросов на опрос, полученных с момента последнего уведомления. Для каждого результата указывается тип (технология) полученных запросов и идентифицируемые данные из запроса в зависимости от технологии. | |||||
| Тип | 1 октет | Подробнее о типах фреймов… | |||||
| Флаги | 1 октет | См. байт флага. | |||||
| Длина | 1 октет | Длина (в метрах) отчета о данных опроса, включая поля временной метки и усиления. | |||||
| Временная метка | 4 октета | Временная метка в миллисекундах, указывающая, когда был получен запрос на опрос. Порядок байтов – от старшего к младшему. | |||||
| Рост | 1 октет | Сила запроса на опрос.
0xFF означает, что значение недоступно. |
|||||
| Данные | m – 5 октетов | Возвращает идентифицируемые данные, присутствующие в запросе на опрос. | |||||
Типы кадров
| Фрейм опроса | Тип | Размер | Значение/описание | |
|---|---|---|---|---|
| Удаленное поле | 0x00 | 1 октет | 0x00 | Поле выключено |
| 0x01 | Поле "Включено" | |||
| 0x02..0xFF | RFU | |||
| NFC-A | 0x01 | n октетов | Значение должно содержать команду ISO 14443-3 (например, REQ или WUP). | |
| NFC-B | 0x02 | n октетов | Значение должно включать байт AIF и команду ISO 14443-3 (например, REQ или WUP). | |
| NFC-F | 0x03 | n октетов | Значение должно содержать команду JIS X 6319-4. | |
| NFC-V | 0x04 | n октетов | Значение должно содержать команду ISO 15693. | |
| Неизвестно | 0x07 | n октетов | Необработанные данные кадров | |
Определение байта флагов
| Флаги | ||||||||
|---|---|---|---|---|---|---|---|---|
| b0 | b1 | b2 | b3 | Б4 | b5 | b6 | b7 | |
| 0 | Короткий кадр | RFU | RFU | RFU | RFU | RFU | RFU | RFU |
| 1 | Длинный фрейм | |||||||
Команда запроса статуса режима наблюдения
Чтобы узнать текущий статус пассивного режима заказа, ведущий может использовать команду NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_CMD. NFCC должен ответить кодом NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_RSP со статусом, указывающим на успех или неудачу.
NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Н/Д | 0 октетов | ||||||
NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |
| Маска технологии | 1 октет | Битовая маска, указывающая, для каких технологий включен режим наблюдения:
|
|
Команда для настройки технологий пассивного наблюдения
Чтобы задать технологии пассивного наблюдения, организатор может использовать команду NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH_CMD. Эта команда включает или отключает режим наблюдения для указанных технологий без необходимости использовать RF_DEACTIVATE_CMD. NFCC должен ответить кодом NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH_RSP со статусом, указывающим на успех или неудачу.
NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Маска технологии | 1 октет | Битовая маска, указывающая, для каких технологий нужно включить режим наблюдения:
|
|||||
NCI_ANDROID_SET_PASSIVE_OBSERVER_TECH_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статусов приведены в таблице 140 спецификации NCI. | |
Как задать команду для выхода пассивного наблюдателя
Чтобы настроить таблицу кадров выхода из режима наблюдения, хост может использовать команду NCI_ANDROID_SET_PASSIVE_OBSERVER_EXIT_FRAME_CMD. Эта команда указывает, какие радиочастотные кадры должны вызвать выход из режима наблюдения. Эту команду можно отправить только в RFST_IDLE. NFCC должен ответить NCI_ANDROID_SET_PASSIVE_OBSERVER_EXIT_FRAME_RSP с кодом статуса, указывающим на успешное или неудачное выполнение.
NCI_ANDROID_SET_PASSIVE_OBSERVER_EXIT_FRAME_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Ещё | 1 октет | 0x00 – последнее сообщение 0x01 – за этим сообщением последуют другие |
|||||
| Время ожидания | 2 октета | Время ожидания в миллисекундах для восстановления режима наблюдения (little endian). | |||||
| Количество записей RF Frame | 1 октет | Количество полей записи RF Frame (n). 0x00 сбрасывает таблицу. | |||||
| RF Frame entry [0..n] | (2+x)*n октетов | ||||||
| Qualifier-Type | 1 октет | Определяет тип кадра и параметры сопоставления. | |||||
| Длина значения | 1 октет | Длина поля "Значение" – x. | |||||
| Значение | x октетов | Power State (1), Reference Data (n), Mask (n). 1 <= n <= 16. | |||||
NCI_ANDROID_SET_PASSIVE_OBSERVER_EXIT_FRAME_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |
Получить команду выхода из кадра пассивного наблюдателя
Чтобы получить текущую конфигурацию таблицы выходных кадров режима наблюдения, хост может использовать команду NCI_ANDROID_GET_PASSIVE_OBSERVER_EXIT_FRAME_CMD. NFCC должен ответить NCI_ANDROID_GET_PASSIVE_OBSERVER_EXIT_FRAME_RSP, а затем NCI_ANDROID_GET_PASSIVE_OBSERVER_EXIT_FRAME_NTF.
NCI_ANDROID_GET_PASSIVE_OBSERVER_EXIT_FRAME_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Н/Д | 0 октетов | ||||||
NCI_ANDROID_GET_PASSIVE_OBSERVER_EXIT_FRAME_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |
NCI_ANDROID_GET_PASSIVE_OBSERVER_EXIT_FRAME_NTF
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Количество записей о выходе из режима наблюдения | 1 октет | Количество полей для ввода кадров выхода из режима наблюдения (n). | |
| Запись [0..n] | x+2 октета | Qualifier-Type (1), Length (1), Value (x). | |
Пустая команда NCI
Чтобы очистить NCI, хост может использовать команду NCI_ANDROID_BLANK_NCI_CMD. NFCC должен ответить кодом статуса NCI_ANDROID_BLANK_NCI_RSP, указывающим на успешное или неудачное выполнение.
NCI_ANDROID_BLANK_NCI_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Длина рамы | 1 октет | Длина данных кадра | |||||
| Данные фрейма | n октетов | Данные кадра | |||||
NCI_ANDROID_BLANK_NCI_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |
Как задать команду аннотации для цикла опроса
Чтобы задать аннотацию цикла опроса, хост может использовать команду NCI_ANDROID_SET_POLLING_LOOP_ANNOTATION_CMD для заполнения таблицы фреймов опроса. В этой таблице определяются специальные радиочастотные фреймы, которые будут вставлены в стандартный цикл обнаружения. Эту команду можно отправить только в RFST_IDLE. Контроллер NFCC должен ответить на команду NCI_ANDROID_SET_POLLING_LOOP_ANNOTATION_RSP кодом статуса, указывающим на успешное или неуспешное выполнение.
NCI_ANDROID_SET_POLLING_LOOP_ANNOTATION_CMD
| Поля полезной нагрузки | Размер | Значение/описание | ||
|---|---|---|---|---|
| Количество записей о радиочастотных кадрах | 1 октет | Количество записей, которые нужно отслеживать (n), от 0 до 4. Если n=0, функция отключена. | ||
| RF frame entry [1..n] | 2+x октетов | |||
| Qualifier-Type | 1 октет | Определяет тип кадра, технологию и позицию в цикле обнаружения. | ||
| Длина | 1 октет | Длина значения (x). | ||
| Значение | x октетов | Время ожидания (1 байт) и кадр RF (1–16 байтов). | ||
NCI_ANDROID_SET_POLLING_LOOP_ANNOTATION_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статусов приведены в таблице 140 спецификации NCI. | |
Команда запроса энергосбережения
Чтобы запросить режим энергосбережения, организатор может использовать команду NCI_ANDROID_QUERY_POWER_SAVING_CMD. NFCC должен ответить кодом статуса NCI_ANDROID_QUERY_POWER_SAVING_RSP, указывающим на успешное или неудачное выполнение операции.
NCI_ANDROID_QUERY_POWER_SAVING_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Н/Д | 0 октетов | ||||||
NCI_ANDROID_QUERY_POWER_SAVING_RSP
| Поля полезной нагрузки | Размер | Значение/описание | |
|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | |
Уведомление о приостановке пассивного наблюдателя
При обнаружении кадра выхода NFCC должен отправить хосту уведомление NCI_ANDROID_PASSIVE_OBSERVER_SUSPENDED_NTF, чтобы приостановить режим наблюдения.
NCI_ANDROID_PASSIVE_OBSERVER_SUSPENDED_NTF
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Тип | 1 октет | Тип кадра: 0x00 – тип A, 0x01 – тип B. | |||||
| Длина | 1 октет | Длина значения (n) | |||||
| Значение | n октетов | Получен кадр, соответствующий записи о кадре перехода. | |||||
Уведомление о возобновлении пассивного наблюдения
Когда пассивный наблюдатель возобновляет работу после тайм-аута или других условий, NFCC должен отправить хосту уведомление NCI_ANDROID_PASSIVE_OBSERVER_RESUMED_NTF.
NCI_ANDROID_PASSIVE_OBSERVER_RESUMED_NTF
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Н/Д | 0 октетов | ||||||
Как получить команду для аннотации опроса
Чтобы прочитать таблицу настраиваемых кадров опроса NFCC, хост может использовать команду NCI_ANDROID_GET_POLLING_LOOP_ANNOTATION_CMD. Эту команду можно отправить только в RFST_IDLE. Контроллер NFC должен ответить сообщением NCI_ANDROID_GET_POLLING_LOOP_ANNOTATION_RSP с кодом статуса, указывающим на успех или неудачу, и информацией о пользовательском фрейме опроса.
NCI_ANDROID_GET_POLLING_LOOP_ANNOTATION_CMD
| Поля полезной нагрузки | Размер | Значение/описание | |||||
|---|---|---|---|---|---|---|---|
| Н/Д | 0 октетов | ||||||
NCI_ANDROID_GET_POLLING_LOOP_ANNOTATION_RSP
| Поля полезной нагрузки | Размер | Значение/описание | ||
|---|---|---|---|---|
| Статус | 1 октет | Коды статуса приведены в таблице 140 спецификации NCI. | ||
| Количество записей о радиочастотных кадрах | 1 октет | Количество записей, которые нужно отслеживать (n), от 0 до 4. Если n=0, функция отключена. | ||
| RF frame entry [1..n] | 2+x октетов | Qualifier-Type | 1 октет | Определяет тип кадра, технологию и позицию в цикле обнаружения. |
| Длина | 1 октет | Длина значения (x). | ||
| Значение | x октетов | Время ожидания (1 байт) и кадр RF (1–16 байтов). | ||
Реализация
Примеры реализации: