Android 专有 NCI 命令

NFC 控制器接口 (NCI) 用于与 NFC 控制器 (NFCC) 交互。本页介绍了 Android 专有 NCI 命令的规范。

NCI 定义

Android 专有 NCI 命令使用专有群组 ID (GID) 0xF 和 Android 操作码标识符 (OID) 代码空间 0xC

通用数据包格式

Android NCI 数据包格式遵循使用专有 Group_ID 0xFOpcode_ID 0x0C 的控制数据包的 NCI 规范。对于每个 Android 专有消息,数据包载荷的第一个字节必须设置为 Android 操作码 (0x0C)。Android 控制数据包使用 Message_TypePBF 来标识命令、响应和通知,与标准命令类似。

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 操作码标识符。以下各部分介绍了每种数据包的规范。

Android OID 消息类型 消息名称
0x00 NCI_MT_CMD NCI_ANDROID_GET_CAPS_CMD
NCI_MT_RSP NCI_ANDROID_GET_CAPS_RSP
0x01 NCI_MT_CMD NCI_ANDROID_POWER_SAVING_CMD
NCI_MT_RSP NCI_ANDROID_POWER_SAVING_RSP
0x02 NCI_MT_CMD NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD
NCI_MT_RSP NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP
0x03 NCI_MT_NTF NCI_ANDROID_POLLING_FRAME_NTF
0x04 NCI_MT_CMD NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_CMD
NCI_MT_RSP NCI_ANDROID_QUERY_PASSIVE_OBSERVER_STATUS_RSP

获取 capability 命令

主机使用 NCI_ANDROID_GET_CAPS_CMD 查询 NFCC 支持的 Android 专有功能的列表。NCI_ANDROID_GET_CAPS_CMD 命令不接受任何参数。

NFCC 必须以 NCI_ANDROID_GET_CAPS_RSP 响应进行响应,相应状态应为 STATUS_OK 并提供受支持功能和特性的列表。

如果 NFCC 不支持 NCI_ANDROID_GET_CAPS_CMD,主机必须假定各项 capability 都采用默认指定值。如果 NFCC 未在响应中返回指定的 capability,则主机必须假定该 capability 具有默认指定值。

NCI_ANDROID_GET_CAPS_CMD

载荷字段 大小 值/说明
0 个八位字节

NCI_ANDROID_GET_CAPS_RSP

载荷字段 大小 值/说明
状态 1 个八位字节 请参阅 NCI 规范的表 140 中的状态代码。
Android_Version 2 个八位字节 标识 NFCC 实现的 Android 要求的版本。
0x0000 Android 15
capability 数量 1 个八位字节 支持的 capability 数量 (n)
capability [0..n] (m + 2) * n 个八位字节 支持的 capability
类型 1 个八位字节 capability 的标识符
长度 1 个八位字节 值的长度 (m)
m 个八位字节 capability 的值
Android 专有 capability
capability 名称 ID 大小 值/说明
观察模式 0x00 1 个八位字节 支持观察模式。
0x00(默认)- 不支持此功能。
0x01 - 支持通过主机停用射频的功能(对于 Android 15 或更高版本是必需的)。
所有其他值均为 RFU。
轮询帧通知 0x01 1 个八位字节 支持轮询帧通知。如果支持,则为 0x01;如果不支持,则为 0x00(默认)。所有其他值均为 RFU。
节能模式 0x02 1 个八位字节 支持节能模式。如果支持,则为 0x01;如果不支持,则为 0x00(默认)。所有其他值均为 RFU。
Auotransact 轮询循环过滤器 0x03 1 个八位字节 支持在固件中轮询循环过滤器,以便在观察模式全局启用时针对特定模式绕过观察模式。
0x00(默认)- 不支持此功能
0x01 - 支持轮询循环过滤器
所有其他值均为 RFU
0x04..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 个八位字节 请参阅 NCI 规范的表 140 中的状态代码,

设置观察模式命令

如要启用或停用观察模式,主机可以使用 NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD 命令。NFCC 必须以 NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP 进行响应,用状态代码指示成功或失败。

当观察模式已停用时,NFCC 必须按照 activity 技术规范实现标准监听模式 activity。

在观察模式已启用时,NFCC 不得在监听模式的轮询循环期间响应任何轮询请求,除非获得主机的明确授权。NFCC 在检测到射频场激活时,必须发送 RF_FIELD_INFO_NTF 通知(如 NCI 规范第 5.3 节所定义)。如果轮询模式发现功能已启用,NFCC 必须按照 activity 技术规范实现轮询模式 activity。NFCC 可以缓存轮询信息,以便在观察模式停用后立即继续进行设备激活。

如果主机因任何原因(例如电池电量耗尽或用户发起关机)而关机,NFCC 应关闭观察模式,以便 SE 事务可以继续进行。

NCI_ANDROID_PASSIVE_OBSERVE_MODE_CMD

载荷字段 大小 值/说明
观察模式 1 个八位字节 0x00 停用观察模式(默认)
0x01 启用观察模式

NCI_ANDROID_PASSIVE_OBSERVE_MODE_RSP

载荷字段 大小 值/说明
状态 1 个八位字节 请参阅 NCI 规范的表 140 中的状态代码。

轮询循环通知

NFCC 必须在发出每个轮询循环帧后向主机发送 NCI_ANDROID_POLLING_FRAME_NTF 通知。当同时生成 RF_FIELD_INFO_NTFNCI_ANDROID_POLLING_FRAME_NTF 通知时,NFCC 必须在 RF_FIELD_INFO_NTF 之后发送 NCI_ANDROID_POLLING_FRAME_NTF

NCI_ANDROID_POLLING_FRAME_NTF 通知与观察模式启用与否无关。当观察模式已启用时,NFCC 必须始终先发送 NCI_ANDROID_POLLING_FRAME_NTF 通知,然后再继续进行事务。

NCI_ANDROID_POLLING_FRAME_NTF

载荷字段 大小 值/说明
轮询数据 [0..n] (m + 3) * n 个八位字节 自上次通知以来收到的轮询请求的列表。每项结果都会提供所收到请求的类型(技术)和请求中可识别的数据(具体取决于相关技术)。
类型 1 个八位字节 请参阅帧类型
标志 1 个八位字节 请参阅标志字节
长度 1 个八位字节 轮询数据报告的长度 (m),包括时间戳和增益字段。
时间戳 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 个八位字节 值必须包含 ISO 14443-3 命令(例如 REQ 或 WUP)
NFC-V 0x04 n 个八位字节 值必须包含 ISO 14443-3 命令(例如 REQ 或 WUP)
未知 0x07 n 个八位字节 原始帧数据
标志字节定义
标志
b0 b1 b2 b3 b4 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 个八位字节 请参阅 NCI 规范的表 140 中的状态代码,
观察模式 1 个八位字节 0x00 观察模式已停用
0x01 观察模式已启用