NFC 控制器接口 (NCI) 用于与 NFC 控制器 (NFCC) 交互。本页介绍了 Android 专有 NCI 命令的规范。
NCI 定义
Android 专有 NCI 命令使用专有群组 ID (GID) 0xF
和 Android 操作码标识符 (OID) 代码空间 0xC
。
通用数据包格式
Android NCI 数据包格式遵循使用专有 Group_ID 0xF
和 Opcode_ID 0x0C
的控制数据包的 NCI 规范。对于每个 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 操作码标识符。以下各部分介绍了每种数据包的规范。
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_NTF
和 NCI_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 | 观察模式已启用 |